557 字
3 分钟
通过DOKM操作实现程序切换用户

本文以cmd为例,将它改为System账号

原理#

每个程序都有一个EPROCESS结构体,每个程序的EPROCESS都有一个 Token,它定义了该进程的安全上下文(用户身份、权限等),我们可以通过WinDbg来对它进行修改

安装和配置WinDbg#

从Windows应用商店或官网下载WinDbg并安装

安装完后以管理员身份运行cmd,运行命令

bcdedit -debug on

至此WinDbg安装完毕,并且本地内核调试功能开启

获取System用户令牌#

打开WinDbg,点击左上角文件,在Start debugging栏处有Attach to kernel 选项,点击它,在最右侧栏处有一个Local选项点击它,再点击OK,就是点击文件后再“Start debugging” → “Attach to kernel” → “Local” → “OK”

此时会显示命令行,我们可以通过任务管理器得知System进程的PID是4,而它的HEX也是4

我们可以用以下命令输出System进程的详细信息(4指进程pid的16进制,1表示输出信息的详细程度,而1输出的信息正好包含用户Token)

!process 4 1

输出的Token部分就是这个进程的用户令牌,我们把它记录下来,例如我的是86e03b80

获得cmd的EPROCESS地址和token偏移量#

我以cmd为例,运行cmd,运行命令

whoami

可以查看运行cmd的用户,为非System用户。

打开任务管理器,查看cmd进程的pid,并转化为16进制,例如我的转换后是1BF2

切回WinDbg,输入命令(把1BF2换成你所获得的用户令牌)

!process 1BF2 0

从PROCESS栏处获得cmd的EPROCESS地址,例如我的是9b06b900

dt _eprocess -ny token

获得token偏移量,例如我的是+0x0fc

写入内存#

最后输入命令(把9b06b900改成你获得的程序EPROCESS地址,把+0x0fc改成你获得的token偏移量,把86e03b80改成你获得的用户token

eq 9b06b900+0x0fc 86e03b80

直接写入内存

再次切换回cmd输入命令whoami可以看到cmd的用户已经被改为system

以此类推其他用户和进程也可以用此方法

通过DOKM操作实现程序切换用户
https://fuwari.vercel.app/posts/e9809ae8bf87dokme6938de4bd9ce5ae9ee78eb0e7a88be5ba8fe58887e68da2e794a8e688b7798/
作者
Emnasop
发布于
2025-06-08
许可协议
CC BY-NC 4.0