GetModuleHandle return INVALID_HANDLE_VALUE
GetModuleHandle return INVALID_HANDLE_VALUE
所以我正在学习一些关于测试可执行文件的dll注入内容。一旦我注入了dll,我就会尝试获取模块句柄,然后尝试获取模块的基地址(主exe)。
DWORD dwGetModuleBaseAddress(DWORD dwProcessIdentifier, WCHAR *lpszModuleName)
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessIdentifier);
DWORD dwModuleBaseAddress = 0;
if(hSnapshot != INVALID_HANDLE_VALUE)
{
MODULEENTRY32 ModuleEntry32 = {0};
ModuleEntry32.dwSize = sizeof(MODULEENTRY32);
if(Module32First(hSnapshot, &ModuleEntry32))
{
do
{
if(wcscmp(ModuleEntry32.szModule, lpszModuleName) == 0)
{
dwModuleBaseAddress = (DWORD)ModuleEntry32.modBaseAddr;
break;
}
}
while(Module32Next(hSnapshot, &ModuleEntry32));
}
CloseHandle(hSnapshot);
}
return dwModuleBaseAddress;
}
我就是这么做的。这是在我的dll被注入之后,但由于某种原因,它似乎返回了INVALID_HANDLE_VALUE。我从一个网站上找到了这个功能,并对它进行了一些修改,但它似乎仍然不起作用。如果你有一个更干净的方法来获得基本地址,我很高兴知道它。
编辑现在的问题是这行:
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数组。
这是你的函数的一个常规的字符数组版本,我使用
char* GetModuleBaseAddress(const char* modName, DWORD procId)
{
char* modBaseAddr{ nullptr };
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, procId);
if (hSnap != INVALID_HANDLE_VALUE)
{
MODULEENTRY32 modEntry{};
modEntry.dwSize = sizeof(modEntry);
if (Module32First(hSnap, &modEntry))
{
do
{
if (!_stricmp(modEntry.szModule, modName))
{
modBaseAddr = (char*)modEntry.modBaseAddr;
break;
}
} while (Module32Next(hSnap, &modEntry));
}
}
CloseHandle(hSnap);
return modBaseAddr;
}
相关文章:
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- 为什么static_assert错误:即使我传递常量"expression must have a constant value"?
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 为什么我会" void value not ignored as it ought to be"?
- 方法错误"not all control paths return a value"和方法不返回值
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- 如何在 c++ 中理解这样的代码 [request->headers().Method()->value().getStringView())]
- std::<key-value>不同类型的对向量
- c++ visual studio 64bit | save registers value
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 如何解决类成员函数中的"return a value"错误?
- bsoncxx: document::view vs document::value
- .value( "key" , default) 不适用于空的 json 对象吗?
- protobuf C++ SQLite handle blob data
- 如何在C++中设置演员的"Render Custom Depth Pass"和"Depth Stencil Value"?
- Qt 错误:QSqlQuery::value:尝试从表中检索统计信息时未定位在有效记录上 (QComboBox)
- 马洛克会在 C++17 年返回"invalid pointer value"吗?
- 如何将 v8::FunctionCallbackInfo<v8::Value> 数组从一个隔离复制到另一个隔离?
- std::value templated 方法的函数使用 clang 和 g++ 进行编译,但不使用 msvc 进行编译
- 无法使用 auto 来参数化true_type来检测 T::value()