【问题标题】:How to identify a process in Windows? Kernel and User mode如何识别Windows中的进程?内核和用户模式
【发布时间】:2014-06-20 08:21:07
【问题描述】:

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

我的目标是在内核模式下识别一个进程并允许它执行某些操作。最简单、最好的方法是什么?

【问题讨论】:

  • 我不认为有你所说的那样的唯一标识符,尽管我相信只要进程对象存在(即使进程已经退出)进程 ID 将保持唯一。允许特定进程执行特定操作的最佳方式取决于操作是什么,但我认为最简单的通用解决方案是提供一个或多个 IOCTL;设备驱动程序可以在代表用户模式进程采取适当的操作之前执行它喜欢的任何安全检查。
  • 请记住,限制对特定进程而不是特定用户的访问并不能提供太多额外的安全性,因为拥有该进程的用户(或任何管理员)可以很容易地插入外部代码。跨度>
  • 感谢您的回答(并对延迟响应表示抱歉):) 我打算做的是唯一标识一个二进制文件。如果二进制文件在存储中移动到不同的路径,我仍然应该能够识别它。某种 ID 直接内置在其中,因此普通用户无法更改它。这有助于识别某些第三方开发人员,甚至是内部二进制文件。

标签: windows process kernel access-control


【解决方案1】:

您的问题太模糊,无法正确回答。例如如何在创建进程之后可能改变路径(无需在内核内存中四处寻找)?是的,我知道在进程创建期间可以挂钩到内存映射过程,以替换原本注定要加载的图像。关键是进程只是运行给定可执行文件的一个实例。而且还不清楚您要在此处反击哪些确切的篡改尝试。

但在内核模式下,您确实可以简单地使用指向EPROCESS structure 的指针。不需要使用 PID,尽管它是唯一的进程仍然存在。

因此假设您的进程使用 IRP 与驱动程序通信(无论是 WriteFileReadFileDeviceIoControl 还是更奇特的东西),为了注册自己,您可以使用 IoGetCurrentProcess 来获取PEPROCESS 值对于进程来说是唯一的

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

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

注意事项

确保通过使用相应的对象管理器例程来引用进程的对象。否则,您无法确定进入这些结构是否安全(这无论如何都是不安全的,因为您不能依赖它们跨操作系统版本的布局)或将其传递给需要 PEPROCESS 的函数。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    相关资源
    最近更新 更多