Tôi đang sử dụng số ReadProcessMemory()
của WinAPI để đọc một số thông tin "ẩn" từ trò chơi.Đọc bộ nhớ từ ".exe" + offset?
Tôi đã sử dụng Công cụ cheat để tìm ra các con trỏ tĩnh, nhưng tôi không biết cách đọc từ chúng. Cheat Engine mang lại cho tôi một con trỏ đến một cái gì đó như thế này: "mygame.exe"+1C50
Tôi thực sự mới để WinAPI, làm thế nào để chuyển đổi "mygame.exe"+1C50
đến một địa chỉ mà tôi có thể đọc với ReadProcessMemory()
?
CHỈNH SỬA: Tôi đã thử đơn giản hóa vấn đề, nhưng tôi đoán tôi nên đã chỉ đưa ra mã đầy đủ ngay từ đầu. Vì vậy, tôi đang làm việc với các địa chỉ tĩnh và các con trỏ đa cấp ở đây, nhưng tôi vẫn bị mắc kẹt với việc lấy địa chỉ cơ sở hoặc w/e.
Dưới đây là toàn bộ mã và a picture of my cheat engine address:
#include <iostream>
#include <windows.h>
#include <tlhelp32.h>
using namespace std;
HANDLE GetProcessHandle(const char *procName);
int main()
{
const char *procName = "prism3d.exe";
HANDLE hProc = GetProcessHandle(procName);
if (hProc) {
/* This works if I use the dynamic address (f.e. 0x02C2C4DC),
but it changes every time I restart the game.
I need to use the static address (prism3d.exe+A1C) to get
the dynamic address for my "nuke".
*/
float nuke;
ReadProcessMemory(hProc, (void*)0x02C2C4DC, &nuke, 4, 0);
cout << nuke;
}
CloseHandle(hProc);
return 0;
}
HANDLE GetProcessHandle(const char *procName)
{
HANDLE hProc = NULL;
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (Process32First(hSnapshot, &pe32)) {
do {
if (!strcmp(pe32.szExeFile, procName)) {
hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
break;
}
} while (Process32Next(hSnapshot, &pe32));
}
CloseHandle(hSnapshot);
return hProc;
}
Chỉnh sửa 2: Đây là cách tôi cố gắng đọc giá trị của nuke của tôi, nhưng nó mang lại cho tôi số ngẫu nhiên, khác nhau mỗi khi tôi khởi động lại trò chơi (đôi khi nó 0
, đôi khi 324324324
, vv ...):
if (hProc) [
DWORD baseAddr = (DWORD)GetModuleHandle(procName) + 0xA1C50; // also tried this with GetModuleHandle(NULL)
DWORD mainAddr;
ReadProcessMemory(hProc, (void*)(baseAddr + 0x111C), &mainAddr, 4, 0);
// Nuke
float nuke;
DWORD nukeAddr;
ReadProcessMemory(hProc, (void*)(mainAddr + 0x48), &nukeAddr, 4, 0);
ReadProcessMemory(hProc, (void*)nukeAddr, &nuke, 4, 0);
cout << nuke;
}
Bạn cần xác định địa chỉ cơ sở của "game.dll", sau đó thêm 1C50. –