为什么TeminateProcess的断点无法命中。
Windows内核调试
为什么TeminateProcess的断点无法命中。
wrong
2011-02-15, 17:30 下午
使用windbg attach一个notepad,然后使用
bp kernel32!terminateprocess,使用bl查看一切OK。
再使用g命令运行notepad,关闭notepad,windbg中显示程序已经关闭,断点没有命中。我在xp上和win7都试过了,感觉这个断点设和没设效果一样,有人碰到过类似的情况嘛?
0:000> bl
0 e 77e616b8 0001 (0001) 0:**** kernel32!TerminateProcess
0:000> g
关闭notepad直接显示,没有断点命中。
eax=00000000 ebx=00000000 ecx=ffffffff edx=00000000 esi=77f7663e edi=00000000
eip=7ffe0304 esp=0006fdf8 ebp=0006fef0 iopl=0 nv up ei pl nz na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000202
SharedUserData!SystemCallStub+0x4:
7ffe0304 c3 ret
Re: 为什么TeminateProcess的断点无法命中。
Thomson
2011-02-15, 18:50 下午
那可能不是通过这个API结束的吧. 像下面的stack,就没有通过kernel32!TerminateProcess
ntdll!ZwTerminateProcess
ntdll!RtlExitUserProcess
msvcrt!doexit
notepad!__mainCRTStartup
kernel32!BaseThreadInitThunk
ntdll!RtlUserThreadStart
Re: 为什么TeminateProcess的断点无法命中。
wrong
2011-02-15, 21:08 下午
贴一下我的call stack, xp下面的。
0:000> bl
0 e 77e616b8 0001 (0001) 0:**** kernel32!TerminateProcess
0:000> g
eax=00000000 ebx=00000000 ecx=ffffffff edx=00000000 esi=77f7663e edi=00000000
eip=7ffe0304 esp=0006fdf8 ebp=0006fef0 iopl=0 nv up ei pl nz na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000202
SharedUserData!SystemCallStub+0x4:
7ffe0304 c3 ret
0:000> kv
ChildEBP RetAddr Args to Child
0006fdf4 77f7664a 77e798ec ffffffff 00000000 SharedUserData!SystemCallStub+0x4 (FPO: [0,0,0])
0006fdf8 77e798ec ffffffff 00000000 77e7ad86 ntdll!NtTerminateProcess+0xc (FPO: [2,0,0])
0006fef0 77e7990f 00000000 77e8f3b0 ffffffff kernel32!_ExitProcess+0x57 (FPO: [Non-Fpo])
0006ff04 77c379c8 00000000 77c37ad9 00000000 kernel32!TerminateProcess (FPO: [Non-Fpo])
0006ff0c 77c37ad9 00000000 00000000 77c37aea msvcrt!__crtExitProcess+0x2f (FPO: [1,0,0])
0006ff18 77c37aea 00000000 00000000 00000000 msvcrt!_cinit+0xe4 (FPO: [2,0,1])
0006ff28 01006c65 00000000 70a71a29 80000002 msvcrt!exit+0xe (FPO: [1,0,1])
0006ffc0 77e814c7 70a71a29 80000002 7ffdf000 notepad!WinMainCRTStartup+0x185 (FPO: [Non-Fpo])
0006fff0 00000000 01006ae0 00000000 78746341 kernel32!BaseProcessStart+0x23 (FPO: [Non-Fpo])
能看到xp下面确实有TeminateProcess的,但是没有断进去。
win7下确实没有。
000ffc40 77775b7c 777937f6 ffffffff 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0])
000ffc44 777937f6 ffffffff 00000000 00490e78 ntdll!ZwTerminateProcess+0xc (FPO: [2,0,0])
000ffc60 770e2b03 00000000 77e8f3b0 ffffffff ntdll!RtlExitUserProcess+0x85 (FPO: [Non-Fpo])
000ffc74 769836dc 00000000 000ffcb8 76983372 kernel32!ExitProcessStub+0x12 (FPO: [1,0,0])
000ffc80 76983371 00000000 652b2df1 001fc25c msvcrt!__crtExitProcess+0x17 (FPO: [Non-Fpo])
000ffcb8 769836bb 00000000 00000000 00000000 msvcrt!_cinit+0xea (FPO: [Non-Fpo])
000ffccc 001f1705 00000000 6524911d 00000000 msvcrt!exit+0x11 (FPO: [Non-Fpo])
000ffd50 770e1194 7ffdf000 000ffd9c 7778b429 notepad!_initterm_e+0x1b6 (FPO: [Non-Fpo])
000ffd5c 7778b429 7ffdf000 778276ee 00000000 kernel32!BaseThreadInitThunk+0xe (FPO: [Non-Fpo])
000ffd9c 7778b3fc 001f3689 7ffdf000 00000000 ntdll!__RtlUserThreadStart+0x70 (FPO: [Non-Fpo])
000ffdb4 00000000 001f3689 7ffdf000 00000000 ntdll!_RtlUserThreadStart+0x1b (FPO: [Non-Fpo])
Re: 为什么TeminateProcess的断点无法命中。
wrong
2011-02-15, 21:40 下午
仔细看下XP的call stack,有个很奇怪的地方,
0006ff04 77c379c8 00000000 77c37ad9 00000000 kernel32!TerminateProcess (FPO: [Non-Fpo])
是kernel32!TerminateProcess,而不是kernel32!TerminateProcess+0x??,在什么样的情况下会这样?至少应该有个函数序言啊。
尝试uf一下,还好代码不长,不过引入更多的问题。
0:000> uf kernel32!terminateprocess
kernel32!TerminateProcess:
77e616b8 837c240400 cmp dword ptr [esp+0x4],0x0
77e616bd 7418 jz kernel32!TerminateProcess+0x7 (77e616d7)
kernel32!TerminateProcess+0x10:
77e616bf ff742408 push dword ptr [esp+0x8]
77e616c3 ff742408 push dword ptr [esp+0x8]
77e616c7 ff15f813e677 call dword ptr [kernel32!_imp__NtTerminateProcess (77e613f8)]
77e616cd 85c0 test eax,eax
77e616cf 7c0f jl kernel32!TerminateProcess+0x27 (77e616e0)
kernel32!TerminateProcess+0x22:
77e616d1 33c0 xor eax,eax
77e616d3 40 inc eax
kernel32!TerminateProcess+0x2f:
77e616d4 c20800 ret 0x8
kernel32!TerminateProcess+0x7:
77e616d7 6a06 push 0x6
77e616d9 e8d28c0100 call kernel32!SetLastError (77e7a3b0)
77e616de eb06 jmp kernel32!TerminateProcess+0x2d (77e616e6)
kernel32!TerminateProcess+0x27:
77e616e0 50 push eax
77e616e1 e8808d0100 call kernel32!BaseSetLastNTError (77e7a466)
kernel32!TerminateProcess+0x2d:
77e616e6 33c0 xor eax,eax
77e616e8 ebea jmp kernel32!TerminateProcess+0x2f (77e616d4)
能够看到+7的地方竟然在+10,+22的后面,不知道是怎么回事。
而且kernel32!_ExitProcess的返回地址77e7990f 不在上述uf的范围之内。这中间发生了什么?
Re: 为什么TeminateProcess的断点无法命中。
Thomson
2011-02-16, 13:17 下午
我觉得, 在xp里面,你上面的Stack里面,实际是通过ExitProcess调用_ExitProcess去结束进程的,而kernel32!TerminateProcess刚好放在了ExitProcess(Call _ExitProcess是该方法最后一条指令)后面,这样在parse stack的时候,会以为kernel32!TerminateProcess在Stack上,其实它不会被执行. 这样也能解释为什么stack上的kernel32!TerminateProcess的offset是0.
ExitProcess(ULONG StatusCode)
{
...
__asm call _ExitProcess
}
BOOL TerminateProcess(...)
{
...
}
Re: 为什么TeminateProcess的断点无法命中。
wrong
2011-02-16, 14:27 下午
解决了,详情可见http://user.qzone.qq.com/31731705/blog/1297832731,不知道是我的机器的问题,还是普遍的现象。
哈,没注意到上面有人回了,理论上差不多,实际上有区别的。