Advertisement
ya_makaron

Untitled

Feb 13th, 2019
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.06 KB | None | 0 0
  1.  
  2. BOOL DataCompare(BYTE *data, BYTE *sign, char *mask)
  3. {
  4.     for (; *mask; mask++, sign++, data++) {
  5.         if (*mask == 'x' && *data != *sign) return FALSE;
  6.     }
  7.  
  8.     return (*mask) == NULL;
  9. }
  10.  
  11. DWORD ScanSignature(DWORD addr, DWORD size, BYTE *sign, char *mask)
  12. {
  13.     if (size == 0 || sign == nullptr || mask == nullptr) return 0;
  14.  
  15.     HANDLE hProc = GetCurrentProcess();
  16.     if (hProc)
  17.     {
  18.         MEMORY_BASIC_INFORMATION mbi = { 0 };
  19.         DWORD offset = 0;
  20.  
  21.         while (offset < size)
  22.         {
  23.             VirtualQueryEx(hProc, reinterpret_cast<LPCVOID>(addr + offset), &mbi, sizeof(MEMORY_BASIC_INFORMATION));
  24.             if (mbi.State != MEM_FREE)
  25.             {
  26.                 BYTE *buffer = new BYTE[mbi.RegionSize];
  27.                 ReadProcessMemory(hProc, mbi.BaseAddress, buffer, mbi.RegionSize, 0);
  28.                 for (SIZE_T i = 0; i < mbi.RegionSize; i++)
  29.                 {
  30.                     if (DataCompare(buffer + i, sign, mask))
  31.                     {
  32.                         CloseHandle(hProc);
  33.                         delete[] buffer;
  34.                         return reinterpret_cast<DWORD>(mbi.BaseAddress) + i;
  35.                     }
  36.                 }
  37.                 delete[] buffer;
  38.             }
  39.             offset += mbi.RegionSize;
  40.         }
  41.         CloseHandle(hProc);
  42.     }
  43.  
  44.     return 0;
  45. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement