Некоторым людям это может показаться сумасшедшим, но, пожалуйста, просто попытайтесь понять. Кроме того, я могу дать код, если кто-то во мне сомневается. Я случайно использовал программу x64 для создания игровых хаков для игры под названием AssaultCube, до сих пор я этого не сделал. не знаю, что AssaultCube на самом деле 32-битный или он кажется 32-битным при просмотре его в диспетчере задач в разделе подробностей, единственная причина, по которой я спрашиваю, это то, что я почти уверен, что 32-битная версия несовместима с 64-битной версией
Мои вопросы:
Как я вообще мог читать память 32-битных программ через 64-битную программу? (в Visual Studio)
Нужно ли мне использовать 64-битный эквивалент DWORD для создания хака для автономной игры на базе x64?
код для чтения 32-битной памяти из 64-битной программы:
Некоторым людям это может показаться сумасшедшим, но, пожалуйста, просто попытайтесь понять. Кроме того, я могу дать код, если кто-то во мне сомневается. Я случайно использовал программу x64 для создания игровых хаков для игры под названием AssaultCube, до сих пор я этого не сделал. не знаю, что AssaultCube на самом деле 32-битный или он кажется 32-битным при просмотре его в диспетчере задач в разделе подробностей, единственная причина, по которой я спрашиваю, это то, что я почти уверен, что 32-битная версия несовместима с 64-битной версией Мои вопросы: Как я вообще мог читать память 32-битных программ через 64-битную программу? (в Visual Studio) Нужно ли мне использовать 64-битный эквивалент DWORD для создания хака для автономной игры на базе x64? код для чтения 32-битной памяти из 64-битной программы: [code]#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
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; } [/code] Проблема: Я пытался прочитать память 32-битных программ через 64-битную программу, и это сработало, теперь я в замешательстве