我一直在寻找一些挂钩代码,这些挂钩代码有选择地将库加载到某些过程中,然后将某些本机API函数(使用弯路)挂钩。事件链看起来像这样:
- 内核驱动程序 a.dll 进入每个过程。
-
A.dll ::
DllMain()
决定是否加载 b.dll (LoadLibraryEx
),其中包含实际的弯路钩。 - b.dll 在过程挂钩的过程中运行。
这里的第二个子弹似乎打破了此处指定的dllmain规则,但是我正在尝试弄清楚驱动程序加载 A.dll
的方式是否围绕限制工作。具体来说,内核驱动程序使用PsSetLoadImageNotifyRoutine
在每个过程启动时获取通知,然后排队在A.dll
上调用LoadLibraryEx
,这意味着在该过程启动时,它几乎是加载的第一个DLL。这是否可以避免在DllMain
中调用LoadLibrary
的问题?
如何触发LoadLibraryEx
。触发后,DLL加载过程是相同的,并且适用相同的规则。
文档非常明确地说不要在dllmain中调用LoadLibrary。即使在不太可能的情况下,您还发现了一种安全的方法来使其正常工作,它在下一个版本(甚至是下一个服务包)的Windows也可能无法使用。