Мои вопросы:
Как я вообще мог читать память 32-битных программ через 64-битную программу? (в Visual Studio)
Нужно ли мне использовать 64-битный эквивалент DWORD для создания хака для автономной игры на базе x64?
код для чтения 32-битной памяти из 64-битной программы:
Код: Выделить всё
#include
#include
#include
#include
#include
DWORD GetModuleBaseAddress(TCHAR* lpszModuleName, DWORD pID) {
DWORD dwModuleBaseAddress = 0;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pID); // make snapshot of all modules within process
MODULEENTRY32 ModuleEntry32 = { 0 };
ModuleEntry32.dwSize = sizeof(MODULEENTRY32);
if (Module32First(hSnapshot, &ModuleEntry32)) //store first Module in ModuleEntry32
{
do {
if (_tcscmp(ModuleEntry32.szModule, lpszModuleName) == 0) // if Found Module matches Module we look for -> done!
{
dwModuleBaseAddress = (DWORD)ModuleEntry32.modBaseAddr;
break;
}
} while (Module32Next(hSnapshot, &ModuleEntry32)); // go through Module entries in Snapshot and store in ModuleEntry32
}
CloseHandle(hSnapshot);
return dwModuleBaseAddress;
}
DWORD GetPointerAddress(DWORD PID, DWORD gameBaseAddr, DWORD address, std::vector offsets)
{
HANDLE phandle = NULL;
phandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
if (phandle == INVALID_HANDLE_VALUE || phandle == NULL);
DWORD offset_null = NULL;
ReadProcessMemory(phandle, (LPVOID*)(gameBaseAddr + address), &offset_null, sizeof(offset_null), 0);
DWORD pointeraddress = offset_null; // the address we need
for (int i = 0; i < offsets.size() - 1; i++) // we dont want to change the last offset value so we do -1
{
ReadProcessMemory(phandle, (LPVOID*)(pointeraddress + offsets.at(i)), &pointeraddress, sizeof(pointeraddress), 0);
}
return pointeraddress += offsets.at(offsets.size() - 1); // adding the last offset
}
int main() {
HWND WindowHandle = FindWindow(NULL, "AssaultCube");
DWORD PID = NULL;
GetWindowThreadProcessId(WindowHandle, &PID);
HANDLE Handle = NULL;
Handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
// GETS BASE ADDRESS TO ADD OFFSETS TO
char GameModuleName1[] = "ac_client.exe";
DWORD GameBaseAddress1 = GetModuleBaseAddress(_T(GameModuleName1), PID);
DWORD Address = 0x00183828;
// OFFSETS TO GET TO WANTED ADDRESS BELOW
std::vector SecondaryAmmoOffsets = { 0x8,0x928, 0x98, 0x30, 0x30, 0x660 };
DWORD SecondaryAmmoAddressPointer = GetPointerAddress(PID, GameBaseAddress1, Address, SecondaryAmmoOffsets);
int SecondaryAmmoValue = 999;
WriteProcessMemory(Handle, (LPVOID)SecondaryAmmoAddressPointer, &SecondaryAmmoValue, 4, 0);
return 69;
}
Я пытался прочитать память 32-битных программ через 64-битную программу, и это сработало, теперь я в замешательстве
Подробнее здесь: https://stackoverflow.com/questions/791 ... 64-program