1. 程式人生 > 實用技巧 >逆向分析KiFastCallEntry填充_Trap_Frame結構體

逆向分析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