C++ GetModuleHandle返回无效的句柄值

C++ GetModuleHandle返回无效的句柄值,c++,windows,dll,module,dll-injection,C++,Windows,Dll,Module,Dll Injection,所以我在一个测试可执行文件上学习一些dll注入的东西。一旦我注入了我的dll,我就会尝试获取模块句柄,并以此获取模块的基址(主exe) 这就是我试图做到的。这是在我的dll被注入之后,但由于某种原因,它似乎返回了无效的\u句柄\u值。我从一个网站上找到了这个功能,并对它进行了一些修改,但它似乎仍然不起作用。如果你有一个更干净的方法来获取基址,我很高兴知道 编辑此行现在存在的问题是: if(wcscmp(ModuleEntry32.szModule, lpszModuleName) == 0)

所以我在一个测试可执行文件上学习一些dll注入的东西。一旦我注入了我的dll,我就会尝试获取模块句柄,并以此获取模块的基址(主exe)

这就是我试图做到的。这是在我的dll被注入之后,但由于某种原因,它似乎返回了无效的\u句柄\u值。我从一个网站上找到了这个功能,并对它进行了一些修改,但它似乎仍然不起作用。如果你有一个更干净的方法来获取基址,我很高兴知道

编辑此行现在存在的问题是:

if(wcscmp(ModuleEntry32.szModule, lpszModuleName) == 0) 
它从来不是0,但有一个模块名我正在寻找,我可以看到我的exe在调试器中,但这种比较不知何故没有工作

这就是我调用函数的方式

HWND window = FindWindow(0, LPCWSTR("test"));
DWORD pID = 0; 
GetWindowThreadProcessId(window, &pID); 
base = dwGetModuleBaseAddress(pID, (WCHAR*)("test"));

您正在使用为宽字符串设计的函数

"test"
L"test"
顶行是一个常规的c字符串字符数组。第二行使用L宏将字符串文字定义为宽字符c字符串

强制转换到WCHAR*无法解决此问题,您必须使用L宏定义它们,或者将函数切换为使用常规字符数组

这是我使用的函数的常规字符数组版本

char*GetModuleBaseAddress(常量char*modName,DWORD procId)
{
char*modBaseAddr{nullptr};
HANDLE hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32,procId);
if(hSnap!=无效的\u句柄\u值)
{
MODULEENTRY32 modEntry{};
modEntry.dwSize=sizeof(modEntry);
if(模块32第一(hSnap和modEntry))
{
做
{
if(!\u stricmp(modEntry.szModule,modName))
{
modBaseAddr=(char*)modEntry.modBaseAddr;
打破
}
}while(module32下一步(hSnap和modEntry));
}
}
闭合手柄(hSnap);
返回modBaseAddr;
}

您可以使用getlasterror()查看发生的情况。您是说CreateToolhelp32Snapshot返回无效的\u HANDLE\u值吗?检查GetLastError()以获取错误代码。这可能会让您更好地了解可能发生的情况。好的,现在问题出在这一行:如果(wcscmp(ModuleEntry32.szModule,lpszModuleName)==0)(WCHAR*)强制转换只会阻止编译器告诉您做错了,但不会阻止您做错。使用L“test”创建Unicode字符串文字。
"test"
L"test"