首页
社区
课程
招聘
[求助]关于几个调试的问题,本人十分不解,望各位帮忙
发表于: 2009-7-8 12:49 3915

[求助]关于几个调试的问题,本人十分不解,望各位帮忙

2009-7-8 12:49
3915
本人是完全的新手,今天在WinDBG中 u NtTerminateProcess时出现如下代码:
nt!NtTerminateProcess:
805d23e4 8bff            mov     edi,edi
805d23e6 55              push    ebp
805d23e7 8bec            mov     ebp,esp
805d23e9 83ec10          sub     esp,10h
805d23ec 53              push    ebx
805d23ed 56              push    esi
805d23ee 57              push    edi
805d23ef 64a124010000    mov     eax,dword ptr fs:[00000124h]

而本人在Ollydbg中bp TerminateProcess后单步至NtTerminateProcess中的代码却是:
mov eax,101
mov edx,7ffe0300
call dword ptr ds:[edx]
retn

其中上述call调用函数代码为:
mov edx,esp
sysenter
retn

为什么上述同为NtTerminateProcess,但是代码却不一样

同样不解的事情在WinDbg下还有关于IofCallDriver,我bp IofCallDriver后显示指令为:
Breakpoint 4 hit
nt!IofCallDriver:
804f016a ff2580575580    jmp     dword ptr [nt!pIofCallDriver (80555780)]
此时我按下F8单步步入,此时却跳至nt!IopfCallDriver,本人十分不解,上述跳转明明是nt!pIofCallDriver(80555780),可是WinDbg中却执行的是nt!IopfCallDriver函数中804f0132处指令

我对内核很有兴趣,奈何本人实在笨拙,希望各位为小弟指点一下迷津,顺便推介点书给我看看,我只看了 天书夜读,再次感谢各位!!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
2
OD中看到的是ntdll.dll中的,是用户态的原生API,WinDBG是ntoskrnl.exe中的,是内核函数。

不信你看地址,WinDBG中是0x8XXXXXXX开头的,位于内核空间,模块是ntoskrnl(或其它跟这个很像的名字),而OD中显示的通常是0x7XXXXXXXX开头的,是用户空间,模块是ntdll
2009-7-8 19:54
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
OD是Ring3级别的调试器,进入不了Ring0级别的代码领空。所以在OD中根本看不到真正的NtTerminateProcess执行体,你能看到只是stub头。Windbg中可以看到真正的执行体。所以两个看起来肯定不一样的。

jmp     dword ptr [nt!pIofCallDriver (80555780)],表示跳转一个地址,这个地址的值是在地址80555780中,所以真正跳转到的地方是dd 80555780显示的值。
2009-7-8 23:25
0
雪    币: 146
活跃值: (33)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=devilroad;652748]OD是Ring3级别的调试器,进入不了Ring0级别的代码领空。所以在OD中根本看不到真正的NtTerminateProcess执行体,你能看到只是stub头。Windbg中可以看到真正的执行体。所以两个看起来肯定不一样的。

jmp     dword ptr [nt!pIofCallDriv...[/QUOTE]

可是问题是后面执行的代码并非nt!pIofCallDriver(80555780)处啊
2009-7-9 08:39
0
雪    币: 146
活跃值: (33)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=devilroad;652748]OD是Ring3级别的调试器,进入不了Ring0级别的代码领空。所以在OD中根本看不到真正的NtTerminateProcess执行体,你能看到只是stub头。Windbg中可以看到真正的执行体。所以两个看起来肯定不一样的。

jmp     dword ptr [nt!pIofCallDriv...[/QUOTE]

bp后单步执行看到的却是:执行的是nt!IopfCallDriver函数中804f0132处指令
2009-7-9 08:40
0
雪    币: 146
活跃值: (33)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
感谢2位大哥的关注额,现在明白了那个问题,是通过sysenter自陷切换到R0去,R3和R0下都有个NtTerminateProcess,呵呵

但是还有不解的就是:
bp后单步执行的代码并非nt!pIofCallDriver(80555780)处,而是nt!IopfCallDriver函数中804f0132处指令
2009-7-9 08:43
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
7
你先d 80555780看看。
2009-7-9 17:22
0
游客
登录 | 注册 方可回帖
返回
//