OS:win XP sp2
CPU: Intel Dual 2.0G
Hi!Raymond,
猜测你最近很忙,最近一周没来过,今天看到你来了,很高兴:)
在学习《软件调试》中遇见几个问题,特请教,谢谢!
Q1:《软件调试》p179提到sysenter和sysexit两个指令,在GDT中各有两个描述符,我用windbg的命令
dg 0 100
想查看书中所提到的这四个描述符,但是我没法从输出结果中辨认出这四个描述符,请问该如何确认?
Q2:《软件调试》p179提到系统会用cpuid指令来选择是使用sysenter,或是int 2e
请问在windbg是否能够使用cpuid指令,并根据使用cpuid指令的结果以能够再现系统选择sysenter或int 2e的过程?
Q3:学习《软件调试》p180的实验中,在我电脑上反汇编ntReadFile和systemcallstub,ntReadFile反汇编的结果基本和书上一致,但是systemcallstub反汇编的结果却截然不同,没有出现sysenter指令,如下所示:
kd> u ntdll!ntReadFilentdll!ZwReadFile:7c92e27c b8b7000000 mov eax,0B7h7c92e281 ba0003fe7f mov edx,offset SharedUserData!SystemCallStub (7ffe0300)7c92e286 ff12 call dword ptr [edx]7c92e288 c22400 ret 24h7c92e28b 90 nopntdll!NtReadFileScatter:7c92e28c 90 nop7c92e28d 90 nop7c92e28e 90 nop
kd> u systemcallstubSharedUserData!SystemCallStub:7ffe0300 8beb mov ebp,ebx7ffe0302 92 xchg eax,edx7ffe0303 7c94 jl SharedUserData+0x299 (7ffe0299)7ffe0305 eb92 jmp SharedUserData+0x299 (7ffe0299)7ffe0307 7c00 jl SharedUserData!SystemCallStub+0x9 (7ffe0309)7ffe0309 0000 add byte ptr [eax],al7ffe030b 0000 add byte ptr [eax],al7ffe030d 0000 add byte ptr [eax],al
另外,反汇编u nt!kifastcallentry l20 时与书上的结果也不同,请问原因?
谢谢!
Q1,即下面这四个:
0008 00000000 ffffffff Code RE Ac 0 Bg Pg P Nl 00000c9b0010 00000000 ffffffff Data RW Ac 0 Bg Pg P Nl 00000c930018 00000000 ffffffff Code RE Ac 3 Bg Pg P Nl 00000cfb0020 00000000 ffffffff Data RW Ac 3 Bg Pg P Nl 00000cf3
Q2,WinDBG中可以使用!cpuinfo命令获取CPU信息,不可以直接执行cpuid指令。kd> !cpuinfoCP F/M/S Manufacturer MHz PRCB Signature MSR 8B Signature Features 0 6,13,8 GenuineIntel 843 0000000000000000 0000000000000000 00013bbf
Q3,注意上面call后面是函数指针,因此应该先用dd 7ffe0300显示出函数地址,然后再反汇编,这应该是XP SP2引入的变化。
书上是XP SP1或者以前的情况:
kd> versionWindows XP Kernel Version 2600 (Service Pack 1) UP Free x86 compatibleProduct: WinNt, suite: TerminalServer SingleUserTSBuilt by: 2600.xpsp1.020828-1920
kd> u 77f761e877f761e8 b8b7000000 mov eax,0B7h77f761ed ba0003fe7f mov edx,offset SharedUserData!SystemCallStub (7ffe0300)77f761f2 ffd2 call edx ;;;这里不同77f761f4 c22400 ret 24h