我正在运行一个简单的应用程序,并试图使用windows的PSAPI在其内存中读取特定的偏移量。
当我运行调试器时,我得到内存地址的真实值,以及相对于"。exe"入口点的值。
然而,当我运行下面的代码时,我得到的作为入口点的基本模块和我的偏移量产生了一个不同的地址(这是错误的,并且偏离了几个(十六进制)化学点)。有什么问题吗?
ReadMemory是ReadProcessMemory的模板
HWND WINDOW_HANDLE;
HANDLE PROC_HANDLE;
DWORD PROC_ID;
DWORD address;
SIZE_T bytesRead;
int InitReadMemory(const char* windowClass,const char* caption, DWORD addressOffset)
{
DWORD cbNeeded;
DWORD dwdResult;
HMODULE mainModule;
BOOL enumResult;
//Get the window handle
WINDOW_HANDLE = FindWindow(windowClass, NULL);
if(WINDOW_HANDLE == NULL)
{
//Window was not foud
return 10;
}
//Get the process ID
dwdResult = GetWindowThreadProcessId(WINDOW_HANDLE, &PROC_ID);
if(dwdResult==0)
{
//Getting Process ID failed
return 20;
}
//Open the process
PROC_HANDLE = OpenProcess(PROCESS_ALL_ACCESS, false, PROC_ID);
if(PROC_HANDLE==NULL)
{
//Process failed to open
return 30;
}
/*
*Get the Main Module-
*first entry in the returned HMODULE array from
*EnumProcessModules
*/
enumResult = EnumProcessModules(PROC_HANDLE, &mainModule, sizeof(HMODULE), &cbNeeded);
if(enumResult != 0)
{
//Failed enumerating process modules
return 40;
}
//offset the requested memory address from the application's base address
address = (DWORD)((UINT_PTR)mainModule + addressOffset);
#ifdef DEBUG
using namespace std;
char filenameBuffer[64]="";
string number;
stringstream stristream;
stristream << address;
stristream >> number;
cout << number << "rn" << endl;
GetModuleFileNameEx(PROC_HANDLE, mainModule , filenameBuffer, 256);
cout << (byte)ReadMemory<byte>() << "rn" << number << "rn" << filenameBuffer << endl;
system("PAUSE");
#endif
return 1;}
提前谢谢你:)
注:我主要是在寻找指导……bah dum tsss
更新:显然,在检查GetLastError值之后,EnumProcessModules会提示299错误代码。调试显示mainModule没有保存任何东西…然而,EnumProcessModules返回0作为"没有错误"。
昨天,我设法得到它并得到GetModuleFileName的工作属性(相同的代码,只添加了GetLastError)。
显然,我的问题是我在运行测试时使用了代码片段
enumResult = EnumProcessModules(PROC_HANDLE, &mainModule, sizeof(HMODULE), &cbNeeded)
if(enumResult != 0)
{
//Failed enumerating process modules
return 40;
}
和EnumProcessModules的成功运行将产生一个非零的结果!(这给我造成了一些困惑,使我的整个调试过程出错)
在我弄清楚这个细节之后,我再次运行了一些旧的测试,发现我的目标进程是64位的,而我正在运行一个32位的应用程序。改成64位,现在效果很好