原创 10 未處理異常

當SEH也沒有異常處理函數的時候,就會發生未處理異常,一般不存在 1、最後一道防線 <1>入口程序的最後一道防線 <2>線程啓動的最後一道防線 測試程序: #include <windows.h> #include <stdio.h>

原创 04 VEH(向量化異常處理)

1、KiUserExceptionDispatcher()函數分析(此函數在ntdll.dll中) <1>調用RtlDispatchException()函數查找並執行異常處理函數 <2>RtlDispatchException()函

原创 05 SEH(結構化異常處理)

1、RtlDispatchException函數式執行流程 SEH是線程相關的 2、SEH測試 #include <stdio.h> #include "windows.h" //0環異常處理時遇到的結構體 /* typed

原创 08 編譯器擴展

1、scopetable成員分析 struct scope_entry{ DWORD previousTryLevel; //上一個_try{}編號 PWORD lpfnFilter; //過濾函數起始地址 PWORD lpfn

原创 09 編譯器擴展SEH

1、_try _finally程序塊 _try{ //可能出錯代碼 }finally{ //一定執行的代碼 } 2、_try _finally程序塊特徵測試代碼 #include <windows.h> #include <st

原创 虛擬機中VC6.0突然抽風解決方法

VC6.0用着用着就抽風瞎報錯,本篇提供一種類似問題解決思路,無需重裝VC6.0 本問題由於VC6.0突然抽風引起,起初無問題,突然只要包含windows.h頭文件就報以下錯誤: error C2146: syntax error :

原创 04 用戶APC執行過程

1、執行用戶APC時的堆棧操作 處理用戶APC要比內核APC複雜得多,因爲用戶APC要在用戶空間執行,這裏涉及大量的換棧操作 當線程從用戶層進入內核層時,要保留原來的運行環境,如原來的各種寄存器以及棧的位置等等,然後切換成內核堆棧,如

原创 03 用戶異常的分發

引言: 異常發生在內核層時,處理起來比較簡單,因爲異常處理函數也在0環,不用切換線程堆棧,但是如果發生在3環,就意味着必須切換堆棧,回到3環執行處理函數。 切換堆棧的方式與用戶APC的執行過程幾乎是一樣的,唯一的區別就是執行APC返回

原创 01 備用APC隊列

1、備用APC隊列 kd> dt _KTHREAD ntdll!_KTHREAD +0x034 ApcState : _KAPC_STATE +0x138 ApcStatePointer : [2] Ptr32 _K

原创 00 CPU異常記錄

1、異常的分類 <1>CPU產生的異常(如除0) <2>軟件模擬產生的異常(如C++中的異常) 2、CPU異常的產生 CPU指令檢測到異常(如除0) 查IDT表,執行中斷處理函數 CommonDispatchException(把異常

原创 01 模擬異常

1、模擬異常產生 首先,我們用下面的代碼來演示用軟件拋出模擬異常時的情況 #include <stdio.h> void Test() { throw 1; } int main(int arg, char* args[]) {

原创 01 全局句柄表

1、全局句柄表 <1>所有的進程和線程無論是否打開,都在這個表裏 <2>每個進程和線程都有一個唯一的編號:PID和CID,這兩個值其實就是全局句柄表中的索引 進程和線程的查詢,主要是以下三個函數,按照給定的PID或CID從PspCid

原创 00 句柄表

1、什麼是句柄(內核對象) 當一個進程創建或打開一個一個內核對象時,將獲得一個句柄,通過這個句柄可以訪問內核對象。 如: HANDLE g_hMutex = ::CreateMutex(NULL, FALSE, “XYZ”); HAN

原创 03 內核APC執行過程

1、執行點:線程切換 2、執行點:系統調用、中斷或異常(_KiSereviceExit) 當要執行用戶APC之前,先要執行內核APC 3、KiDeliverApc函數執行流程 <1>判斷第一個鏈表是否爲空 <2>判斷KTHREAD.

原创 12 跨進程讀寫內存

1、跨進程操作 mov Cr3,B.DirectoryTableBase //切換Cr3值爲B進程 mov eax,dword ptr ds:[0x12345678] //B進程裏的0x12345678 mov dword ptr d