我正在运行一个简单的应用程序并尝试使用Window的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 << "\r\n" << endl;
GetModuleFileNameEx(PROC_HANDLE, mainModule , filenameBuffer, 256);
cout << (byte)ReadMemory<byte>() << "\r\n" << number << "\r\n" << filenameBuffer << endl;
system("PAUSE");
#endif
return 1;}
提前谢谢你:)
P.S。我主要只是寻找指针...... bah dum tsss
更新 显然,检查GetLastError值,EnumProcessModules在完成后会提示299错误代码。并且调试显示mainModule没有任何内容......但是EnumProcessModules在“no errors”中返回0。
昨天,我设法得到它并使GetModuleFileName工作正常(相同的代码,只添加了GetLastError)。
答案 0 :(得分:0)
显然,我的问题是我使用片段运行测试
&#xA;&#xA; enumResult = EnumProcessModules(PROC_HANDLE,&amp; mainModule,sizeof(HMODULE), &amp; cbNeeded)&#xA; if(enumResult!= 0)&#xA; {&#xA; //枚举流程模块失败&#xA;返回40;&#xA;}&#xA;
&#xA;&#xA; 并成功运行EnumProcessModules会产生非零结果! (因此给我带来了一些困惑并使我的整个调试过程出现故障)
&#xA;&#xA;在我弄清楚这个细节之后,我再次运行了一些旧测试并发现我的目标进程是64我正在运行32位应用程序。&#xA;更改为64位,现在它就像魅力一样
&#xA;