• 分析kernel.dll函数CreateRemoteThread进0环


    CreateRemoteThread

    部分源码

    push    edi             ; CreateSuspended
    lea     ecx, [ebp+UserStack]
    push    ecx             ; UserStack
    lea     ecx, [ebp+ThreadContext]
    push    ecx             ; ThreadContext
    lea     ecx, [ebp+ClientId]
    push    ecx             ; ClientId
    mov     esi, [ebp+ProcessHandle]
    push    esi             ; ProcessHandle
    push    eax             ; ObjectAttributes
    push    1F03FFh         ; DesiredAccess
    lea     eax, [ebp+ThreadHandle]
    push    eax             ; ThreadHandle
    call    ds:NtCreateThread

     查看ZwCreateThread函数

    ZwCreateThread proc near
    mov     eax, 35h        ; NtCreateThread
    mov     edx, 7FFE0300h
    call    dword ptr [edx]
    retn    20h

    发现其用了快速调用进入函数

    0: kd> u 7c92e4f0
    ntdll!KiFastSystemCall:
    7c92e4f0 8bd4            mov     edx,esp
    7c92e4f2 0f34            sysenter

    sysenter指令会使KiFastCallEntry被调用,从而进入0环代码,并保存3环的环境,然后再去找系统服务表,如下没有3环保存现场的代码,只有保存完后的代码

    804de922 8bf8            mov     edi,eax                                            ;edi=系统调用号
    804de924 c1ef08          shr     edi,8                                                
    804de927 83e730          and     edi,30h                                            ;判断第12位是否为1,为1就是Win32k.sys,否则为Ntoskrl.dll
                                                                                        ;edi=0x10||0x00
    804de92a 8bcf            mov     ecx,edi                                            ;ecx=edi&0x30
    804de92c 03bee0000000    add     edi,dword ptr [esi+0E0h]                            ;esi+0xe0=ServiceTable
                                                                                        ;edi+=ServiceTable
                                                                                        ; 系统服务表有 ServiceTable, Count, ServiceLimit 和 ArgmentTable
    804de932 8bd8            mov     ebx,eax                                            ;ebx=系统调用号
    804de934 25ff0f0000      and     eax,0FFFh                                            ;eax=偏移号
    804de939 3b4708          cmp     eax,dword ptr [edi+8]                                ;
    804de93c 0f8330fdffff    jae     nt!KiBBTUnexpectedRange (804de672)                    ;调用号<=count
    804de942 83f910          cmp     ecx,10h                                            ;是否为Win32k.sys
    804de945 751b            jne     nt!KiFastCallEntry+0xcf (804de962)                    ;
    804de947 648b0d18000000  mov     ecx,dword ptr fs:[18h]                                ;ecx=_KPCR
    804de94e 33db            xor     ebx,ebx                                            ;ebx=0
    804de950 0b99700f0000    or      ebx,dword ptr [ecx+0F70h]                            ;
    804de956 740a            je      nt!KiFastCallEntry+0xcf (804de962)
    804de958 52              push    edx                                                ;指向第一个参数
    804de959 50              push    eax                                                ;系统调用号
    804de95a ff1568355680    call    dword ptr [nt!KeGdiFlushUserBatch (80563568)]        ;
    804de960 58              pop     eax
    804de961 5a              pop     edx
    804de962 64ff0538060000  inc     dword ptr fs:[638h]                                ;
    804de969 8bf2            mov     esi,edx                                            ;esi=arg[0]
    804de96b 8b5f0c          mov     ebx,dword ptr [edi+0Ch]                            ;ebx=ServiceLimit
    804de96e 33c9            xor     ecx,ecx                                            ;ecx=0
    804de970 8a0c18          mov     cl,byte ptr [eax+ebx]                                ;cl=arg_counts
    804de973 8b3f            mov     edi,dword ptr [edi]                                ;edi=function addr table
    804de975 8b1c87          mov     ebx,dword ptr [edi+eax*4]                            ;ebx=function addr
    804de978 2be1            sub     esp,ecx                                            ;提升堆栈
    804de97a c1e902          shr     ecx,2                                                ;乘以4
    804de97d 8bfc            mov     edi,esp                                            ;edi=esp,为参数获取堆栈空间
    804de97f 3b35d48e5680    cmp     esi,dword ptr [nt!MmUserProbeAddress (80568ed4)]    ;
    804de985 0f83a8010000    jae     nt!KiSystemCallExit2+0x9f (804deb33)                ;
    804de98b f3a5            rep movs dword ptr es:[edi],dword ptr [esi]                ;edi[0]=arg[0]...
    804de98d ffd3            call    ebx                                                ;call eax+ebx
    804de98f 8be5            mov     esp,ebp
    804de991 648b0d24010000  mov     ecx,dword ptr fs:[124h]
    804de998 8b553c          mov     edx,dword ptr [ebp+3Ch]
    804de99b 899134010000    mov     dword ptr [ecx+134h],edx

    调用号为0x35,查看系统服务调用表

    0: kd> dd KeServiceDescriptorTable
    80563520  804e58a0 00000000 0000011c 805120bc
    80563530  00000000 00000000 00000000 00000000
    80563540  00000000 00000000 00000000 00000000
    80563550  00000000 00000000 00000000 00000000
    0: kd> dd 804e58a0 l 40
    ReadVirtual: 804e5920 not properly sign extended
    804e58a0  80591bfb 80585356 805e1f35 805dbc47
    804e58b0  805e1fbc 80640cc2 80642e4b 80642e94
    804e58c0  805835b2 80650bbb 8064047d 805e1787
    804e58d0  8063878a 80586fa1 805e08e8 8062f432
    804e58e0  805d9781 80571d45 805e8258 805e939e
    804e58f0  804e5eb4 80650ba7 805cd537 804ed812
    804e5900  805719b7 80570af2 805e1b65 80656cec
    804e5910  805e0ff3 805887b7 80656f5b 80586563
    804e5920  804e221d 8066239e 805aa76b 8057dd2d
    804e5930  8065120c 8057d330 805db662 805d6cd6
    804e5940  80638c31 80578925 805d7e7f 805803c0
    804e5950  80589caa 805b5823 8059a02a 805b1470
    804e5960  8058c7cd 8065182d 8056eb66 8057b9e4
    804e5970  805e7e56 80587c43 80598cb2 805a7ada
    804e5980  805ab552 80663519 80663673 8056fb07
    804e5990  805ddc8b 80650ba7 805d64ac 80594334

    发现其值为0x80587c43,查看其代码

    80587c43 6a28            push    28h
    80587c45 6870ad4f80      push    offset nt!ObWatchHandles+0x674 (804fad70)
    80587c4a e824c2f5ff      call    nt!_SEH_prolog (804e3e73)
    80587c4f 8365fc00        and     dword ptr [ebp-4],0
    80587c53 64a124010000    mov     eax,dword ptr fs:[00000124h]    
    80587c59 8945e0          mov     dword ptr [ebp-20h],eax        //当前线程的E_ETHREAD给ebp-0x20
    80587c5c 80b84001000000  cmp     byte ptr [eax+140h],0            
    80587c63 0f84452b0300    je      nt!NtCreateThread+0xb5 (805ba7ae)    //跳转到80587cdd处
    80587c69 a1d48e5680      mov     eax,dword ptr [nt!MmUserProbeAddress (80568ed4)]
    80587c6e 8b4d08          mov     ecx,dword ptr [ebp+8]                //ecx=hProcess
    80587c71 3bc8            cmp     ecx,eax
    80587c73 0f83d7e30700    jae     nt!NtCreateThread+0x32 (80606050)    //跳转到80587c79处
    80587c79 8b01            mov     eax,dword ptr [ecx]
    80587c7b 8901            mov     dword ptr [ecx],eax
    80587c7d 8b5d18          mov     ebx,dword ptr [ebp+18h]            //ebx=lpParameter
    80587c80 85db            test    ebx,ebx
    80587c82 7423            je      nt!NtCreateThread+0x66 (80587ca7)
    80587c84 895ddc          mov     dword ptr [ebp-24h],ebx
    80587c87 a1d48e5680      mov     eax,dword ptr [nt!MmUserProbeAddress (80568ed4)]
    80587c8c 3bd8            cmp     ebx,eax
    80587c8e 0f83c7e30700    jae     nt!NtCreateThread+0x4f (8060605b)
    80587c94 f6c303          test    bl,3
    80587c97 0f85c6e30700    jne     nt!NtCreateThread+0x57 (80606063)
    80587c9d 8a03            mov     al,byte ptr [ebx]
    80587c9f 8803            mov     byte ptr [ebx],al
    80587ca1 8a4304          mov     al,byte ptr [ebx+4]
    80587ca4 884304          mov     byte ptr [ebx+4],al
    80587ca7 837d1c00        cmp     dword ptr [ebp+1Ch],0
    80587cab 0f84f0e30700    je      nt!NtCreateThread+0xaa (806060a1)
    80587cb1 f6451c03        test    byte ptr [ebp+1Ch],3
    80587cb5 0f85b2e30700    jne     nt!NtCreateThread+0x72 (8060606d)
    80587cbb a1d48e5680      mov     eax,dword ptr [nt!MmUserProbeAddress (80568ed4)]
    80587cc0 39451c          cmp     dword ptr [ebp+1Ch],eax
    80587cc3 0f83aee30700    jae     nt!NtCreateThread+0x81 (80606077)
    80587cc9 8b5d20          mov     ebx,dword ptr [ebp+20h]
    80587ccc f6c303          test    bl,3
    80587ccf 0f85b2e30700    jne     nt!NtCreateThread+0x94 (80606087)
    80587cd5 3bd8            cmp     ebx,eax
    80587cd7 0f83b9e30700    jae     nt!NtCreateThread+0xa2 (80606096)    //上面都是测试符号的
    80587cdd 8b03            mov     eax,dword ptr [ebx]
    80587cdf 8945c8          mov     dword ptr [ebp-38h],eax
    80587ce2 8b4b04          mov     ecx,dword ptr [ebx+4]
    80587ce5 894dcc          mov     dword ptr [ebp-34h],ecx
    80587ce8 33d2            xor     edx,edx
    80587cea 3bc2            cmp     eax,edx
    80587cec 750e            jne     nt!NtCreateThread+0xd7 (80587cfc)
    80587cee 3bca            cmp     ecx,edx
    80587cf0 750a            jne     nt!NtCreateThread+0xd7 (80587cfc)
    80587cf2 6a05            push    5
    80587cf4 59              pop     ecx
    80587cf5 8bf3            mov     esi,ebx
    80587cf7 8d7dc8          lea     edi,[ebp-38h]
    80587cfa f3a5            rep movs dword ptr es:[edi],dword ptr [esi]
    80587cfc 834dfcff        or      dword ptr [ebp-4],0FFFFFFFFh
    80587d00 52              push    edx                    
    80587d01 52              push    edx
    80587d02 ff7524          push    dword ptr [ebp+24h]            
    80587d05 8d45c8          lea     eax,[ebp-38h]                        
    80587d08 50              push    eax                                //lpThreadId
    80587d09 ff751c          push    dword ptr [ebp+1Ch]                //dwCreationFlags
    80587d0c ff7518          push    dword ptr [ebp+18h]                //lpParameter
    80587d0f 52              push    edx                                //0
    80587d10 ff7514          push    dword ptr [ebp+14h]                //lpStartAddress
    80587d13 ff7510          push    dword ptr [ebp+10h]                //dwStackSize
    80587d16 ff750c          push    dword ptr [ebp+0Ch]                //lpThreadAttributes
    80587d19 ff7508          push    dword ptr [ebp+8]                    //hProcess
    80587d1c e830e4feff      call    nt!PspCreateThread (80576151)
    80587d21 e888c1f5ff      call    nt!_SEH_epilog (804e3eae)
    80587d26 c22000          ret     20h
  • 相关阅读:
    并发和并行的区别
    fiddler-打断点(bpu)
    fiddler操作
    fiddler手机抓包
    面试题1
    Linux查看日志常用命令
    HTMLTestRunner
    mysql数据库无法插入特殊字符报错
    mybatis解决属性名和数据库字段名不一致问题
    Vue路由的使用简单实例
  • 原文地址:https://www.cnblogs.com/pppyyyzzz/p/14016903.html
Copyright © 2020-2023  润新知