2014年7月22日星期二

调试sysenter

很早就有个想法:
看看sysenter指令的下一步操作是啥,也就是下一条指令的代码。

sysenter指令主要的操作是设置IP。
IP设置完后,这个指令的功能也就完成差不多了。
剩下的事是CPU的事了,也就是按照指定的地址去执行了。

这个指令的功能很明确了。

接下来进入正题:
1: kd> rdmsr 176 
msr[176] = 00000000`805426e0

注释:SYSENTER_EIP_MSR == 176

1: kd> u 805426e0
nt!KiFastCallEntry:
805426e0 b923000000      mov     ecx,23h
805426e5 6a30            push    30h
805426e7 0fa1            pop     fs
805426e9 8ed9            mov     ds,cx
805426eb 8ec1            mov     es,cx
805426ed 648b0d40000000  mov     ecx,dword ptr fs:[40h]
805426f4 8b6104          mov     esp,dword ptr [ecx+4]
805426f7 6a23            push    23h

至此问题应该解决了。

注意:有的时候,按进入下一步的时候不是这个地址,而是别的,我的解释是线程的切换。

而调用者一般如下:
ntdll!KiFastSystemCall:
                           001b:7c92e510 8bd4            mov     edx,esp
                           001b:7c92e512 0f34            sysenter
ntdll!KiFastSystemCallRet:
                           001b:7c92e514 c3              ret

------------------------------------------------------------------------------------------------------------------------------
nt!KiSystemCallExit:
                           805428ec cf              iretd 
nt!KiSystemCallExit2:
                           805428ed f644240901      test    byte ptr [esp+9],1
                           805428f2 75f8            jne     nt!KiSystemCallExit (805428ec)
                           805428f4 5a              pop     edx
                           805428f5 83c404          add     esp,4
                           805428f8 80642401fd      and     byte ptr [esp+1],0FDh
                           805428fd 9d              popfd
                           805428fe 59              pop     ecx
                           805428ff fb              sti
                           80542900 0f35            sysexit
                           80542902 cf              iretd
                           80542903 90              nop

1: kd> r
eax=00000000 ebx=7c9a0600 ecx=0225f624 edx=7c92e514 esi=0016b6d8 edi=7c99e3e0
eip=80542900 esp=f824addc ebp=0225f644 iopl=0         nv up ei ng nz na po cy
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00000283
nt!KiSystemCallExit2+0x13:
80542900 0f35            sysexit

注意:EDX的值。
说明:nt!KiSystemCallExit很少被调用。

ntdll!KiFastSystemCallRet:
                           001b:7c92e514 c3              ret

操作步骤:
1.在nt!KiSystemCallExit2下断点。
2.走到sysexit时,在不发生切换线程的情况下会走到ntdll!KiFastSystemCallRet的。
3.ntdll!KiFastSystemCallRet返回到函数的调用者处。
------------------------------------------------------------------------------------------------------------------------------

made by correy
made at 2014.07.22

没有评论:

发表评论