【发布时间】:2014-04-06 14:02:59
【问题描述】:
我正在尝试编写一个程序,将值 500 存储到计算器应用程序上的 MR(内存恢复)按钮的计算器内存地址中。 我知道这个整数的地址是 "calc.exe"+00073320 + 0 + C
如果我使用像作弊引擎这样的程序,我可以获取我正在运行的calculator.exe 实例的当前地址,并以这种方式写入它。但是,由于这不是静态地址,我需要一种方法来获取模块基地址。
我尝试使用这个 GetModuleBase 函数(参见下面的代码)来获取 calc.exe 的基地址,但我的问题是我无法获取基地址。该函数总是返回 0 而不是正确的地址。
我调试了它,发现在 GetModuleBase 函数中,它甚至没有在 while 循环中循环一次,因为 bModule 从 Module32First 函数返回 0。
#include <tchar.h>
#include <windows.h>
#include <TlHelp32.h>
#include <iostream>
#include <Psapi.h>
#include <wchar.h>
#pragma comment( lib, "psapi" )
using namespace std;
DWORD GetModuleBase(LPSTR lpModuleName, DWORD dwProcessId)
{
MODULEENTRY32 lpModuleEntry = {0};
HANDLE hSnapShot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwProcessId );
if(!hSnapShot)
return NULL;
lpModuleEntry.dwSize = sizeof(lpModuleEntry);
BOOL bModule = Module32First( hSnapShot, &lpModuleEntry );
while(bModule)
{
if(!strcmp( lpModuleEntry.szModule, lpModuleName ) )
{
CloseHandle( hSnapShot );
return (DWORD)lpModuleEntry.modBaseAddr;
}
bModule = Module32Next( hSnapShot, &lpModuleEntry );
}
CloseHandle( hSnapShot );
return NULL;
}
int main() {
HWND hWnd = FindWindow(0, "Calculator");
DWORD BaseAddr;
if(hWnd == 0){
MessageBox(0, "Error cannot find window.", "Error", MB_OK|MB_ICONERROR);
} else {
DWORD proccess_ID;
GetWindowThreadProcessId(hWnd, &proccess_ID);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proccess_ID);
if(!hProcess){
MessageBox(0, "Could not open the process!", "Error!", MB_OK|MB_ICONERROR);
} else {
int newdata = 500;
BaseAddr = GetModuleBase("calc.exe",proccess_ID);
//GetModuleBase is always returning 0, so I am not getting the correct base address
DWORD newdatasize = sizeof(newdata);
if(WriteProcessMemory(hProcess, (LPVOID)0x002413FC, &newdata, newdatasize, NULL)){
cout << "Memory successfully written." << endl;
} else {
cout << "Memory failed to write." << endl;
}
CloseHandle(hProcess);
}
}
return 0;
}
总结:我无法使用我的 GetModuleBase 函数获取正确的基地址,我需要找出我做错了什么,以便我可以为“calc.exe”进程获取正确的基地址。
【问题讨论】: