首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从钩式延迟dll的LoadLibrary中调用DllMain的Set钩子

从钩式延迟dll的LoadLibrary中调用DllMain的Set钩子
EN

Stack Overflow用户
提问于 2016-11-16 11:48:18
回答 1查看 1.2K关注 0票数 2

我的目标是钩住来自特定dll及其依赖项的所有LoadLibrary调用(这些调用可能会延迟导入)。下面是我试图解决这个问题的方法:

  1. 使用DONT_RESOLVE_DLL_REFERENCES标志加载此dll。 1.1。将该算法递归地应用于dll的子模块。
  2. 手动填写此dll的导入表。
  3. 挂起所有LoadLibraryALoadLibraryW等功能,只需修补导入表。
  4. 使用DllMain标志手动调用dll的DLL_PROCESS_ATTACH

最后一步我有问题。如果我手动调用DllMain,那么所有内部LoadLibrary调用都将从模块的地址空间(而不是从dll的地址空间)执行,而来自step3的所有钩子都不会调用。

我不想把LoadLibrary调用挂在我的主模块中,因为还有其他代码调用LoadLibrary,而且我也不会有这样的副作用。

因此,我的问题是,我应该如何调用DllMain,才能强制它不使用主模块中的LoadLibrary?是因为进口延迟吗?还是仅仅因为我所说的DllMain?或者也许这个任务有更好的解决方案?

下面是我如何运行dll:

代码语言:javascript
复制
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);
}

下面是如何填充导入表:my question about how I'm filling import table

LoadLibrary挂钩类似于Import填充。

更新

我添加了来自ApiMonitor的几个屏幕截图,以演示在这种情况下从不同模块调用LoadLibrary("...mso20win32client.dll"),然后使用上述所有内容加载父库olmapi32.dll (这取决于mso20win32client.dll),然后调用LoadLibrary

当我使用上述方法时(使用DONT_RESOLVE_DLL_REFERENCESDllMain等)(注意最后一行:mso20win32client.dll是从mapi32ex64.dll - my主模块加载的):

当我只调用LoadLibrary("OLMAPI32.dll")时(请注意最后一行:mso20win32client.dll是从希望使用我的方法加载的olmapi32.dll - dll加载的):

EN

回答 1

Stack Overflow用户

发布于 2021-02-12 10:20:55

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

基本上,您可以将LdrpCallInitRoutine挂在ntdll.dll中,它用于系统调用DLL入口点:

代码语言:javascript
复制
BOOLEAN NTAPI LdrpCallInitRoutine(PDLL_INIT_ROUTINE EntryPoint, PVOID BaseAddress, ULONG Reason, PVOID Context);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40631396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档