靜態分析KiSystemService


 KiSystemService 是INT 2EH 後調用的
2000所有的native api 都使用INT 2EH, xp下 GDC函數 進入內核調用INT 2EH
其他native api 調用KiFastCall

.text:00465651 _KiSystemService proc near              ; CODE XREF: ZwAcceptConnectPort(x,x,x,x,x,x)+Cp

.text:00465651                                         ; ZwAccessCheck(x,x,x,x,x,x,x,x)+Cp ...

.text:00465651

.text:00465651 arg_0           = dword ptr  4

.text:00465651

.text:00465651                 push    0

.text:00465653                 push    ebp

.text:00465654                 push    ebx

.text:00465655                 push    esi

.text:00465656                 push    edi

.text:00465657                 push    fs

.text:00465659                 mov     ebx, 30h

.text:0046565E                 db      66h

.text:0046565E                 mov     fs, bx          段選擇子爲 30H

.text:00465661                 push    dword ptr ds:0FFDFF000h ; fs:[0]

.text:00465667                 mov     dword ptr ds:0FFDFF000h, 0FFFFFFFFh

                                                                                                         ; ExceptionList = FFFFFFFFH

.text:00465671                 mov     esi, ds:0FFDFF124h

                                                                                                                         ; _KPCR.PrcbData.CurrentThread

.text:00465677                 push    dword ptr [esi+140h]

.text:0046567D                 sub     esp, 48h

.text:00465680                 mov     ebx, [esp+68h+arg_0] ; arg_0 = 8

.text:00465684                 and     ebx, 1

.text:00465687                 mov     [esi+140h], bl  ; PreviousMode  usermode = 1

.text:0046568D                 mov     ebp, esp

.text:0046568F                 mov     ebx, [esi+134h] ; TrapFrame 指向進入內核時所保留的現場,也即上下文

.text:00465695                 mov     [ebp+3Ch], ebx  保存 指向用戶模式上下文context結構

.text:00465698                 mov     [esi+134h], ebp ; 建立異常處理幀 切換到內核上下文

.text:0046569E                 cld                     初始化KTRAP_FRAME

.text:0046569F                 mov     ebx, [ebp+60h]  EBP

.text:004656A2                 mov     edi, [ebp+68h]  ; ret返回地址

.text:004656A5                 mov     [ebp+0Ch], edx  ; KTRAP_FRAME.DbgArgPointer存放參數堆棧首地址

.text:004656A8                 mov     dword ptr [ebp+8], 0BADB0D00h ; DbgArgMark

.text:004656AF                 mov     [ebp+0], ebx    ; KTRAP_FRAME.DbgEbp存放原EBP

.text:004656B2                 mov     [ebp+4], edi    ; KTRAP_FRAME.DbgEip存放 ret返回地址

.text:004656B5                 test    byte ptr [esi+2Ch], 0FFh ; DebugActive

.text:004656B9                 jnz     Dr_kss_a

.text:0046554C Dr_kss_a        proc near               ; CODE XREF: _KiSystemService+68j

.text:0046554C

.text:0046554C ; FUNCTION CHUNK AT .text:004656BF SIZE 00000006 BYTES

.text:0046554C

.text:0046554C                 test    dword ptr [ebp+70h], 20000h ; EFlags = 0x246

.text:00465553                 jnz     short loc_465562

.text:00465555                 test    dword ptr [ebp+6Ch], 1

.text:0046555C                 jz      loc_4656BF

.text:00465562

.text:00465562 loc_465562:                             ; CODE XREF: Dr_kss_a+7j

.text:00465562                 mov     ebx, dr0

.text:00465565                 mov     ecx, dr1

.text:00465568                 mov     edi, dr2

.text:0046556B                 mov     [ebp+18h], ebx  ; KTRAP_FRAME.Dr0

.text:0046556E                 mov     [ebp+1Ch], ecx  ; KTRAP_FRAME.Dr1

.text:00465571                 mov     [ebp+20h], edi  ; KTRAP_FRAME.Dr2

.text:00465574                 mov     ebx, dr3

.text:00465577                 mov     ecx, dr6

.text:0046557A                 mov     edi, dr7

.text:0046557D                 mov     [ebp+24h], ebx  ; KTRAP_FRAME.Dr3

.text:00465580                 mov     [ebp+28h], ecx  ; KTRAP_FRAME.Dr6

.text:00465583                 xor     ebx, ebx

.text:00465585                 mov     [ebp+2Ch], edi  ; KTRAP_FRAME.Dr7

.text:00465588                 mov     dr7, ebx        ; dr7 0

.text:0046558B                 mov     edi, large fs:20h ; KPCR.Prcb

.text:00465592                 mov     ebx, [edi+2F8h] ; KPRCB.KSPECIAL_REGISTERS.KernelDr0

.text:00465598                 mov     ecx, [edi+2FCh] ; KernelDr1

.text:0046559E                 mov     dr0, ebx

.text:004655A1                 mov     dr1, ecx

.text:004655A4                 mov     ebx, [edi+300h] ; KernelDr2

.text:004655AA                 mov     ecx, [edi+304h] ; KernelDr3

.text:004655B0                 mov     dr2, ebx

.text:004655B3                 mov     dr3, ecx

.text:004655B6                 mov     ebx, [edi+308h] ; KernelDr6

.text:004655BC                 mov     ecx, [edi+30Ch] ; KernelDr7

.text:004655C2                 mov     dr6, ebx

.text:004655C5                 mov     dr7, ecx

.text:004655C8                 jmp     loc_4656BF

.text:0046579D loc_46579D:                             ; CODE XREF: _KiBBTUnexpectedRange+18j

.text:0046579D                                         ; Dr_kss_a+174j

.text:0046579D                 mov     edi, eax        分派IDEDI

.text:0046579F                 shr     edi, 8          右移一個字節

.text:004657A2                 and     edi, 30h        檢驗分派ID是否合法

.text:004657A2                                         ; 0x3fff>分派ID 高字節的低4位清0

.text:004657A2                                         分派ID > 0x 4000的,高字節的高4位對3取餘 低四位清0

.text:004657A2                                         實質上代表 分派ID%0x4000

.text:004657A5                 mov     ecx, edi

.text:004657A7                 add     edi, [esi+0E0h] ; KeServiceDescriptorTableShadow

.text:004657A7                                         根據分派ID的高字節 確定SSTntoskrnl還是win32k

.text:004657AD                 mov     ebx, eax

.text:004657AF                 and     eax, 0FFFh

.text:004657B4                 cmp     eax, [edi+8]    檢驗ID 是否小於ServiceLimit 合法ID應該小於

.text:004657B7                 jnb     _KiBBTUnexpectedRange

.text:004657BD                 cmp     ecx, 10h

.text:004657C0                 jnz     short loc_4657DC ; 如果SST ntoskrnl則跳

.text:004657C2                 mov     ecx, ds:0FFDFF018h ; Self = 0x7ffde000 用戶模式的Thread Environment Block

.text:004657C8                 xor     ebx, ebx

.text:004657CA

.text:004657CA loc_4657CA:                             ; DATA XREF: Dr_kite_a+1BFo

.text:004657CA                 or      ebx, [ecx+0F70h] ; GdiBatchCount = 0

.text:004657D0                 jz      short loc_4657DC

.text:004657D2                 push    edx

.text:004657D3                 push    eax

.text:004657D4                 call    ds:_KeGdiFlushUserBatch

.text:004657DA                 pop     eax

.text:004657DB                 pop     edx

.text:004657DC

.text:004657DC loc_4657DC:                             ; CODE XREF: Dr_FastCallDrSave+1F0j

.text:004657DC                                         ; Dr_FastCallDrSave+200j

.text:004657DC                 inc     dword ptr ds:0FFDFF638h ; KeSystemCalls 這裏是不是存放 CALL 內核函數的次數?

.text:004657E2                 mov     esi, edx       存放函數參數的棧首地址   

.text:004657E4                 mov     ebx, [edi+0Ch]  ; KiArgumentTable

.text:004657E7                 xor     ecx, ecx

.text:004657E9                 mov     cl, [eax+ebx]   得到調用NT函數的參數的字節大小

.text:004657EC                 mov     edi, [edi]       ; *KiServiceTable

.text:004657EE                 mov     ebx, [edi+eax*4] ; 得到調用的NT函數地址

.text:004657F1                 sub     esp, ecx

.text:004657F3                 shr     ecx, 2          ; size in dwords

.text:004657F6                 mov     edi, esp

.text:004657F8                 cmp     esi, ds:_MmUserProbeAddress ; 檢驗存放參數棧是否是用戶模式下的

.text:004657FE                 jnb     loc_4659AC

.text:00465804

.text:00465804 loc_465804:                             ; CODE XREF: Dr_FastCallDrSave+3E0j

.text:00465804                                         ; DATA XREF: Dr_kite_a+1B5o

.text:00465804                 rep movsd               複製參數

.text:00465806                 call    ebx             調用函數

.text:00465808

.text:00465808 loc_465808:                             ; CODE XREF: Dr_FastCallDrSave+3EBj

.text:00465808                                         ; DATA XREF: Dr_kite_a+1D5o ...

.text:00465808                 mov     esp, ebp        恢復堆棧

.text:0046580A

.text:0046580A loc_46580A:                             ; CODE XREF: _KiBBTUnexpectedRange+38j

.text:0046580A                                         ; _KiBBTUnexpectedRange+43j

.text:0046580A                 mov     ecx, ds:0FFDFF124h ; _KTHREAD

.text:00465810                 mov     edx, [ebp+3Ch]

.text:00465813                 mov     [ecx+134h], edx ; 上下文 從內核切換到用戶模式下 調用KiServiceExit



發佈了21 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章