Windows內核分析索引目錄:https://www.cnblogs.com/onetrainee/p/11675224.htmlhtml
初識VEH鏈(用戶異常派發的進一步探究) ios
VEH鏈是進程處理異常的一個很是重要的機制。函數
前面咱們分析到用戶異常進入內核以後會再次返回到R3層調用KeExceptionDispatcher函數嘗試處理。加密
該函數的主要目的就是搜索VEH找到異常的解決方案,若是未找到會再次向零環拋出異常。spa
1、經過C代碼來實現VEH掛載code
以下代碼,VEH是一個進程全局異常處理鏈表。htm
VEH只能處理單個進程的,後面的SEH在內核中處理全局的。blog
1 // veh.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。 2 // 3 4 #include "pch.h" 5 #include <iostream> 6 #include <Windows.h> 7 LONG NTAPI MyVeH(struct _EXCEPTION_POINTERS *ExceptionInfo) { 8 // 9 // 檢測到 c0000094 錯誤並進行處理. 10 // 11 if (ExceptionInfo->ExceptionRecord->ExceptionCode = 0xc0000094) { 12 MessageBoxA(NULL, NULL, NULL, NULL); 13 14 // 15 // 方法一:除法彙編代碼佔兩個字節,EIP+2跳過便可 16 // 17 //ExceptionInfo->ContextRecord->Eip += 2; 18 19 // 20 // 方法二:修改ECX寄存器(原來該寄存器爲0) 21 // 22 ExceptionInfo->ContextRecord->Ecx = 1; 23 return EXCEPTION_CONTINUE_EXECUTION; 24 25 } 26 return EXCEPTION_CONTINUE_SEARCH; 27 } 28 int main() 29 { 30 // 31 // 將咱們的異常處理函數掛在VEH頭 32 // 33 AddVectoredExceptionHandler(TRUE, MyVeH); 34 35 // 36 // 使用匯編代碼產生c0000094除零錯誤 37 // 38 _asm { 39 mov eax,1 40 mov ecx,0 41 idiv ecx 42 } 43 getchar(); 44 std::cout << "Hello World!\n"; 45 }
2、 AddVectoredExceptionHandler(ntdll.dll)反彙編代碼解讀索引
該注意,其掛載的MyVeH函數會進入內核進行加密,具體加密使用xor,祕鑰經過系統當前時間來計算得。進程
1. 流程圖
2. 反彙編代碼解讀
1 .text:7C9625F9 ; START OF FUNCTION CHUNK FOR _RtlCallVectoredExceptionHandlers@8 2 .text:7C9625F9 3 .text:7C9625F9 loc_7C9625F9: ; CODE XREF: RtlCallVectoredExceptionHandlers(x,x)+13↑j 4 .text:7C9625F9 mov eax, [ebp+arg_0] 5 .text:7C9625FC push ebx 6 .text:7C9625FD push esi 7 .text:7C9625FE mov [ebp+var_8], eax 8 .text:7C962601 mov eax, [ebp+arg_4] 9 .text:7C962604 mov ebx, offset _RtlpCalloutEntryLock 10 .text:7C962609 push ebx 11 .text:7C96260A mov [ebp+var_4], eax 12 .text:7C96260D call _RtlEnterCriticalSection@4 ; RtlEnterCriticalSection(x) 13 .text:7C962612 mov esi, _RtlpCalloutEntryList 14 .text:7C962618 jmp short loc_7C96262F 15 .text:7C96261A ; --------------------------------------------------------------------------- 16 .text:7C96261A 17 .text:7C96261A loc_7C96261A: ; CODE XREF: RtlCallVectoredExceptionHandlers(x,x)+17D1D↓j 18 .text:7C96261A push dword ptr [esi+8] 19 .text:7C96261D call _RtlDecodePointer@4 ; RtlDecodePointer(x) 20 .text:7C962622 lea ecx, [ebp+var_8] 21 .text:7C962625 push ecx 22 .text:7C962626 call eax 23 .text:7C962628 cmp eax, 0FFFFFFFFh 24 .text:7C96262B jz short loc_7C962647 25 .text:7C96262D mov esi, [esi] 26 .text:7C96262F 27 .text:7C96262F loc_7C96262F: ; CODE XREF: RtlCallVectoredExceptionHandlers(x,x)+17D04↑j 28 .text:7C96262F cmp esi, edi 29 .text:7C962631 jnz short loc_7C96261A 30 .text:7C962633 mov byte ptr [ebp+arg_0+3], 0 31 .text:7C962637 32 .text:7C962637 loc_7C962637: ; CODE XREF: RtlCallVectoredExceptionHandlers(x,x)+17D37↓j 33 .text:7C962637 push ebx 34 .text:7C962638 call _RtlLeaveCriticalSection@4 ; RtlLeaveCriticalSection(x) 35 .text:7C96263D mov al, byte ptr [ebp+arg_0+3] 36 .text:7C962640 pop esi 37 .text:7C962641 pop ebx 38 .text:7C962642 jmp loc_7C94A92F 39 .text:7C962647 ; --------------------------------------------------------------------------- 40 .text:7C962647 41 .text:7C962647 loc_7C962647: ; CODE XREF: RtlCallVectoredExceptionHandlers(x,x)+17D17↑j 42 .text:7C962647 mov byte ptr [ebp+arg_0+3], 1 43 .text:7C96264B jmp short loc_7C962637 44 .text:7C96264B ; END OF FUNCTION CHUNK FOR _RtlCallVectoredExceptionHandlers@8 45 .text:7C96264D ; --------------------------------------------------------------------------- 46 .text:7C96264D ; START OF FUNCTION CHUNK FOR _RtlAddVectoredExceptionHandler@8 47 .text:7C96264D 48 .text:7C96264D loc_7C96264D: ; CODE XREF: RtlAddVectoredExceptionHandler(x,x)+3C↑j 49 .text:7C96264D mov eax, _RtlpCalloutEntryListBlink ; 掛在Veh鏈尾部 50 .text:7C962652 mov [esi+_VECTORED_EXCEPTION_NODE.ListEntry.Flink], offset _RtlpCalloutEntryList 51 .text:7C962658 mov [esi+_VECTORED_EXCEPTION_NODE.ListEntry.Blink], eax 52 .text:7C96265B mov [eax], esi 53 .text:7C96265D mov _RtlpCalloutEntryListBlink, esi 54 .text:7C962663 jmp loc_7C956C53 55 .text:7C962663 ; END OF FUNCTION CHUNK FOR _RtlAddVectoredExceptionHandler@8 56 .text:7C962668 ; --------------------------------------------------------------------------- 57 .text:7C962668 ; START OF FUNCTION CHUNK FOR _RtlRemoveVectoredExceptionHandler@4 58 .text:7C962668 59 .text:7C962668 loc_7C962668: ; CODE XREF: RtlRemoveVectoredExceptionHandler(x)+29↑j 60 .text:7C962668 mov eax, [eax] 61 .text:7C96266A jmp loc_7C956C85
三. 用戶異常的派發
以前咱們分析過用戶的派發分析到 KiUserExceptionDispatcher(ntdll.dll) 函數,如今咱們分析這個函數。
1. 流程圖
2.反彙編代碼有點多,就不發上來了。
4、 關於 Safe VEH機制(分析IsValidHander函數)
未完待續···