diff --git a/KDemu/Elevator.cpp b/KDemu/Elevator.cpp new file mode 100644 index 0000000..73ad969 --- /dev/null +++ b/KDemu/Elevator.cpp @@ -0,0 +1,16 @@ +#include "Elevator.h" + +#include + +bool KDemu::Elevator::CanElevate() { + HANDLE hToken = nullptr; + TOKEN_ELEVATION_TYPE tokenType = TokenElevationTypeLimited; + if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS, + &hToken)) + return false; + DWORD len; + GetTokenInformation(hToken, TokenElevationType, &tokenType, + sizeof(TOKEN_ELEVATION_TYPE), &len); + CloseHandle(hToken); + return tokenType == TokenElevationTypeLimited; +} diff --git a/KDemu/Elevator.h b/KDemu/Elevator.h new file mode 100644 index 0000000..418e89c --- /dev/null +++ b/KDemu/Elevator.h @@ -0,0 +1,8 @@ +#pragma once + +namespace KDemu { + class Elevator { + public: + static bool CanElevate(); + }; +} diff --git a/KDemu/KDemu.cpp b/KDemu/KDemu.cpp index fe55f79..8166ff1 100644 --- a/KDemu/KDemu.cpp +++ b/KDemu/KDemu.cpp @@ -9,6 +9,8 @@ #include #include #include "UnicornEmu.hpp" +#include "Elevator.h" + void gdbServer(uc_engine* uc, uint64_t entry) { HMODULE hDll = LoadLibrary(TEXT("udbserver.dll")); if (!hDll) { @@ -180,6 +182,11 @@ void mainThread() { } int main(int argc, char** argv, char** envp) { + // Check if the program has all necessary privileges. + if (KDemu::Elevator::CanElevate()) { + std::cerr << "Please launch the program with administrator rights."; + return -1; + } PEloader& peLoader = PEloader::GetInstance(); peLoader.LoadDmp(); InitializeCriticalSection(&peLoader.cs); diff --git a/KDemu/KDemu.vcxproj b/KDemu/KDemu.vcxproj index bfcb8f3..ef63176 100644 --- a/KDemu/KDemu.vcxproj +++ b/KDemu/KDemu.vcxproj @@ -19,6 +19,7 @@ + @@ -27,6 +28,7 @@ + diff --git a/KDemu/KDemu.vcxproj.filters b/KDemu/KDemu.vcxproj.filters index f891f86..e073c99 100644 --- a/KDemu/KDemu.vcxproj.filters +++ b/KDemu/KDemu.vcxproj.filters @@ -20,6 +20,7 @@ + @@ -32,5 +33,8 @@ 標頭檔 + + 標頭檔 + \ No newline at end of file