以NtOpenProcess为例.工具为windbg.
lkd> uf NtOpenProcess
nt!NtOpenProcess:
805cc456 68c4000000 push 0C4h
805cc45b 68c0b44d80 push offset nt!ObWatchHandles+0x25c (804db4c0)
......
nt!NtOpenProcess+0xa4:
805cc4fa 834dfcff or dword ptr [ebp-4],0FFFFFFFFh
805cc4fe eb42 jmp nt!NtOpenProcess+0xec (805cc542)
nt!NtOpenProcess+0xc0:
805cc516 8b5d10 mov ebx,dword ptr [ebp+10h]
......
注意805cc4fe,之后的指令行地址为805cc516.
但是805cc4fe的指令长度为2,那么805cc500-805c515到哪里去了?
lkd> uf 805cc500
nt!NtOpenProcess+0xaa:
805cc500 8b45ec mov eax,dword ptr [ebp-14h]
805cc503 8b00 mov eax,dword ptr [eax]
805cc505 8b00 mov eax,dword ptr [eax]
805cc507 8945c4 mov dword ptr [ebp-3Ch],eax
805cc50a 33c0 xor eax,eax
805cc50c 40 inc eax
805cc50d c3 ret
直接反编译805cc500,结果如上,自己写的简单的反编译引擎,也可以得到如上的反编译结果,但是出现了ret,那么就无法继续反编译后继的真实的函数内容了.
疑问:windbg是如何从805cc4fe+2跳到805cc516的?判断依据是什么?
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课