【问题标题】:how to identify thread from another process如何从另一个进程中识别线程
【发布时间】:2021-12-04 13:13:53
【问题描述】:

线程的起始地址总是在变化,threadid也总是在变化,我试图从另一个进程中杀死一个线程如果可能的话如何识别我想要杀死的线程我想要一些代码示例!

【问题讨论】:

  • 我正在尝试从另一个进程中杀死一个线程不要这样做,那是非常危险的。相反,想办法礼貌地要求线程停止做它正在做的任何事情并干净地退出。
  • 我知道这很危险,但在我的情况下没关系,无论如何如何要求线程停止做它正在做的事情?
  • 还有其他方法可以识别线程吗?我可以搜索一些功能来执行您所说的操作,但是我如何识别我想要停止的线程?
  • 线程必须配合。如果您希望另一个进程告诉它停止,您将需要使用某种 IPC 机制(例如 named pipe)向它传递命令。您需要阅读 Windows 支持的各种 IPC 机制,以确定最适合您的用例。
  • 您是否有权访问要终止其线程的程序的源代码?如果你这样做了,那么你应该能够重新编程它以优雅地响应终止请求。如果您无权访问源代码,那么您可能确实必须终止线程。

标签: c++ windows


【解决方案1】:

没有任何东西可以从外部“识别”线程。您可以枚举一个进程的线程,但给您的只是线程 ID 列表,仅此而已。因此,您必须提前“知道”您想要的特定线程 ID,即目标进程是否将其提供给您。否则你就瞎了。

【讨论】:

  • 感谢您的澄清,我可以这样做吗:dwGetModuleBaseAddress(ntdll.dll!RtlUserThreadStart + hexValue) = threadStartAddress 我试图获取 ntdll.dll!RtlUserThreadStart 的基地址,但它失败了我可以获得 ntdll 地址但不是 ntdll.dll!RtlUserThreadStart如果我错了,请纠正我,我对这一切还是新手
【解决方案2】:

您可以使用函数CreateToolhelp32Snapshot创建某个进程的快照,然后使用函数Thread32FirstThread32Next遍历该快照中所有线程的列表。有关示例,请参阅 Microsoft 官方文档中的以下页面:

Traversing the Thread List

找到要终止的线程后,您可以使用OpenThread 打开它并在其上调用TerminateThread

但是,在您决定这样做之前,我强烈建议您阅读函数 TerminateThread 的文档(链接见上文)。如文档中所述,终止线程是一件非常冒险的事情,通常不建议这样做。

【讨论】:

  • 我有终止线程的功能,但我需要确定我想终止的线程i.imgur.com/5jd4iV6.png
  • @AhmedMahmoud 您的函数正在为每个与您的StartAddress 参数不匹配的线程泄漏HANDLE
  • 我修好了,谢谢!
猜你喜欢
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多