diff --git a/CMakeLists.txt b/CMakeLists.txt index 9d33261..b7ea411 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) +########################################## -add_subdirectory(src) \ No newline at end of file +include(cmake/utils.cmake) + +########################################## + +set_new_artifact_directory() +enable_driver_support() + +########################################## + +add_subdirectory(src) diff --git a/cmake/utils.cmake b/cmake/utils.cmake new file mode 100644 index 0000000..28bded3 --- /dev/null +++ b/cmake/utils.cmake @@ -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-$>") + 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() \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 666e26f..7f1e256 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -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" "$" - COMMENT "Signing using Nvidia certificate" -) +add_subdirectory(driver) +add_subdirectory(runner) \ No newline at end of file diff --git a/src/driver/CMakeLists.txt b/src/driver/CMakeLists.txt new file mode 100644 index 0000000..666e26f --- /dev/null +++ b/src/driver/CMakeLists.txt @@ -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" "$" + COMMENT "Signing using Nvidia certificate" +) diff --git a/src/logging.hpp b/src/driver/logging.hpp similarity index 100% rename from src/logging.hpp rename to src/driver/logging.hpp diff --git a/src/main.cpp b/src/driver/main.cpp similarity index 100% rename from src/main.cpp rename to src/driver/main.cpp diff --git a/src/new.cpp b/src/driver/new.cpp similarity index 100% rename from src/new.cpp rename to src/driver/new.cpp diff --git a/src/new.hpp b/src/driver/new.hpp similarity index 100% rename from src/new.hpp rename to src/driver/new.hpp diff --git a/src/nt_ext.hpp b/src/driver/nt_ext.hpp similarity index 100% rename from src/nt_ext.hpp rename to src/driver/nt_ext.hpp diff --git a/src/std_include.hpp b/src/driver/std_include.hpp similarity index 100% rename from src/std_include.hpp rename to src/driver/std_include.hpp diff --git a/src/thread.cpp b/src/driver/thread.cpp similarity index 97% rename from src/thread.cpp rename to src/driver/thread.cpp index 3acae45..a9e8492 100644 --- a/src/thread.cpp +++ b/src/driver/thread.cpp @@ -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); diff --git a/src/thread.hpp b/src/driver/thread.hpp similarity index 100% rename from src/thread.hpp rename to src/driver/thread.hpp diff --git a/src/runner/CMakeLists.txt b/src/runner/CMakeLists.txt new file mode 100644 index 0000000..5a6113d --- /dev/null +++ b/src/runner/CMakeLists.txt @@ -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) \ No newline at end of file diff --git a/src/runner/finally.hpp b/src/runner/finally.hpp new file mode 100644 index 0000000..69e448f --- /dev/null +++ b/src/runner/finally.hpp @@ -0,0 +1,55 @@ +#pragma once +#include +#include + +namespace utils +{ + /* + * Copied from here: https://github.com/microsoft/GSL/blob/e0880931ae5885eb988d1a8a57acf8bc2b8dacda/include/gsl/util#L57 + */ + + template + class final_action + { + public: + static_assert(!std::is_reference::value && !std::is_const::value && + !std::is_volatile::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 + final_action::type>::type> + finally(F&& f) noexcept + { + return final_action::type>::type>( + std::forward(f)); + } +} \ No newline at end of file diff --git a/src/runner/main.cpp b/src/runner/main.cpp new file mode 100644 index 0000000..058de4b --- /dev/null +++ b/src/runner/main.cpp @@ -0,0 +1,75 @@ +#include +#include +#include "finally.hpp" +#include + +#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); +}