C++ 从exe c++;
我试图用openprocess从这个exe中获取基起始地址,但当我运行代码时,我一直崩溃,我没有发现它有任何问题C++ 从exe c++;,c++,winapi,openprocess,C++,Winapi,Openprocess,我试图用openprocess从这个exe中获取基起始地址,但当我运行代码时,我一直崩溃,我没有发现它有任何问题 HMODULE GetModule(HANDLE han) { HMODULE hMods[1024]; int i; DWORD cbNeeded; char szProcessName[MAX_PATH] = "Minesweeper.exe"; EnumProcessModules(han, hMods, sizeof(hMods), &
HMODULE GetModule(HANDLE han)
{
HMODULE hMods[1024];
int i;
DWORD cbNeeded;
char szProcessName[MAX_PATH] = "Minesweeper.exe";
EnumProcessModules(han, hMods, sizeof(hMods), &cbNeeded);
for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
{
TCHAR szModName[MAX_PATH];
GetModuleFileNameEx(han, hMods[i], szProcessName, sizeof(szModName));
//printf(TEXT("\t%s (0x%08X)\n"), szModName, hMods[i]);
if (szModName == szProcessName)
{
cout << "FOUND" << endl;
}
}
return 0;
}
HMODULE GetModule(句柄)
{
HMODULE-hMods[1024];
int i;
德沃德;
char szProcessName[MAX_PATH]=“mineswipper.exe”;
EnumProcessModule(需要han、hMods、sizeof(hMods)和CBD);
对于(i=0;i<(cbNeeded/sizeof(HMODULE));i++)
{
TCHAR szModName[最大路径];
GetModuleFileNameEx(han,hMods[i],szProcessName,sizeof(szModName));
//printf(文本(“\t%s(0x%08X)\n”)、szModName、hMods[i]);
if(szModName==szProcessName)
{
cout您的代码有几个问题:
- 您正在使用
TCHAR
,但没有始终如一地使用TCHAR
- 您使用的是
==
而不是正确的字符串比较函数
- 调用
GetModuleFileNameEx
使用了错误的数组
这是您的代码的一个清理版本,带有更正(未经测试,但解决了大部分(如果不是全部)代码问题):
HMODULE GetModule(句柄)
{
HMODULE-hMods[1024];
int i;
德沃德;
TCHAR szProcessName[MAX_PATH]=“mineswipper.exe”);
EnumProcessModule(需要han、hMods、sizeof(hMods)和CBD);
对于(i=0;i<(cbNeeded/sizeof(HMODULE));i++)
{
TCHAR szModName[最大路径];
GetModuleFileNameEx(han,hMods[i],szModName,sizeof(szModName)/sizeof(TCHAR));
if(_tcscmp(szModName,szProcessName)==0)
{
难道这个问题应该有一些特定于Windows的标记,但我不知道应该应用哪些标记。GetModuleFileNameEx
的最后一个参数是以字符而不是字节度量的,所以你不应该使用sizeof
来解决这个问题。在Unicode构建中,这可能会导致崩溃。我使用的是多字节项目,我也使用了printf,我可以通信我得到了一些地址,但在打印完所有地址后,我崩溃了。此外,您从未写入szModName
(GetModuleFileName
第三个和第四个参数使用不同的变量),并且您不能将C样式字符串与==
进行比较,您需要strcmp
@JhonBrian Im使用多字节项目--但是您使用的是TCHAR
,因此您应该编写正确的代码,而不是字符数。此函数仍然会崩溃,对我来说运行正常,没有崩溃。但是,getmoduleeFileNameEx()
是一个完全限定的路径和文件名,因此您必须使用类似于PathFindFileName(szModName)的内容
在将其与szProcessName
@JhonBrian进行比较之前,要将其截断为文件名,您需要使用调试器来告诉我们该崩溃在哪一行。这将大大有助于您正确编写函数和/或识别您遇到的问题。鉴于此,我编写的是你需要改正,因为你原来的帖子显然是错的。
HMODULE GetModule(HANDLE han)
{
HMODULE hMods[1024];
int i;
DWORD cbNeeded;
TCHAR szProcessName[MAX_PATH] = _T("Minesweeper.exe");
EnumProcessModules(han, hMods, sizeof(hMods), &cbNeeded);
for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
{
TCHAR szModName[MAX_PATH];
GetModuleFileNameEx(han, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR));
if ( _tcscmp(szModName,szProcessName) == 0)
{
cout << "FOUND" << endl;
}
}
return 0;
}