0
我最近開始了一個新的C++ win32控制檯項目。 它基本上重寫了給定地址在內存中的值。如何獲取進程中使用的.DLL的(物理)baseaddress?
重點是,我希望它使用帶偏移量的指針映射重新計算它應該使用的地址。 Here是Cheat Engine中指針圖的圖像。
正如我所說,我管理它手動重寫值(1147在這種情況下),如果我只是輸入地址,但我希望它是自動的! 希望你明白我的問題
祝你有美好的一天。
我最近開始了一個新的C++ win32控制檯項目。 它基本上重寫了給定地址在內存中的值。如何獲取進程中使用的.DLL的(物理)baseaddress?
重點是,我希望它使用帶偏移量的指針映射重新計算它應該使用的地址。 Here是Cheat Engine中指針圖的圖像。
正如我所說,我管理它手動重寫值(1147在這種情況下),如果我只是輸入地址,但我希望它是自動的! 希望你明白我的問題
祝你有美好的一天。
要獲取內存中模塊(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;
}
'CreateToolHelp32Snapshot函數(TH32CS_SNAPMODULE,PID) - > _wcsicmp(MODULEENTRY32.szModule,L 「MYNAME」) - > MODULEENTRY32.modBaseAddr' – RbMm