You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinDbg内核调试:监控CMD.exe父进程创建子进程的方法问询

WinDbg内核调试:监控CMD.exe创建的子进程

关于PsAttributeParentProcess的说明

PsAttributeParentProcess是进程属性列表中的一个属性项,它存储的是父进程EPROCESS结构的指针,既不是进程ID也不是进程名。EPROCESS是内核中描述进程的核心数据结构,包含了进程名、PID、内存信息等所有进程相关的元数据。

编写条件断点的核心思路

要实现需求,需要从NtCreateUserProcess的参数中提取父进程的EPROCESS指针,然后读取该结构中的进程名字段,判断是否为cmd.exe,最后用j命令实现分支逻辑:匹配则打印提示,不匹配则直接继续调试。

完整的条件断点命令

以下是适配多数Windows版本的命令(注意:不同系统版本的栈偏移、结构偏移可能有变化,需自行验证):

bp nt!NtCreateUserProcess "r @$t0 = poi(poi(rsp+38)+10); r @$t1 = (nt!_EPROCESS*)@$t0; j (wcscmp(L\"cmd.exe\", (wchar_t*)&@$t1->ImageFileName) == 0) '.printf \"[监控触发] CMD.exe创建子进程,父进程EPROCESS: %p\\n\", @$t1' 'g'"

命令拆解

  • rsp+38:对应NtCreateUserProcess函数的ProcessAttributes参数在栈上的偏移(可通过u nt!NtCreateUserProcess反汇编确认)
  • poi(poi(rsp+38)+10):从进程属性列表中取出PsAttributeParentProcess对应的EPROCESS指针(PS_ATTRIBUTE结构的Value字段偏移为0x10,可通过dt nt!_PS_ATTRIBUTE确认)
  • @$t0/@$t1:WinDbg的临时寄存器,用于存储中间值,避免重复计算
  • wcscmp(L"cmd.exe", ...):比较宽字符进程名(内核中ImageFileName是16字节的Unicode字符串)
  • j命令逻辑:如果进程名匹配,执行打印命令;不匹配则执行g直接继续调试

注意事项

  • 必须确保符号加载正确,执行.symfix; .reload加载微软官方符号,否则无法正确访问EPROCESS和PS_ATTRIBUTE的字段
  • 不同Windows版本(如Win10/Win11不同 build)的参数偏移、结构偏移可能不同,需自行验证调整
  • 如果需要断点触发后自动继续,可在打印命令后追加;g,否则断点会暂停在NtCreateUserProcess处

内容的提问来源于stack exchange,提问作者user1939837

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 03:07:25