破解筆記1——SEH

 


    對於SEH(Structured Exception Handling)結構化異常處理的初步理解:是在CPU指令層次上給程序設計者提供異常處理,C++中的_try{}_except{}結構不過是在高層對SEH的包裝。從總體上來說SEH是一個異常處理回調函數的鏈表,以線程基本單位,每個線程擁有自己的SEH處理鏈,出現異常時可以順着SEH鏈依次調用異常處理函數,直到找到適合的處理函數爲止。在線程創建之初系統會提供一個默認的異常處理函數——出現異常時彈出“XXXX處出現異常,退出或調試”窗口。爲了處理異常設計者可以用SetUnhandledExceptionFilter()向系統註冊處理異常的回調函數,將回調函數添加到SEH處理鏈的頭部,在出現異常時被第一個調用。

在彙編的層面向註冊SEH鏈註冊異常處理回調函數非常的簡單,首先我們必須瞭解以下事實:SEH鏈保存在堆棧中,每個節點由兩個指針構成佔用8個字節,高地址的4個字節存放回調函數的地址,低地址的4個地址指向下一個節點,鏈尾值爲0xffffffff。fs:[0]指向SEH鏈的頭部,所以異常處理回調函數的註冊過程可以簡要描述爲:

push offset exception_function_address

push fs:[0]

mov fs:[0], esp


介紹SEH的經典:http://www.xfocus.net/articles/200503/785.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章