yanaying 发表于 2020-5-31 09:46

使您的动态模块不可释放(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

雨落惊鸿, 发表于 2020-5-31 10:55

学到了。。。

JuncoJet 发表于 2020-5-31 11:17

dll入口返回值0不好吗
页: [1]
查看完整版本: 使您的动态模块不可释放(Anti-FreeLibrary)