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
相关产品推荐
相关产品推荐

