我的目标是钩住来自特定dll及其依赖项的所有LoadLibrary调用(这些调用可能会延迟导入)。下面是我试图解决这个问题的方法:
DONT_RESOLVE_DLL_REFERENCES标志加载此dll。
1.1。将该算法递归地应用于dll的子模块。LoadLibraryA,LoadLibraryW等功能,只需修补导入表。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);
}下面是如何填充导入表:my question about how I'm filling import table
LoadLibrary挂钩类似于Import填充。
更新
我添加了来自ApiMonitor的几个屏幕截图,以演示在这种情况下从不同模块调用LoadLibrary("...mso20win32client.dll"),然后使用上述所有内容加载父库olmapi32.dll (这取决于mso20win32client.dll),然后调用LoadLibrary
当我使用上述方法时(使用DONT_RESOLVE_DLL_REFERENCES、DllMain等)(注意最后一行:mso20win32client.dll是从mapi32ex64.dll - my主模块加载的):

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

发布于 2021-02-12 10:20:55
对于将来偶然发现这个问题的读者(他们的目标是在加载库和调用init例程(例如挂钩或更改一些代码)之间做一些事情),请看下面的答案:https://reverseengineering.stackexchange.com/a/6023
基本上,您可以将LdrpCallInitRoutine挂在ntdll.dll中,它用于系统调用DLL入口点:
BOOLEAN NTAPI LdrpCallInitRoutine(PDLL_INIT_ROUTINE EntryPoint, PVOID BaseAddress, ULONG Reason, PVOID Context);https://stackoverflow.com/questions/40631396
复制相似问题