使您的动态模块不可释放(Anti-FreeLibrary)
本帖最后由 yanaying 于 2020-5-31 09:47 编辑使您的动态模块不可释放(Anti-FreeLibrary)2分钟阅读
假设您的产品将模块注入到目标进程中,如果目标进程知道您模块的存在,则可以调用FreeLibrary函数来卸载您的模块(假设引用计数为1)。保持注入状态的一种方法是,在FreeLibrary每次目标进程调用时挂接函数并检查传递的参数FreeLibrary。有一种无需钩子即可获得相同结果的方法。当进程用于FreeLibrary释放已加载的模块时,FreeLibrary将调用LdrUnloadDll由导出的模块ntdll:
https://user-images.githubusercontent.com/16405698/55341154-a95fd100-5495-11e9-90d9-20b52155774a.PNG
在LdrUnloadDll函数内部,它检查结构的ProcessStaticImport字段LDR_DATA_TABLE_ENTRY以检查模块是否动态加载。检查发生在LdrpDecrementNodeLoadCountLockHeld函数内部:https://user-images.githubusercontent.com/16405698/55341155-a95fd100-5495-11e9-9c8f-5c105c28bd5b.png
https://user-images.githubusercontent.com/16405698/55341159-a9f86780-5495-11e9-8c99-8eb77c0ae06c.PNG
如果ProcessStaticImport设置LdrpDecrementNodeLoadCountLockHeld了该字段,则返回而不释放已加载的模块
https://user-images.githubusercontent.com/16405698/55341153-a8c73a80-5495-11e9-8c57-9d3c313f88aa.PNG
因此,如果我们设置了该ProcessStaticImport字段,FreeLibrary将无法卸载我们的模块:
https://user-images.githubusercontent.com/16405698/55341156-a95fd100-5495-11e9-8df4-b8f73cb93223.PNG
在这种情况下,模块在"Hello"每次附加到流程以及"Bye!"分离时都会打印。注意:有一种官方支持的方法来执行相同的操作:GetModuleHandleExA带GET_MODULE_HANDLE_EX_FLAG_PIN标志调用。
"The module stays loaded until the process is terminated, no matter how many times FreeLibrary is called."
谢谢James Forshaw 学到了。。。 dll入口返回值0不好吗
页:
[1]