gpt4 book ai didi

c++ - 工具帮助 API 返回无效的 HMODULE?

转载 作者:太空宇宙 更新时间:2023-11-04 13:35:00 25 4
gpt4 key购买 nike

在我的应用程序中,我通过修补 PE 导入访问表来挂接一些 Windows API 调用。我使用此工具帮助 API (Module32First,Module32Next) 枚举进程中的所有模块。

我挂接的函数之一是 LoadLibrary。在其中,我通过调用原始的 LoadLibrary 加载模块,然后我再次枚举所有已加载的模块以检测我尚未 Hook 的新加载模块(因为 LoadLibrary 可以加载指定的模块及其依赖的所有模块)。

大多数情况下它工作正常。

但最近我得到了一个故障转储,其中应用程序崩溃试图修补转储中不存在的模块的 IAT 表。在调用 LoadLibrary 之前有 56 个模块,在它之后有 58 个模块(根据工具帮助 API)。但是在我的故障转储中只有 57 个模块。

会发生什么? Tool Help API 能否返回当前正在加载但尚未完全初始化的模块?在调用堆栈中,我看到 HMODULE 值,该值不属于转储中的任何模块地址。

仅供引用:我使用 Visual C++ 2013。

部分代码:

枚举模块:

typedef std::set <HMODULE> my_loaded_modules_data_t;
void my_get_loaded_modules_data (my_loaded_modules_data_t &data)
{
data.clear ();
CToolhelp th (TH32CS_SNAPMODULE, GetCurrentProcessId ());
MODULEENTRY32 me = { sizeof (me) };
for (BOOL bOk = th.ModuleFirst (&me); bOk; bOk = th.ModuleNext (&me))
data.insert (me.hModule);
}

然后对于每个新模块,我调用此代码:

bool ReplaceIATfunc (HMODULE hTarget, /*other args here*/)
{
PIMAGE_DOS_HEADER pDosHeader = PIMAGE_DOS_HEADER (hTarget);
PIMAGE_NT_HEADERS pNTHeaders = RvaToAddr (PIMAGE_NT_HEADERS, hTarget, pDosHeader->e_lfanew);

// crash is here
IMAGE_DATA_DIRECTORY &impDir = pNTHeaders->OptionalHeader.DataDirectory [IMAGE_DIRECTORY_ENTRY_IMPORT];

if (impDir.VirtualAddress == NULL || impDir.Size == 0)
return false;

/* ... */
}

RvaToAddr 定义:

#define RvaToAddr(type, base, offset) ((type)(DWORD_PTR(base) + DWORD_PTR(offset)))

最佳答案

我创建了一个 100% 重现问题的测试项目。现在可以确认 Tool Help API 返回的模块还没有完全初始化。

项目来源:

::CreateThread (0, 0, _threadStuff, 0, 0, 0);

Sleep (100);

for (;;)
{
auto m = LoadLibrary (L"mshtml.dll");
assert (m);
FreeLibrary (m);
}

第二个线程:

DWORD WINAPI _threadStuff (LPVOID)
{
for (;;)
{
my_loaded_modules_data_t modules;
my_get_loaded_modules_data (modules);

for (const auto module : modules)
{
PIMAGE_DOS_HEADER pDosHeader = PIMAGE_DOS_HEADER (module);
// crash is here
assert (pDosHeader->e_magic == IMAGE_DOS_SIGNATURE);
}
}
return 0;
}

我在崩溃后继续执行(使用特殊技术),过了一会儿我得到了一个正常的模块列表。查看屏幕截图。

enter image description here

现在所需要做的就是检测这种情况,稍后再尝试。

关于c++ - 工具帮助 API 返回无效的 HMODULE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29880869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com