Mình không phải dân IT nên mấy thuật ngữ trên có dùng sai mọi người bỏ qua giùm nhé
Vấn đề là mình có debug game Minesweeper (game dò mìn có sẵn trên win) để lấy base address của số lượng bom trong game. Mà cái address sau cùng mình nhận được không phải dạng số mà là dạng chữ: “minesweeper.exe”+000AAA38.
Dạng số mình đã test thành công còn cái này có lên mạng search thì biết nó là Module gì đó. Viết code y như họ mà vẫn không đọc được address đó. Đây là code của mình, không biết sai chỗ nào mong cao nhân giúp đỡ
#include <iostream>
#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>
using namespace std;
DWORD_PTR dwGetModuleBaseAddress(DWORD dwProcID, TCHAR *szModuleName);
int main()
{
DWORD d_address;
DWORD d_offset[4] = { 0x000AAA38, 0x8, 0x1c8, 0x8 };
//DWORD d_baseOffset = 0x000AAA38;
DWORD d_temp;
DWORD d_BaseAddress;
int d_value;
DWORD pid = NULL;
HWND hwnd = FindWindow(NULL, TEXT("minesweeper"));
if (!hwnd)
{
cout << "Loi roi! Khong dung` dc ham FindWindow" << endl;
}
GetWindowThreadProcessId(hwnd, &pid);
HANDLE d_handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
if (!d_handle)
{
cout << "Loi roi! Khong dung dc ham OpenProcess" << endl;
}
d_address = dwGetModuleBaseAddress(pid, _T("minesweeper.exe"));
for (int n = 0; n < 5; n++)
{
if (n == 0)
{
ReadProcessMemory(d_handle, (LPCVOID*)d_address, &d_temp, sizeof(d_temp), 0);
}
else {
ReadProcessMemory(d_handle, (LPCVOID*)d_BaseAddress, &d_temp, sizeof(d_temp), 0);
}
d_BaseAddress = d_temp + d_offset[n];
}
ReadProcessMemory(d_handle, (void*)d_address, &d_value, sizeof(d_value), 0);
cout << d_value << endl;
system("pause");
return 0;
}
DWORD dwGetModuleBaseAddress(DWORD dwProcessIdentifier, TCHAR *lpszModuleName)
{
DWORD dwModuleBaseAddress = 0;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessIdentifier);
if (hSnapshot != INVALID_HANDLE_VALUE)
{
MODULEENTRY32 ModuleEntry32 = { 0 };
ModuleEntry32.dwSize = sizeof(MODULEENTRY32);
if (Module32First(hSnapshot, &ModuleEntry32))
{
do
{
if (_tcscmp(ModuleEntry32.szModule, lpszModuleName) == 0)
{
dwModuleBaseAddress = (DWORD)ModuleEntry32.modBaseAddr;
break;
}
} while (Module32Next(hSnapshot, &ModuleEntry32));
}
CloseHandle(hSnapshot);
}
return dwModuleBaseAddress;
}