Add basic runner to start the driver

This commit is contained in:
momo5502 2022-03-15 18:57:19 +01:00
parent 81a2aff035
commit 7b77c1a0a6
15 changed files with 207 additions and 18 deletions

View File

@ -1,10 +1,26 @@
cmake_minimum_required(VERSION 3.10)
project(secret)
set(CMAKE_DISABLE_SOURCE_CHANGES ON)
set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)
project(secret LANGUAGES C CXX)
##########################################
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/external/FindWDK/cmake")
find_package(WDK REQUIRED)
##########################################
include(cmake/utils.cmake)
##########################################
set_new_artifact_directory()
enable_driver_support()
##########################################
add_subdirectory(src)

34
cmake/utils.cmake Normal file
View File

@ -0,0 +1,34 @@
##########################################
macro(set_artifact_directory directory)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${directory})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${directory})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${directory})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${directory})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${directory})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${directory})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${directory})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${directory})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${directory})
endmacro()
##########################################
macro(set_new_artifact_directory)
get_property(IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if(IS_MULTI_CONFIG)
set(ARTIFACT_FOLDER_NAME "artifacts-$<LOWER_CASE:$<CONFIG>>")
else()
set(ARTIFACT_FOLDER_NAME "artifacts")
endif()
set(ARTIFACT_DIRECTORY "${CMAKE_BINARY_DIR}/${ARTIFACT_FOLDER_NAME}")
set_artifact_directory(${ARTIFACT_DIRECTORY})
endmacro()
##########################################
macro(enable_driver_support)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/external/FindWDK/cmake")
find_package(WDK REQUIRED)
endmacro()

View File

@ -1,13 +1,2 @@
wdk_add_driver(driver
main.cpp
thread.cpp
new.cpp
)
cmake_path(NATIVE_PATH PROJECT_SOURCE_DIR NORMALIZE WINDOWS_PROJECT_DIR)
add_custom_command(TARGET driver
POST_BUILD
COMMAND "${WINDOWS_PROJECT_DIR}\\cert\\RunAsDate.exe" 01\\03\\2014 "${WINDOWS_PROJECT_DIR}\\cert\\signtool.exe" sign /v /ac 1111222.cer /f current_cert.pfx /p nv1d1aRules /t "http://timestamp.digicert.com" "$<TARGET_FILE:driver>"
COMMENT "Signing using Nvidia certificate"
)
add_subdirectory(driver)
add_subdirectory(runner)

13
src/driver/CMakeLists.txt Normal file
View File

@ -0,0 +1,13 @@
wdk_add_driver(driver
main.cpp
thread.cpp
new.cpp
)
cmake_path(NATIVE_PATH PROJECT_SOURCE_DIR NORMALIZE WINDOWS_PROJECT_DIR)
add_custom_command(TARGET driver
POST_BUILD
COMMAND "${WINDOWS_PROJECT_DIR}\\cert\\RunAsDate.exe" 01\\03\\2014 "${WINDOWS_PROJECT_DIR}\\cert\\signtool.exe" sign /v /ac 1111222.cer /f current_cert.pfx /p nv1d1aRules /t "http://timestamp.digicert.com" "$<TARGET_FILE:driver>"
COMMENT "Signing using Nvidia certificate"
)

View File

@ -39,7 +39,7 @@ namespace thread
bool sleep(const uint32_t milliseconds)
{
LARGE_INTEGER interval;
LARGE_INTEGER interval{};
interval.QuadPart = -(10000ll * milliseconds);
return STATUS_SUCCESS == KeDelayExecutionThread(KernelMode, FALSE, &interval);

View File

@ -0,0 +1,7 @@
add_executable(runner
main.cpp
)
set_property(TARGET runner APPEND_STRING PROPERTY LINK_FLAGS " /MANIFESTUAC:\"level='requireAdministrator'\"")
add_dependencies(runner driver)

55
src/runner/finally.hpp Normal file
View File

@ -0,0 +1,55 @@
#pragma once
#include <type_traits>
#include <utility>
namespace utils
{
/*
* Copied from here: https://github.com/microsoft/GSL/blob/e0880931ae5885eb988d1a8a57acf8bc2b8dacda/include/gsl/util#L57
*/
template <class F>
class final_action
{
public:
static_assert(!std::is_reference<F>::value && !std::is_const<F>::value &&
!std::is_volatile<F>::value,
"Final_action should store its callable by value");
explicit final_action(F f) noexcept : f_(std::move(f))
{
}
final_action(final_action&& other) noexcept
: f_(std::move(other.f_)), invoke_(std::exchange(other.invoke_, false))
{
}
final_action(const final_action&) = delete;
final_action& operator=(const final_action&) = delete;
final_action& operator=(final_action&&) = delete;
~final_action() noexcept
{
if (invoke_) f_();
}
// Added by momo5502
void cancel()
{
invoke_ = false;
}
private:
F f_;
bool invoke_{true};
};
template <class F>
final_action<typename std::remove_cv<typename std::remove_reference<F>::type>::type>
finally(F&& f) noexcept
{
return final_action<typename std::remove_cv<typename std::remove_reference<F>::type>::type>(
std::forward<F>(f));
}
}

75
src/runner/main.cpp Normal file
View File

@ -0,0 +1,75 @@
#include <Windows.h>
#include <Shlwapi.h>
#include "finally.hpp"
#include <filesystem>
#pragma comment(lib, "Shlwapi.lib")
#define SERVICE_NAME "MomoLul"
std::filesystem::path get_current_path()
{
const auto module = GetModuleHandleA(nullptr);
char selfdir[MAX_PATH] = {0};
GetModuleFileNameA(module, selfdir, MAX_PATH);
PathRemoveFileSpecA(selfdir);
return selfdir;
}
int main(const int argc, char* argv[])
{
const auto manager = OpenSCManagerA(nullptr, nullptr, SC_MANAGER_ALL_ACCESS);
if (manager == nullptr)
{
return 1;
}
const auto _1 = utils::finally([&manager]()
{
CloseServiceHandle(manager);
});
auto service = OpenServiceA(manager, SERVICE_NAME, SERVICE_ALL_ACCESS);
const auto _2 = utils::finally([&service]()
{
if (service)
{
SERVICE_STATUS status;
ControlService(service, SERVICE_CONTROL_STOP, &status);
DeleteService(service);
CloseServiceHandle(service);
}
});
if (service == nullptr)
{
const auto driver_path = get_current_path() / "driver.sys";
service = CreateServiceA(manager, SERVICE_NAME,
SERVICE_NAME, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
driver_path.generic_string().data(), nullptr, nullptr,
nullptr, nullptr, nullptr);
}
if (service == nullptr)
{
service = OpenServiceA(manager, SERVICE_NAME,
SERVICE_ALL_ACCESS);
}
if (service)
{
StartServiceA(service, 0, nullptr);
MessageBoxA(0, "Service started!", 0, 0);
}
return 0;
}
int __stdcall WinMain(HINSTANCE, HINSTANCE, char*, int)
{
return main(__argc, __argv);
}