如何检测隐藏进程

想知道如何像“进程资源pipe理器”或“组合修复”检测隐藏进程的应用程序? 我假设这必须在C或C ++中完成。 它很容易访问进程列表,即使在.NET中,但这并不总是准确的,我知道根工具包可以掩盖自己从任务pipe理器。 它是通过内存访问和IO吗? 好奇,如果有人知道这是如何完成的。

Solutions Collecting From Web of "如何检测隐藏进程"

这个问题不能回答。 这取决于这个过程如何被隐藏起来。 例如,某人可以通过将用户模式DLL注入到挂接EnumProcessesProcess32Next等的所有进程以及与进程枚举相关的所有其他API来隐藏进程。 这将跳过蹦床跳过钩。

但是,如果通过修改内核EPROCESS链表来隐藏进程,这个链表包含进程列表,那么就需要另一种方法来破坏执行隐藏的代码。 如果你定义你认为一个过程是“隐藏的”,也许我们可以建议如何检测它。 你认为哪些进程被隐藏,但仍然被Process Explorer发现?


也考虑到你所说的话,可能有多种方法来隐藏一个过程。 什么是一些常见的方法来检测这个?

问题是,如果你不知道你在找什么,几乎不可能找到它。 假设一个进程通过钩住EnumProcesses来隐藏自己的任务管理器。 你可能会认为这将是一个容易发现的情况。 但是,这个过程可能会通过各种不同的方式挂钩EnumProcesses 。 例如,在函数开始时的无条件钩子,IAT钩子,导致在EnumProcesses发生访问冲突,并用VEH捕获并修改EIP / RIP等等。即使在这种简单情况下,它也是不可能保证钩子的检测。 这一切都假设挂钩已经在用户模式下在特定的API上执行,并且代码不会试图隐藏自己的检测。

如果你正在寻找一般的指导方针,最好的方法可能是看看常见的绕行技巧。 一旦你知道一个方法是如何工作的,编写代码来检测这个操作是微不足道的。

也许如果你写这样的代码的动机,或者它的目的是什么,我们将能够更好地帮助你。


如果您正在寻找程序绕开其他进程的执行方式,通常通过以下两种方式之一:

  • 动态(运行时)迂回 – 这是更常见的方法,是库如Microsoft Detours使用的 。 这里是一个相关的论文,其中一个函数的前几个字节被覆盖,无条件分支到仪器。
  • (静态)二进制重写 – 对于rootkit而言,这是一种不太常见的方法,但是被研究项目所使用。 它允许通过静态分析和覆盖二进制来执行绕行。 用于Windows的旧版(不公开的)软件包是Etch。 本文从概念上提供了一个高层次的概念。

尽管Detours展示了一种动态绕行的方法,但业界还是有无数的方法,特别是在逆向工程和黑客领域。 这些包括上面提到的IAT和断点方法。 为了“为您指出正确的方向”,您应该看看在研究项目和逆向工程领域进行的“研究”。