如何检测隐藏进程

时间:2012-01-14 21:19:27

标签: c++ c windows

想知道像“Process Explorer”或“Combo Fix”这样的应用程序如何检测隐藏进程???我假设这必须用C或C ++完成。即使在.NET中也很容易访问进程列表但是这并不总是准确的,我知道root工具包可以从任务管理器中屏蔽自己。是通过内存访问和IO?好奇,如果有人知道这是如何完成的。

1 个答案:

答案 0 :(得分:10)

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

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


  

还考虑到你所说的可能有的   隐藏进程的多种方法。有哪些常见的方法   检测到这个?

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

如果您正在寻找一般指导方针,最好的方法可能是看看常见的迂回技术。一旦你知道一个方法是如何工作的,编写代码来检测操作是很容易的。

也许如果你有动力写这种代码或者它会起什么作用,我们就能够更好地帮助你。


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

  • 动态(运行时)绕行 - 这是更常用的方法,也是Microsoft Detours等库使用的方法。这是一篇相关论文,其中函数的前几个字节被覆盖,无条件地分支到仪器。
  • (静态)二进制重写 - 这是一种不太常见的rootkit方法,但是被研究项目使用。它允许通过静态分析和重写二进制来执行绕行。用于执行此操作的Windows的旧(非公开可用)程序包是Etch。 This paper提供了概念上如何运作的高级视图。

尽管Detours演示了一种动态绕行方法,但业内使用了无数种方法,特别是在逆向工程和黑客攻击领域。这些包括我上面提到的IAT和断点方法。为了“为你指明正确的方向”,你应该看看在研究项目和逆向工程领域进行的“研究”。