EPROCESS 中进程的令牌为系统令牌,从而提升进程的权限。该驱动设计为与一个用户态应用程序配合使用,该应用程序通过 IOCTL 向驱动发送进程 ID。当进程创建时,它会继承创建者的用户令牌。系统使用该令牌来决定进程可以执行哪些操作。令牌包含用户的安全标识符 (SID)、组成员身份和特权信息。

Token 成员位于 _EPROCESS 结构体(表示进程对象的数据结构)的偏移量 0x4b8 处。Token 成员定义在 _EX_FAST_REF 结构体中,这是一个联合类型,根据指针大小可以存储指向内核对象的指针或引用计数。_EX_FAST_REF 结构体在 _EPROCESS 中的偏移量取决于所使用的 Windows 具体版本,但在最近的 Windows 版本中通常位于 0x4b8 偏移处。
Windows 构建版本号对于 x64 和 x86 架构的令牌偏移量

Windows 中的 _EX_FAST_REF 结构体包含三个成员:Object、RefCount 和 Value

要显示 _EX_FAST_REF 中的进程令牌,我们传递包含令牌的 _EX_FAST_REF 结构体地址,该结构体通常位于 _EPROCESS 结构体的偏移量 0x4b8 处。

你可以启动一个特权进程,或者提升一个已存在的进程 ID 的权限。

为了便于解释,我们将重点放在第二选项上,并以 CMD 为例

继承的令牌

通过 IOCTL 将进程 ID 发送给驱动

从用户态应用程序接收到 PID 后,驱动使用该 PID 获取目标进程 _EPROCESS 结构体的指针。然后驱动访问 _EPROCESS 结构体中的 Token 成员,获取进程令牌的指针,并将其替换为系统令牌,从而将进程的安全上下文更改为系统安全上下文。但是,如果驱动未正确找到 _EPROCESS 结构体内的 Token 成员,或者 Token 的偏移量不是 0x4b8,则驱动可能导致系统或目标进程崩溃。此问题将在后续更新中修复。

cmd 令牌修改后

进程的特权、组、权限

| x64 偏移量 | x86 偏移量 |
|---|
| 0x0160 (late 5.2) | 0x0150 (3.10) |
| 0x0168 (6.0) | 0x0108 (3.50 to 4.0) |
| 0x0208 (6.1) | 0x012C (5.0) |
| 0x0348 (6.2 to 6.3) | 0xC8 (5.1 to early 5.2) |
| 0x0358 (10.0 to 1809) | 0xD8 (late 5.2) |
| 0x0360 (1903) | 0xE0 (6.0) |
| 0x04B8 | 0xF8 (6.1) |
| 0xEC (6.2 to 6.3) | |
| 0xF4 (10.0 to 1607) | |
| 0xFC (1703 to 1903) | |
| 0x012C |