2017-01-09 101 views
0

我最近開始了一個新的C++ win32控制檯項目。 它基本上重寫了給定地址在內存中的值。如何獲取進程中使用的.DLL的(物理)baseaddress?

重點是,我希望它使用帶偏移量的指針映射重新計算它應該使用的地址。 Here是Cheat Engine中指針圖的圖像。

正如我所說,我管理它手動重寫值(1147在這種情況下),如果我只是輸入地址,但我希望它是自動的! 希望你明白我的問題

祝你有美好的一天。

+0

'CreateToolHelp32Snapshot函數(TH32CS_SNAPMODULE,PID) - > _wcsicmp(MODULEENTRY32.szModule,L 「MYNAME」) - > MODULEENTRY32.modBaseAddr' – RbMm

回答

1

要獲取內存中模塊(DLL或EXE)的基址,您可以使用ToolHelp32Snapshot Windows API函數枚舉加載的模塊。 Microsoft提供了文檔化的源代碼來查找模塊。基本上你需要2個函數,一個抓取ProcessId,然後一個獲取基地址。

bool GetPid(const wchar_t* targetProcess, DWORD* procID) 
{ 
    HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    if (snap && snap != INVALID_HANDLE_VALUE) 
    { 
     PROCESSENTRY32 pe; 
     pe.dwSize = sizeof(pe); 
     if (Process32First(snap, &pe)) 
     { 
      do 
      { 
       if (!wcscmp(pe.szExeFile, targetProcess)) 
       { 
        CloseHandle(snap); 
        *procID = pe.th32ProcessID; 
        return true; 
       } 
      } while (Process32Next(snap, &pe)); 
     } 
    } 
    return false; 
} 

char* GetModuleBase(const wchar_t* ModuleName, DWORD procID) 
{ 
    MODULEENTRY32 ModuleEntry = { 0 }; 
    HANDLE SnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, procID); 

    if (!SnapShot) return NULL; 

    ModuleEntry.dwSize = sizeof(ModuleEntry); 

    if (!Module32First(SnapShot, &ModuleEntry)) return NULL; 

    do 
    { 
     if (!wcscmp(ModuleEntry.szModule, ModuleName)) 
     { 
      CloseHandle(SnapShot); 
      return (char*)ModuleEntry.modBaseAddr; 
     } 
    } while (Module32Next(SnapShot, &ModuleEntry)); 

    CloseHandle(SnapShot); 
    return NULL; 
} 

然後你做:

DWORD ProcId; 
GetPid(L"ac_client.exe", &ProcId); 
char* ExeBaseAddress = GetModuleBase(L"ac_client.exe", ProcId); 

如果你注入過程在內部黑客可以使用GetModuleHandle因爲張貼返回的句柄的是模塊的只是地址:

DWORD BaseAddress = (DWORD)GetModuleHandle(L"ac_client.exe"); 

要計算多級指針所指向的動態地址,您可以使用此函數,它基本上使用ReadProce爲外部引用外部指針ssMemory():

uintptr_t FindDmaAddy(int PointerLevel, HANDLE hProcHandle, uintptr_t Offsets[], uintptr_t BaseAddress) 
{ 
    uintptr_t pointer = BaseAddress; 
    uintptr_t pTemp; 

    uintptr_t pointerAddr; 
    for(int i = 0; i < PointerLevel; i++) 
    { 
      if(i == 0) 
      { 
       ReadProcessMemory(hProcHandle, (LPCVOID)pointer, &pTemp, sizeof(pTemp), NULL); 
      } 
      pointerAddr = pTemp + Offsets[i]; 

      ReadProcessMemory(hProcHandle, (LPCVOID)pointerAddr, &pTemp, sizeof(pTemp), NULL); 
    } 
    return pointerAddr; 
} 
相關問題