• 逆向分析KiFastCallEntry填充_Trap_Frame结构体


    源代码

    804de88f b923000000      mov     ecx,23h                    ;让ecx存储,023h也就是三环的段描述符
                                            ;RPL为3
    804de894 6a30            push    30h                        
    804de896 0fa1            pop     fs                                    ;Windows内核有个特殊的基本要求,就是只要CPU在内
                                                                        ;称为KPCR的数据结构(在WIndows中线性地址为0xFFDFF位保护模式中,段寄                                        
                                                                        ;存器的内                                
                                                                        ;容并非一个段基地址某个表项
                                                                        ;这里查询gdt 0x30处即可
                                                                        ;ffc093df`f0000001
                                                                        ;Base:ffdff000
                                                                        ;fs=0x30h
    804de898 8ed9            mov     ds,cx                                ;把ds数据段置为0x23h
                                                                        ;ds=0x23h
    804de89a 8ec1            mov     es,cx                                ;es辅助ds
                                                                        ;es=0x23h
    804de89c 648b0d40000000  mov     ecx,dword ptr fs:[40h]                ;将TSS地址存储在ecx中
    804de8a3 8b6104          mov     esp,dword ptr [ecx+4]                ;将esp0给esp,切换esp
                                                                        ;esp=TSS.ESP0
    804de8a6 6a23            push    23h                                ;保存旧ss
    804de8a8 52              push    edx                                ;保存寄存器edx值,参数指针
    804de8a9 9c              pushfd                                        ;保存3环eflag寄存器
    804de8aa 6a02            push    2                                    ;将0环eflag寄存器存储在栈中
    804de8ac 83c208          add     edx,8                                ;指向3环API函数
    804de8af 9d              popfd                                        ;将eflag变为0环的寄存器
    804de8b0 804c240102      or      byte ptr [esp+1],2                    ;将eflag中的保留位置1
    804de8b5 6a1b            push    1Bh                                ;Trap_Frame.ss=1Bh
    804de8b7 ff350403dfff    push    dword ptr ds:[0FFDF0304h]            ;这里没看懂,猜测是将3环的eip存在这里面
    804de8bd 6a00            push    0                                    ;存储ErrorCode
    804de8bf 55              push    ebp                                ;保存ebp寄存器
    804de8c0 53              push    ebx                                ;保存ebx寄存器
    804de8c1 56              push    esi                                ;保存esi寄存器
    804de8c2 57              push    edi                                ;保存edi寄存器
    804de8c3 648b1d1c000000  mov     ebx,dword ptr fs:[1Ch]                ;获取KPCR指针
    804de8ca 6a3b            push    3Bh                                ;Fs寄存器
    804de8cc 8bb324010000    mov     esi,dword ptr [ebx+124h]            ;将KThread存入esi中
    804de8d2 ff33            push    dword ptr [ebx]                    ;将ExceptionList压入栈中
    804de8d4 c703ffffffff    mov     dword ptr [ebx],0FFFFFFFFh            ;新的ExceptionList置为空
    804de8da 8b6e18          mov     ebp,dword ptr [esi+18h]            ;将新线程的Stack给ebp
    804de8dd 6a01            push    1                                    ;存入1,说明先前是3环调用的
    804de8df 83ec48          sub     esp,48h                            ;是esp指向Trap Frame指向第一个成员
    804de8e2 81ed9c020000    sub     ebp,29Ch                            ;?????
    804de8e8 c6864001000001  mov     byte ptr [esi+140h],1                ;将KThread的PreviousMode置为1,存储是谁调用的
    804de8ef 3bec            cmp     ebp,esp                            ;比较ebp与esp
    804de8f1 0f8565ffffff    jne     nt!KiFastCallEntry2+0x25 (804de85c);不一致,则跳转
    804de8f7 83652c00        and     dword ptr [ebp+2Ch],0                ;清0
    804de8fb f6462cff        test    byte ptr [esi+2Ch],0FFh            ;判断是否是调试状态
    804de8ff 89ae34010000    mov     dword ptr [esi+134h],ebp            ;将当前的ebp给新KPCR的TRAP_FRAME
    804de905 0f8535feffff    jne     nt!Dr_FastCallDrSave (804de740)    ;如果是调试状态则跳转
    804de90b 8b5d60          mov     ebx,dword ptr [ebp+60h]            ;
    804de90e 8b7d68          mov     edi,dword ptr [ebp+68h]            ;
    804de911 89550c          mov     dword ptr [ebp+0Ch],edx            ;将3环参数开始栈中
    804de914 c74508000ddbba  mov     dword ptr [ebp+8],0BADB0D00h        ;
    804de91b 895d00          mov     dword ptr [ebp],ebx                ;将三环的ebp存储到_KTRAP_FRAME.Dbgebp
    804de91e 897d04          mov     dword ptr [ebp+4],edi                ;将三环的eip存储到_KTRAP_FRAME.Dbgeip
  • 相关阅读:
    使用指针的误区之指针未初始化
    实验室react项目名词解释
    生活感悟之大学
    git 快速入门
    口才锻炼
    narcissus
    crest value &minimum
    factorial
    Str_turn
    array_x
  • 原文地址:https://www.cnblogs.com/pppyyyzzz/p/14005698.html
Copyright © 2020-2023  润新知