我想从另一个进程卸载 DLL。是否可以?
如果是,该怎么做? (我使用的是Win32 API)
非常感谢。
是的,这是可能的。它称为 DLL 弹出,某些 DLL 注入器具有该功能。通常加载 DLL 的方式是通过加载库 http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175%28v=VS.85%29.aspx随后通过卸载免费图书馆 http://msdn.microsoft.com/en-us/library/windows/desktop/ms683152%28v=vs.85%29.aspx. FreeLibrary
仅采用一个参数,即要卸载的模块的句柄。如果您首先注入了 DLL,您应该能够很容易地找到它。否则有一些方法可以获取句柄,例如创建ToolHelp32Snapshot http://msdn.microsoft.com/en-us/library/windows/desktop/ms682489%28v=vs.85%29.aspx进一步枚举模块32第一 http://msdn.microsoft.com/en-us/library/windows/desktop/ms684218%28v=VS.85%29.aspx/模块32下一个 http://msdn.microsoft.com/en-us/library/windows/desktop/ms684221%28v=VS.85%29.aspx。假设你已经通过某种方式获得了句柄,那么弹出DLL的步骤很简单:
- 获取地址
FreeLibrary
with GetProcAddress
。由于 Windows 的工作方式,该地址将与目标中相同函数的地址相匹配。
- Call 创建远程线程 http://msdn.microsoft.com/en-us/library/windows/desktop/ms682437%28v=vs.85%29.aspx在目标进程上,指定
lpStartAddress
作为地址FreeLibrary
, 与lpParameter
作为模块的句柄
DLL 弹出有几个注意事项。
- 您应该只弹出您确定将来不会再有代码使用的 DLL。如果任何动态链接的代码在释放后尝试调用您的代码,则很可能会触发某种形式的页面访问冲突。
- 您应该确保在出于类似原因执行弹出时,DLL 代码中没有线程正在执行。
一般情况下应避免 DLL 弹出。如果库想要有被释放的选项,它应该提供一些用户可以访问它的接口,通过这些接口最终调用自由库和退出线程 http://msdn.microsoft.com/en-us/library/windows/desktop/ms683153%28v=vs.85%29.aspx.
如果您需要这方面的代码示例,我已经编写了一个喷射器,作为我过去用 C 编写的注入器的一部分。我可以搜索它并找到它,但它来自很多年前,代码质量不太可能好的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)