2

我的目标是挂钩来自特定 dll 及其依赖项(可能延迟导入)的所有 LoadLibrary 调用。这是我尝试解决此任务的方法:

  1. DONT_RESOLVE_DLL_REFERENCES使用标志加载此 dll 。

    1.1。将此算法递归地应用于 dll 的子模块。

  2. 手动填写此 dll 的导入表。
  3. Hook allLoadLibraryALoadLibraryW功能只是修补 Import Table。
  4. 使用标志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);
}

这是我填写导入表的方式:关于我如何填写导入表的问题

LoadLibraryhooking 类似于 Import Table 填充。

更新

我添加了来自ApiMonitor的几个屏幕截图,以证明LoadLibrary("...mso20win32client.dll")该案例是从不同模块调用的,然后我使用上述所有这些内容加载父库olmapi32.dll(取决于mso20win32client.dll),然后我只调用LoadLibrary

当我使用上述方法时(使用DONT_RESOLVE_DLL_REFERENCESDllMain)(注意最后一行:mso20win32client.dllmapi32ex64.dll- 我的主模块加载): 使用上述内容加载“olmapi32.dll”

当我刚刚调用时LoadLibrary("OLMAPI32.dll")(注意最后一行:mso20win32client.dll是从olmapi32.dll我想使用我的方法加载的 dll 加载的): 在此处输入图像描述

4

1 回答 1

0

对于偶然发现此问题的未来读者(他们的目标是在库加载和调用其 init 例程之间做一些事情,例如挂钩或更改某些代码),请查看以下答案:https ://reverseengineering.stackexchange.com /a/6023

基本上可以hook LdrpCallInitRoutinein ntdll.dll,系统用来调用DLL入口点:

BOOLEAN NTAPI LdrpCallInitRoutine(PDLL_INIT_ROUTINE EntryPoint, PVOID BaseAddress, ULONG Reason, PVOID Context);
于 2021-02-12T10:20:55.063 回答