使用EnumProcessModules的Windows程序入口点返回意外值
Windows program entry point using EnumProcessModules returns unexpected value
我正在运行一个简单的应用程序,并试图使用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位,现在效果很好相关文章:
- 为什么这会返回意外值?
- 从 C++ 调用 cURL 命令会返回意外的错误代码,如 1792 和 6656
- C++ 三角函数返回意外值
- 裸__declspec上的 memcpy 返回意外的字节
- 在C 中读取二进制文件会返回意外值
- OpenCL - 内核方法返回意外结果
- C :Bool方法在COUT语句之后返回意外数字
- 数组中的线性搜索返回意外结果
- POW函数为什么返回意外值
- std::min_element 从类对象返回意外结果
- 位NOT运算符返回意外的负值
- std::min_element返回意外结果
- 递归返回意外输出
- C++随机字符串返回意外结果
- 在DLL的基地址处Win API ReadProcessMemory返回意外数据
- OpenCV 'sortIdx' 返回意外结果
- find_if() 在 const 函数中返回意外的迭代器类型
- c++方法有时会返回意外的高值
- 函数返回意外的结构值
- c++ std:: string.Find以布尔表达式返回意外结果