Случайное чтение памяти программ x86 с помощью другой программы x64.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Случайное чтение памяти программ x86 с помощью другой программы x64.

Сообщение Anonymous »

Некоторым людям это может показаться сумасшедшим, но, пожалуйста, просто попытайтесь понять. Кроме того, я могу дать код, если кто-то во мне сомневается. Я случайно использовал программу x64 для создания игровых хаков для игры под названием AssaultCube, до сих пор я этого не сделал. не знаю, что AssaultCube на самом деле 32-битный или он кажется 32-битным при просмотре его в диспетчере задач в разделе подробностей, единственная причина, по которой я спрашиваю, это то, что я почти уверен, что 32-битная версия несовместима с 64-битной версией
Мои вопросы:
Как я вообще мог читать память 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»