【问题标题】:What is the proper way to use CreateRemoteThread to inject code into another process in Delphi?在 Delphi 中使用 CreateRemoteThread 将代码注入另一个进程的正确方法是什么?
【发布时间】:2012-08-30 09:52:32
【问题描述】:

我在this blog 上读到,sysinernals 使用CreateRemoteThread()ExitProcess 注入另一个进程以终止它。这是真的吗?而且,如果是的话,有人可以告诉我如何在我的 Delphi 应用程序中执行此操作吗?我想终止启动我的应用程序的进程。

【问题讨论】:

  • 1.获取其他进程的PID。 2. 调用 OpenProcess 获取进程句柄。传递 CreateRemoteThread 文档中指定的访问标志。 3.调用CreateRemoteThread传递目标进程地址空间中ExitProcess的地址。这是棘手的部分。
  • 无论如何,这一切都毫无意义。只需致电TerminateProcess
  • @DavidHeffernan 我只是想让黑客们头疼。调用TerminateProcess 会很容易被拦截。你不同意吗?
  • 容易吗?为什么它比阻塞远程线程更容易?无论如何,黑客是从哪里来的?此外,没有真正的证据表明 Process Explorer 使用了CreateRemoteThread。博客上的某个随机人说他怀疑这一点,而您将其视为事实。
  • 不,我认为黑客仍然会破解您的应用程序。不管你做什么,如果这样做有价值,你就会被黑。只要确保您不会让诚实的付费客户的生活变得尴尬。没有必要阻止黑客攻击并赶走那些付钱给你的客户!

标签: multithreading delphi winapi ipc


【解决方案1】:

您在此处提出的问题已在此博客文章中得到解答:http://private-storm.de/2009/08/11/case-terminateprocess/

这包括 Delphi 源代码。由于某种原因,该代码启用了SE_DEBUG_NAME 权限,这不是必需的。

这种方法的难点在于在目标应用中定位ExitProcess的地址。本文中的代码假定它与您自己的进程中的地址相同。这很可能是真的,但并非总是如此。例如,如果您的进程是 64 位进程而目标进程是 32 位进程,那么它就不是真的。或者,如果目标进程的基地址不允许 kernel32 在其首选地址加载。

另一个问题是如果你的进程是 32 位的,而目标进程是 64 位的。在那种情况下,我相信CreateRemoteProcess 的把戏根本就失败了。

总而言之,我会使用TerminateProcess

【讨论】:

  • 唯一的问题是(正如预期的那样)在启用 UAC 时它需要提升才能正确运行
  • 这可能是SE_DEBUG_NAME 部分。就在昨天,我编写了一个调用 CreateRemoteThread 的 Delphi 应用程序,并且工作得非常好,没有提升。
  • 没错。也许不需要那条线;-)。我评论了它,一切都很完美。
  • 这是我昨天问的一个问题:stackoverflow.com/questions/12180732/…
猜你喜欢
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
  • 2011-10-12
相关资源
最近更新 更多