我想从另一个进程卸载DLL.可能吗?
如果是的话,怎么做? (我正在使用Win32 API)
非常感谢你.
解决方法
是的,这是可能的.它被称为DLL弹出,并且是一些DLL注入器的特征.通常加载DLL的方式是通过
LoadLibrary,然后通过
FreeLibrary卸载.FreeLibrary只接受一个参数,该参数是要卸载的模块的句柄.如果你首先注入了DLL,你应该能够很容易地找到它.否则有一些方法可以获得句柄,例如
CreateToolHelp32Snapshot,并进一步枚举
Module32First/
Module32Next.假设您已通过某种方式获得句柄,那么弹出DLL的步骤很简单:
>使用GetProcAddress获取FreeLibrary的地址.由于Windows的工作原理,此地址将与目标中相同功能的地址匹配.
>在目标进程上调用CreateRemoteThread,指定lpStartAddress作为FreeLibrary的地址,并使用lpParameter作为模块的句柄
DLL弹射有几个注意事项.
>您应该只弹出一个DLL,您确定将来不会再使用任何代码.如果任何动态链接的代码在释放代码后尝试调用代码,则很可能会触发某种形式的页面访问冲突.
>在出于类似原因执行弹出时,应确保DLL内的代码中没有执行任何线程.
一般情况下应避免DLL弹出.如果库想要被释放的选项,它应该提供一些用户可以访问它的接口,最终通过它调用FreeLibraryAndExitThread.
如果您需要一个代码示例,我已经编写了一个弹射器作为我过去在C中编写的注入器的一部分.我可以搜索它并找到它但是它来自多年前并且代码质量不太可能是好.