【问题标题】:How to correctly dispose of injected DLL thread?如何正确处理注入的 DLL 线程?
【发布时间】:2013-11-24 21:16:48
【问题描述】:

我正在将一个 DLL 注入目标进程以在玩 MMORPG 时充当助手(目前的功能是将按键转换为鼠标点击,因为 MMORPG 要求用户移动鼠标来实现某些功能,这是我鄙视的。 )

假设出于某种原因我想取消注入我的 DLL,我该怎么做呢?这个方法干净吗?

bool running = true;
while (running) // This is the only thread I'm using, and it is running in "realtime"
{
    // Do keyboard handing stuff in switch statement
    case keys.EscapeKey: // If the escape key is pressed
        running = false; // Set the running bool to false, and break the loop
        break;
}

这干净吗?线程结束了,我的 dll 本身是否“未注入”?还是它仍然徘徊并继续消耗我在注入时分配的内存?

谢谢 乔什

【问题讨论】:

  • 首先如何注入 DLL?
  • 使用 CreateRemoteThread
  • 嗯...如果你使用CreateRemoteThread“trick”,即:以LoadLibrary为起始地址启动一个线程,然后为你的代码启动一个新线程,我看不到HOW离开第二个线程将卸载您的 DLL。您应该使用 Process Explorer 进行检查...我猜 DLL 将永远存在...
  • 这就是我的想法,尽管人们可能期望主线程会像简单的控制台应用程序那样退出,如果它使用 void 而不是 int 作为 main 方法。 Shahriyar 的帖子符合我目前的期望,我还没有机会调试它,但希望今晚能这样做。如果你有兴趣,我会确认它。谢谢:)
  • 我很感兴趣,是的,但很确定 Shahriyar 的答案不是您需要的。 “在主线程结束时从进程中分离”对我来说是无稽之谈。

标签: c++ memory-management dll inject code-injection


【解决方案1】:

我假设您使用了 CreateRemoteThread,其起始地址设置为 LoadLibrary,并且您在注入的 DLL 的 DllMain 中启动了一个线程。

首先,在 DllMain DLL_PROCESS_ATTACH 中将 DLL 的 HMODULE 保存在一个全局变量中。

其次,当您希望线程退出并卸载 Dll 时,将此 HMODULE 传递给 FreeLibraryAndExitThread。

小心!你不能留下“活代码”,也就是说,没有回调地址传递给任何 API,如果在卸载后触发回调,那将立即崩溃(或更糟)。

【讨论】:

  • 由于该程序使用热键,我认为这些将包含在“生活代码”中,对吗?感谢您的回复,这似乎比 Shahriyar 的更具示范性,也更现实。我想我打算今晚找到这个,但希望有人能帮助我一些期待的事情。我会尝试这两种方法,希望一切顺利!再次感谢:)
  • 我不知道当按下热键并且线程被终止时 Windows 会如何反应,但是,是的,这就是可能引发崩溃的问题。
  • 看起来我的目标应用程序正在使用一些我需要调试的详细异常处理。目前没有任何事情没有处理,但我怀疑游戏客户端正在将异常发送到服务器上,在那里它将被远程处理。这是一些管理良好的软件,我只是诚实地尝试修补,让游戏对我个人来说更容易一些......
【解决方案2】:

基本上,当主线程结束时,Dll 会自动与进程分离,除非您将其发送到无限循环,所以是的,您做对了

您可以在DLL_PROCESS_DETACH 事件中放置一个MessageBox 以查看它是否被调用

【讨论】:

  • 这看起来就是答案!谢谢!
猜你喜欢
  • 2011-09-21
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多