【问题标题】:How to unload an injected DLL from target process, from the DLL when done?完成后如何从 DLL 中从目标进程中卸载注入的 DLL?
【发布时间】:2012-07-30 06:12:54
【问题描述】:

我有一个使用 CreateRemoteThread/LoadLibrary 方法注入自身的 DLL。

在调试和开发 DLL 时,退出目标应用程序并重新启动它(它的加载时间为 10-20 秒)很麻烦,所以我想在检查我的代码是否有效后卸载 DLL , 重新编译/重新注入它。

我想避免创建一个带有用于加载和卸载该 DLL 的框架的新 DLL。

这怎么可能?

【问题讨论】:

  • 您需要执行与注入代码以加载库时相同的方式,不同之处在于您需要注入代码以在其自己的进程上下文中卸载库。在不再需要库后注入代码。这应该在您仍然可以控制的最后一个函数中完成。但是,您将需要汇编知识来制作 library unloader 代码。
  • 它是什么类型的 DLL?并且您可以控制调用应用程序吗?如果是 COM,您可以了解引用计数。如果你能控制宿主,只要释放它并调用FreeLibrary()
  • @Deanna:没错,就是这么简单!
  • 我可以控制进行注入的进程,但不能控制被注入的进程。我的下一个问题是,我从 DllMain 生成一个线程来完成它的工作,当我告诉线程结束时,我是否最后调用 FreeLibrary(GetModuleHandle(L"My.dll"))?

标签: winapi visual-c++ dll dll-injection


【解决方案1】:

如果DllMain 产生一个线程,并且当该线程完成了它正在做的任何事情时,您可以使用FreeLibraryAndExitThread

FreeLibraryAndExitThread 函数允许在 DLL 中执行的线程安全地释放它们正在执行的 DLL 并自行终止。 如果他们分别调用 FreeLibrary 和 ExitThread,就会存在竞争条件。可以在调用 ExitThread 之前卸载库。

从那句话中,我用简单的英语声明你不应该不要从 DllMain 中调用这个函数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 2015-12-01
    • 1970-01-01
    相关资源
    最近更新 更多