是的,这是可能的.它被称为DLL弹出,并且是一些DLL注入器的特征.通常加载DLL的方式是通过LoadLibrary,然后通过FreeLibrary卸载它.FreeLibrary
只接受一个参数,该参数是要卸载的模块的句柄.如果你首先注入了DLL,你应该能够很容易地找到它.否则,有获得手柄等方式CreateToolHelp32Snapshot函数与进一步列举Module32First/Module32Next.假设您已通过某种方式获得句柄,那么弹出DLL的步骤很简单:
FreeLibrary
与GetProcAddress
.由于Windows的工作方式,此地址将与目标中相同功能的地址匹配.lpStartAddress
作为模块的句柄的地址FreeLibrary
,并lpParameter
作为模块的句柄DLL弹射有几个注意事项.
一般情况下应避免DLL弹出.如果库想要被释放的选项,它应该提供一些用户可以访问它的接口,最终通过它调用FreeLibraryAndExitThread.
如果您需要一个代码示例,我已经编写了一个弹射器作为我过去在C中编写的注入器的一部分.我可以搜索它并找到它但是它来自多年前并且代码质量不太可能是好.
你不想这样做。
“加载”DLL 不仅仅是打开(和锁定)文件。当 NT 加载程序启动可执行文件时,它会(递归地)处理映像引用的所有 DLL,并连接函数调用(递归地):加载 DLL、调用 DLL 初始化代码等。
卸载 DLL 意味着您需要停止所有加载 DLL 的进程,加载新的 DLL,并执行 NT 加载程序将执行的所有操作。当然,卸载和重新加载 DLL 需要恢复旧 DLL 的状态(初始化变量等),这是 Win32 中未指定的操作。
有关一些背景信息,请参阅MSDN 上的这篇文章和MSJ 中的 Under the Hood 文章。