Broihon

Untitled

Jan 2nd, 2017
677
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include "MemoryExt.h"
  2. #include <TlHelp32.h>
  3.  
  4. #ifdef UNICODE //Thanks, Bill
  5. #undef PROCESSENTRY32
  6. #undef Process32First
  7. #undef Process32Next
  8. #undef MODULEENTRY32
  9. #undef Module32First
  10. #undef Module32Next
  11. #endif
  12.  
  13. UINT_PTR GetDMA(HANDLE hProc, UINT_PTR BaseAddress, UINT_PTR * Offsets, UINT PointerLevel)
  14. {
  15.     if (!ReadProcessMemory(hProc, reinterpret_cast<void*>(BaseAddress), &BaseAddress, sizeof(BaseAddress), nullptr))
  16.         return 0;
  17.  
  18.     --PointerLevel;
  19.  
  20.     for (; PointerLevel; --PointerLevel, ++Offsets)
  21.         if (!ReadProcessMemory(hProc, reinterpret_cast<void*>(BaseAddress + *Offsets), &BaseAddress, sizeof(BaseAddress), nullptr) || !BaseAddress)
  22.             return 0;
  23.  
  24.     return (BaseAddress + *Offsets);
  25. }
  26.  
  27. bool SetDebugPrivilege(bool Enable)
  28. {
  29.     HANDLE hToken = nullptr;
  30.     if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken))
  31.         return false;
  32.  
  33.     TOKEN_PRIVILEGES TokenPrivileges = { 0 };
  34.     TokenPrivileges.PrivilegeCount = 1;
  35.     TokenPrivileges.Privileges[0].Attributes = Enable ? SE_PRIVILEGE_ENABLED : 0;
  36.  
  37.     if (!LookupPrivilegeValueA(nullptr, "SeDebugPrivilege", &TokenPrivileges.Privileges[0].Luid))
  38.     {
  39.         CloseHandle(hToken);
  40.         return false;
  41.     }
  42.  
  43.     if (!AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), nullptr, nullptr))
  44.     {
  45.         CloseHandle(hToken);
  46.         return false;
  47.     }
  48.  
  49.     CloseHandle(hToken);
  50.  
  51.     return true;
  52. }
  53.  
  54. bool IsValidHandle(HANDLE hObject)
  55. {
  56.     if (!hObject)
  57.         return false;
  58.  
  59.     DWORD dwFlags = 0;
  60.     if (!GetHandleInformation(hObject, &dwFlags))
  61.         return false;
  62.     return true;
  63. }
  64.  
  65. HANDLE GetProcessByNameA(const char * szProcess, DWORD Access)
  66. {
  67.     HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  68.     PROCESSENTRY32 PE32 = { 0 };
  69.     PE32.dwSize = sizeof(PROCESSENTRY32);
  70.  
  71.     if (!szProcess || !hSnap)
  72.         return nullptr;
  73.  
  74.     BOOL Ret = Process32First(hSnap, &PE32);
  75.     while (Ret)
  76.     {
  77.         if (!strcmp(szProcess, PE32.szExeFile))
  78.         {
  79.             CloseHandle(hSnap);
  80.             return OpenProcess(Access, FALSE, PE32.th32ProcessID);
  81.         }
  82.         Ret = Process32Next(hSnap, &PE32);
  83.     }
  84.  
  85.     CloseHandle(hSnap);
  86.  
  87.     return nullptr;
  88. }
  89.  
  90. HANDLE GetProcessByNameW(const wchar_t * szProcess, DWORD Access)
  91. {
  92.     HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  93.     PROCESSENTRY32W PE32 = { 0 };
  94.     PE32.dwSize = sizeof(PROCESSENTRY32W);
  95.  
  96.     if (!szProcess || !hSnap)
  97.         return nullptr;
  98.  
  99.     BOOL Ret = Process32FirstW(hSnap, &PE32);
  100.     while (Ret)
  101.     {
  102.         if (!wcscmp(szProcess, PE32.szExeFile))
  103.         {
  104.             CloseHandle(hSnap);
  105.             return OpenProcess(Access, FALSE, PE32.th32ProcessID);
  106.         }
  107.         Ret = Process32NextW(hSnap, &PE32);
  108.     }
  109.  
  110.     CloseHandle(hSnap);
  111.  
  112.     return nullptr;
  113. }
  114.  
  115. UINT_PTR GetModuleBaseA(const char * szModule, DWORD ProcID)
  116. {
  117.     HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcID);
  118.     MODULEENTRY32 ME32 = { 0 };
  119.     ME32.dwSize = sizeof(MODULEENTRY32);
  120.  
  121.     if (!szModule || !hSnap)
  122.         return 0;
  123.  
  124.     BOOL Ret = Module32First(hSnap, &ME32);
  125.     while (Ret)
  126.     {
  127.         if (ME32.th32ProcessID == ProcID && !strcmp(szModule, ME32.szModule))
  128.         {
  129.             CloseHandle(hSnap);
  130.             return reinterpret_cast<UINT_PTR>(ME32.hModule);
  131.         }
  132.         Ret = Module32Next(hSnap, &ME32);
  133.     }
  134.  
  135.     CloseHandle(hSnap);
  136.  
  137.     return 0;
  138. }
  139.  
  140. UINT_PTR GetModuleBaseW(const wchar_t * szModule, DWORD ProcID)
  141. {
  142.     HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcID);
  143.     MODULEENTRY32W ME32 = { 0 };
  144.     ME32.dwSize = sizeof(MODULEENTRY32W);
  145.  
  146.     if (!szModule || !hSnap)
  147.         return 0;
  148.  
  149.     BOOL Ret = Module32FirstW(hSnap, &ME32);
  150.     while (Ret)
  151.     {
  152.         if (ME32.th32ProcessID == ProcID && !wcscmp(szModule, ME32.szModule))
  153.         {
  154.             CloseHandle(hSnap);
  155.             return reinterpret_cast<UINT_PTR>(ME32.hModule);
  156.         }
  157.         Ret = Module32NextW(hSnap, &ME32);
  158.     }
  159.  
  160.     CloseHandle(hSnap);
  161.  
  162.     return 0;
  163. }
  164.  
  165. bool NopCode(HANDLE hProc, UINT_PTR Address, SIZE_T Size)
  166. {
  167.     BYTE * Nops = new BYTE[Size];
  168.     memset(Nops, 0x90, Size);
  169.     BOOL ret = WriteProcessMemory(hProc, reinterpret_cast<void*>(Address), Nops, Size, nullptr);
  170.     delete[] Nops;
  171.     return (ret == 1);
  172. }
  173.  
  174. ULONG_PTR GetThreadStartAddress(HANDLE hThread)
  175. {
  176.     if (!NT::Load())
  177.         return 0;
  178.  
  179.     ULONG_PTR ulStartAddress = 0;
  180.     NTSTATUS Ret = NT::NtQueryInformationThread(hThread, ThreadQuerySetWin32StartAddress, &ulStartAddress, sizeof(ULONG_PTR), nullptr);
  181.  
  182.     if (Ret < 0)
  183.         return 0;
  184.  
  185.     return ulStartAddress;
  186. }
Add Comment
Please, Sign In to add comment