将线程标识为“远程线程”

4

我正在开发一个分析其他进程行为的程序。
它检查CPU,内存使用情况,线程创建和销毁等等。但是,不幸的是,我的电脑上安装了一款杀毒软件,它会在被检查的进程中创建一个远程线程。这个远程线程并不真正属于该进程,因此我希望在检查进程时完全忽略它。

有没有一种方法(用C++实现),可以将一个线程标识为“远程线程”?


3
卸载病毒。(是的,我知道你说的是杀毒软件,但在我看来,一个安装了线程到每个进程的杀毒软件本身就是一个病毒。) - Jerry Coffin
2
好的,但是...假设我的客户真的喜欢他的病毒,不想卸载。我能不能以某种方式检测线程是否为远程线程? - Idov
假设我的客户真的很喜欢他的病毒 - LOL - chris
如果你检查CPU、内存使用等,你不能忽略这个线程或其他线程。 - sm3
但是我将不得不钩入注入进程,不是吗?因为它是调用“CreateRemoteThread”的进程。 - Idov
显示剩余2条评论
2个回答

8

在内部,使用CreateThread创建的线程和使用CreateRemoteThread创建的线程没有区别。(实际上,CreateThread会调用CreateRemoteThread,并将GetCurrentProcess()作为目标进程传递。)如果您想区分这些线程,您需要使用启发式方法。


8
如果您愿意进入内核模式,PsSetCreateThreadNotifyRoutine 可能会对您有用。根据Uninformed的说法,它在正在创建或终止线程的进程上下文中被调用。我还在其他地方看到过这个建议。
我终于测试了一下,它能正常工作。您应该注意,由于Windows自身进行了一些注入,因此会出现许多误报。<EDIT>实际上,这是因为在创建进程时,首个线程将在父进程的上下文中创建。只需消除第一个线程的创建即可得到相当好的指示。</EDIT>
主要缺点(除了需要编写驱动程序)是您需要看到创建发生,因此您的进程需要先启动。
或者,如上所述,堆栈跟踪、加载的模块和所有相关的信息都可以运用到启发式算法中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接