【问题标题】:Identifying a thread as a "Remote thread"将线程标识为“远程线程”
【发布时间】:2013-01-26 16:57:09
【问题描述】:

我正在开发一个流程,该流程会分析另一个流程的功能。
它检查 CPU、内存使用、线程创建和死亡等。 不幸的是,我的计算机上安装了一个防病毒软件,它在我检查的进程中创建了一个远程线程。这个远程线程并不是进程的一部分,所以我想在检查进程时完全忽略这个线程。

有没有办法(在 C++ 中)允许我们将线程识别为“远程线程”?

【问题讨论】:

  • 卸载病毒。 (是的,我知道您说的是防病毒软件,但 IMO,在每个进程中安装一个线程本身就是病毒)。
  • 好的,但是...假设我的客户真的很喜欢他的病毒并且不想卸载。我不能以某种方式检测一个线程是否是远程线程吗?
  • 假设我的客户真的很喜欢他的病毒 - 哈哈
  • 如果你检查 CPU、内存使用等,你不能忽略这个线程或其他线程。
  • @sergmat:是的,但我也在检查其他事情,为此我想忽略这个线程。另外我可能想显示每个线程的数据,我不想显示远程线程的数据。

标签: c++ windows multithreading


【解决方案1】:

如果你愿意去内核模式PsSetCreateThreadNotifyRoutine你可能会感兴趣。根据Uninformed,它是在'正在创建或终止线程'的进程的上下文中调用的。我也看到了这个建议elsewhere

我开始测试它,它工作正常。 您应该注意,您会看到一些误报,因为 Windows(不出所料)自己会进行一些注入。 这实际上是因为在创建第一个线程时创建了它将在父进程的上下文中完成。简单地消除第一个线程创建,这给出了一个很好的指示。 编辑>

主要缺点(除了必须编写驱动程序)是您需要看到创建发生,因此您的流程需要首先启动。

另外,如前所述,涉及堆栈跟踪、加载的模块和所有好东西的启发式方法会发挥作用。

【讨论】:

    【解决方案2】:

    在内部,使用CreateThread 创建的线程和使用CreateRemoteThread 创建的线程之间没有区别。 (其中CreateThread基本上调用CreateRemoteThread并将GetCurrentProcess()作为目标进程传递。)如果要区分线程,则必须使用启发式。

    【讨论】:

      猜你喜欢
      • 2010-09-15
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多