我的目标是挂钩来自特定 dll 及其依赖项(可能延迟导入)的所有 LoadLibrary 调用。这是我尝试解决此任务的方法:
DONT_RESOLVE_DLL_REFERENCES
使用标志加载此 dll 。1.1。将此算法递归地应用于 dll 的子模块。
- 手动填写此 dll 的导入表。
- Hook all
LoadLibraryA
等LoadLibraryW
功能只是修补 Import Table。 - 使用标志
DllMain
手动调用此 dll。DLL_PROCESS_ATTACH
最后一步我遇到了问题。如果我DllMain
手动调用,那么所有内部LoadLibrary
调用都将从我的模块的地址空间(而不是从 dll 的地址空间)执行,并且我在 step3 中的所有钩子都不会调用。
而且我不想LoadLibrary
在我的主模块中挂钩调用,因为还有其他代码可以调用LoadLibrary
,我不会有这样的副作用。
所以我的问题是我应该如何调用 DllMain 以强制它不在LoadLibrary
我的主模块中使用?是因为延迟进口吗?或者只是因为我打电话DllMain
?或者也许这个任务有更好的解决方案?
这是我运行 dll 的方式:
void PEUtility::runDllMain(HMODULE module)
{
typedef BOOL(WINAPI *DllMainFunPtr)(HMODULE, DWORD, LPVOID);
auto header = ImageNtHeader(module);
auto dllMain = (DllMainFunPtr)(header->OptionalHeader.AddressOfEntryPoint + (DWORD_PTR)module);
dllMain(module, DLL_PROCESS_ATTACH, NULL);
}
这是我填写导入表的方式:关于我如何填写导入表的问题
LoadLibrary
hooking 类似于 Import Table 填充。
更新
我添加了来自ApiMonitor的几个屏幕截图,以证明LoadLibrary("...mso20win32client.dll")
该案例是从不同模块调用的,然后我使用上述所有这些内容加载父库olmapi32.dll
(取决于mso20win32client.dll
),然后我只调用LoadLibrary
:
当我使用上述方法时(使用DONT_RESOLVE_DLL_REFERENCES
等DllMain
)(注意最后一行:mso20win32client.dll
从mapi32ex64.dll
- 我的主模块加载):
当我刚刚调用时LoadLibrary("OLMAPI32.dll")
(注意最后一行:mso20win32client.dll
是从olmapi32.dll
我想使用我的方法加载的 dll 加载的):