如何在Windows中识别进程?内核和用户模式

时间:2014-05-03 19:01:36

标签: windows process kernel access-control

在Windows中,唯一标识流程的正式方法是什么?我不是在谈论动态分配的PID,而是一个唯一的ID或一个对该过程来说永久的名称。我知道每个程序/进程都有一个安全描述符,但它似乎为登录用户和组(不是进程)保存SID。我们不能使用流程开始的可执行文件的路径和名称,因为它可以改变。

我的目标是在内核模式中识别进程并允许它执行某些操作。这样做最简单,最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

你的问题太模糊,无法正确回答。例如如何路径可能会在创建进程后改变(不在内核内存中进行调整)?是的,我知道可以在创建进程期间挂钩内存映射进程,以替换最初注定要加载另一个的映像。重点是进程只是运行给定可执行文件的一个实例。而且还不清楚你想在这里反击的确切篡改企图。

但是从内核模式,你能够简单地使用指向EPROCESS structure的指针。不需要使用PID,虽然这将是唯一的,而过程仍然存在。

因此,假设您的流程使用IRP与驱动程序进行通信(无论是WriteFileReadFileDeviceIoControl还是更具异国情调的东西),为了进行自我注册,您可以使用IoGetCurrentProcess获取该流程唯一PEPROCESS值。

虽然结构本身没有正式记录,但可以从" Windows Internals"中收集提示。书(在其各种版本中),WinDbg(和朋友)中的dt(显示类型)命令以及互联网上的第三方资源(例如here, specific to Vista)。

过程对象保存在多个链接列表中。因此,如果您知道特定操作系统版本的(官方未记录的!!!)布局,您可以遍历列表以从一个到另一个过程对象(即EPROCESS结构)。

警示说明

确保使用相应的对象管理器例程引用进程的对象。否则你无法确定它们是否安全到达这些结构(这无论如何不安全,因为你不能依赖它们在OS版本中的布局)或将它传递给期望PEPROCESS的函数。 / p>

作为旁注:Harry Johnston当然有权断言特权用户可以将任意(几乎任意)代码插入TCB以阻止您的保护措施。最终它将成为军备竞赛。

还要记住,与PID类似,理论上PEPROCESS的值可以回收。但在这两种情况下,您都可以通过使驱动程序中保留的任何内部状态无效来解决这个问题,这种状态允许进程在进程停止时发挥其魔力。使用类似PsSetCreateProcessNotifyRoutine之类的东西似乎是一种很好的方法。要将您的流程处理从回调转换为PEPROCESS值,请使用ObReferenceObjectByHandle

反对PID / PEPROCESS的回收的另一种方法是保持对过程对象的引用,从而使其保持一种不死状态(类似于在用户模式下不关闭句柄),尽管主线程可能已经完成。