_KiFastCallEntry静态分析

.text:0040689F _KiFastCallEntry proc near ; DATA XREF: _KiTrap01+71o
.text:0040689F ; KiLoadFastSyscallMachineSpecificRegisters(x)+24o
.text:0040689F
.text:0040689F var_B = byte ptr -0Bh
.text:0040689F arg_14 = dword ptr 18h
.text:0040689F arg_28 = dword ptr 2Ch
.text:0040689F arg_5C = dword ptr 60h
.text:0040689F arg_64 = dword ptr 68h
.text:0040689F arg_DC = dword ptr 0E0h
.text:0040689F arg_130 = dword ptr 134h
.text:0040689F arg_634 = dword ptr 638h
.text:0040689F arg_F6C = dword ptr 0F70h
.text:0040689F
.text:0040689F ; FUNCTION CHUNK AT .text:0040686C SIZE 00000024 BYTES
.text:0040689F ; FUNCTION CHUNK AT .text:00406B43 SIZE 00000014 BYTES
.text:0040689F
.text:0040689F mov ecx, 23h
.text:004068A4 push 30h
.text:004068A6 pop fs
.text:004068A8 mov ds, ecx
.text:004068AA mov es, ecx
.text:004068AC mov ecx, large fs:_KPCR.TSS ; ecx=tss
.text:004068B3 mov esp, [ecx+_KTSS.Esp0] ; 在这里已经切换了堆栈 ESP指向_KTRAP_FRAME的V86Es
.text:004068B6 push 23h ; 保存三环的SS
.text:004068B8 push edx ; 保存三环的ESP
.text:004068B9 pushf ; 保存标志寄存器
.text:004068BA
.text:004068BA loc_4068BA: ; CODE XREF: _KiFastCallEntry2+23j
.text:004068BA push 2 ; EFLAGS=2 关闭中断
.text:004068BC add edx, 8 ; edx=里面存的是三环堆栈里面第一个参数
.text:004068BF popf ; EFLAGS的值赋值为202
.text:004068C0 or byte ptr [esp+1], 2 ; eflags的第9为设置为1,置1以响应可屏蔽中断
.text:004068C5 push 1Bh ; 保存cs
.text:004068C7 push dword ptr ds:0FFDF0304h ; 压入SystemCallReturn,查找共享结构体KUSER_SHARED_DATA
.text:004068CD push 0 ; ErrCode 保存一个0
.text:004068CF push ebp
.text:004068D0 push ebx
.text:004068D1 push esi
.text:004068D2 push edi ; 保存edi
.text:004068D3 mov ebx, large fs:_KPCR.SelfPcr ; ebx=KPCR
.text:004068DA push 3Bh ; 保存FS
.text:004068DC mov esi, [ebx+124h] ; esi=当前线程结构体指针
.text:004068E2 push dword ptr [ebx] ; 保存异常链表到_KTRAP_FRAME
.text:004068E4 mov dword ptr [ebx], 0FFFFFFFFh ; _KPCR里面的异常处理链表清空
.text:004068EA mov ebp, [esi+_ETHREAD.Tcb.InitialStack]
.text:004068ED push 1 ; 保存先前模式为1
.text:004068EF sub esp, 48h ; esp现在等于_KTRAP_FRAME首地址
.text:004068F2 sub ebp, 29Ch ; 该值等于浮点寄存器的210h+_KTRAP_FRAME的8C字节
.text:004068F8 mov [esi+_KTHREAD.PreviousMode], 1 ; 当前线程的先前模式改为设置为1
.text:004068FF cmp ebp, esp ; 两个值不相等则出现了异常,跳转
.text:00406901 jnz loc_40686C
.text:00406907 and dword ptr [ebp+2Ch], 0 ; dr7=0
.text:0040690B test [esi+_KTHREAD.DebugActive], 0FFh ; 如果该值为0,则不保存dr0,到dr7 无法下硬件断点,游戏保护常用一个线程对该值清0
.text:0040690F mov [esi+134h], ebp ; 保存更新后的_TRAP_FRAME结构体,
.text:00406915 jnz Dr_FastCallDrSave
.text:0040691B
.text:0040691B loc_40691B: ; CODE XREF: Dr_FastCallDrSave+10j
.text:0040691B ; Dr_FastCallDrSave+7Cj
.text:0040691B mov ebx, [ebp+60h] ; 3环的EBP
.text:0040691E mov edi, [ebp+arg_64] ; 3环的EIP
.text:00406921 mov [ebp+0Ch], edx ; 3环参数的指针
.text:00406924 mov dword ptr [ebp+8], 0BADB0D00h
.text:0040692B mov [ebp+0], ebx ; 保存EBP
.text:0040692E mov [ebp+100b], edi ; 保存EIP 保存工作结束
.text:00406931 sti ; 表示将处理器标志寄存器的中断标志置1,允许中断
.text:00406932
.text:00406932 loc_406932: ; CODE XREF: _KiBBTUnexpectedRange+18j
.text:00406932 ; _KiSystemService+71j
.text:00406932 mov edi, eax ; eax=服务号
.text:00406934 shr edi, 8 ; edi=服务号 右移8位。 12位的服务号还有4位
.text:00406937 and edi, 30h ; 服务号剩下的4位也被置0,如果eax的第12位为1,则结果为10h,否则,结果为0
.text:0040693A mov ecx, edi ; ecx=10h 或者=0
.text:0040693C add edi, [esi+0E0h] ; edi=系统服务表第一个表的地址,或者第二个表。两个表相差10h
.text:00406942 mov ebx, eax ; ebx=服务号
.text:00406944 and eax, 0FFFh ; 保存3字节,得到真正的服务号 如果服务号大于1000 则高位会被置0
.text:00406949 cmp eax, [edi+8] ; 如果服务号的大小大于 服务表里面的ServiceLimit则跳转
.text:0040694C jnb _KiBBTUnexpectedRange
.text:00406952 cmp ecx, 10h ; 判断是shadow ssdt还是ssdt,不跳则是shadow ssdt,跳则是ssdt
.text:00406955 jnz short loc_406972 ; 系统调用次数+1
.text:00406957 mov ecx, large fs:_KPCR.NtTib.Self ; ecx=_KPCR
.text:0040695E xor ebx, ebx ; ebx=0
.text:00406960
.text:00406960 loc_406960: ; DATA XREF: _KiTrap0E+114o
.text:00406960 or ebx, [ecx+0F70h] ; 是否有异常
.text:00406966 jz short loc_406972 ; 系统调用次数+1
.text:00406968 push edx
.text:00406969 push eax
.text:0040696A call ds:_KeGdiFlushUserBatch
.text:00406970 pop eax
.text:00406971 pop edx
.text:00406972
.text:00406972 loc_406972: ; CODE XREF: _KiFastCallEntry+B6j
.text:00406972 ; _KiFastCallEntry+C7j
.text:00406972 inc large dword ptr fs:638h ; 系统调用次数+1
.text:00406979 mov esi, edx ; esi=三环参数的指针
.text:0040697B mov ebx, [edi+0Ch] ; ebx=函数参数表
.text:0040697E xor ecx, ecx ; ecx=0
.text:00406980 mov cl, [eax+ebx] ; cl/4=该函数参数的个数
.text:00406983 mov edi, [edi] ; edi=表的基址
.text:00406985 mov ebx, [edi+eax*4] ; ebx=函数的真正地址
.text:00406988 sub esp, ecx ; 提升堆栈 大小为函数参数的总字节数
.text:0040698A shr ecx, 2 ; ecx/4 得到函数个数
.text:0040698D mov edi, esp ; edi=esp
.text:0040698F cmp esi, ds:_MmUserProbeAddress ; 如果esi大于用户可用地址则跳转
.text:00406995 jnb loc_406B43
.text:0040699B
.text:0040699B loc_40699B: ; CODE XREF: _KiFastCallEntry+2A8j
.text:0040699B ; DATA XREF: _KiTrap0E+10Ao
.text:0040699B rep movsd ; 赋值3环的参数到0环堆栈
.text:0040699D call ebx ; 调用函数
.text:0040699F
.text:0040699F loc_40699F: ; CODE XREF: _KiFastCallEntry+2B3j
.text:0040699F ; DATA XREF: _KiTrap0E+12Ao …
.text:0040699F mov esp, ebp ; esp=ebp=_KTRAP_FRAME
.text:004069A1
.text:004069A1 loc_4069A1: ; CODE XREF: _KiBBTUnexpectedRange+38j
.text:004069A1 ; _KiBBTUnexpectedRange+43j
.text:004069A1 mov ecx, large fs:_KPCR.PrcbData.CurrentThread
.text:004069A8 mov edx, [ebp+3Ch] ; _KTRAP_FRAM中取出edx
.text:004069AB mov [ecx+_KTHREAD.TrapFrame], edx
.text:004069AB _KiFastCallEntry endp

猜你喜欢

转载自blog.csdn.net/qq_41490873/article/details/91780741
今日推荐