我可以从另一个进程卸载DLL吗?的(Win32)

Jac*_*Bui 3 dll winapi

我想从另一个进程卸载DLL.可能吗?如果是的话,怎么做?(我正在使用Win32 API)

非常感谢你.

Mik*_*wan 7

是的,这是可能的.它被称为DLL弹出,并且是一些DLL注入器的特征.通常加载DLL的方式是通过LoadLibrary,然后通过FreeLibrary卸载它.FreeLibrary只接受一个参数,该参数是要卸载的模块的句柄.如果你首先注入了DLL,你应该能够很容易地找到它.否则,有获得手柄等方式CreateToolHelp32Snapshot函数与进一步列举Module32First/Module32Next.假设您已通过某种方式获得句柄,那么弹出DLL的步骤很简单:

  • 获取的地址FreeLibraryGetProcAddress.由于Windows的工作方式,此地址将与目标中相同功能的地址匹配.
  • 在目标进程上调用CreateRemoteThread,指定lpStartAddress作为模块的句柄的地址FreeLibrary,并lpParameter作为模块的句柄

DLL弹射有几个注意事项.

  • 您应该只弹出一个DLL,您确定将来不会再使用任何代码.如果任何动态链接的代码在释放代码后尝试调用代码,则很可能会触发某种形式的页面访问冲突.
  • 您应该确保在DLL的代码中没有执行任何线程,同时由于类似的原因执行弹出.

一般情况下应避免DLL弹出.如果库想要被释放的选项,它应该提供一些用户可以访问它的接口,最终通过它调用FreeLibraryAndExitThread.

如果您需要一个代码示例,我已经编写了一个弹射器作为我过去在C中编写的注入器的一部分.我可以搜索它并找到它但是它来自多年前并且代码质量不太可能是好.


dev*_*vio 3

你不想这样做。

“加载”DLL 不仅仅是打开(和锁定)文件。当 NT 加载程序启动可执行文件时,它会(递归地)处理映像引用的所有 DLL,并连接函数调用(递归地):加载 DLL、调用 DLL 初始化代码等。

卸载 DLL 意味着您需要停止所有加载 DLL 的进程,加载新的 DLL,并执行 NT 加载程序将执行的所有操作。当然,卸载和重新加载 DLL 需要恢复旧 DLL 的状态(初始化变量等),这是 Win32 中未指定的操作。

有关一些背景信息,请参阅MSDN 上的这篇文章MSJ 中的 Under the Hood 文章