SEH處理異常

Win32為每個線程定義了一個線程信息塊,其中保存了線程的一些屬性數據,線程信息塊的屬性被定義為NT_TIB結構

typedef struct _NT_TIB {

?? ?struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;

?? ?PVOID StackBase;

?? ?PVOID StackLimit;

?? ?PVOID SubSystemTib;

?? ?union {

?? ? ? ?PVOID FiberData;

?? ? ? ?ULONG Version;

?? ?};

?? ?PVOID ArbitraryUserPointer;

?? ?struct _NT_TIB *Self;

} NT_TIB;

ExceptionList指向一個EXCEPTION_REGISTRATION結構-也就是SEH鏈的入口地址

?

EXCEPTION_REGISTRATION STRUCT

? prev????????? ?dd?????? ??????????????????????? ;前一個EXCEPTION_REGISTRATION結構的地址

?handler???? dd?????? ???????????????????????? ;異常處理回調函數的地址

EXCEPTION_REGISTRATION ends

?所以? 一系列的EXCEPTION_REGISTRATION結構? 就組成了一個SEH鏈...

?

TIB是放在fs段寄存器指向的數據段的0偏移處? 所以 fs;[0]指向TIB結構的ExceptionList字段,由于同一個進程中 有不同的線程,所以不同線程中的fs段寄存器可以使用不同的值,這種特性使得每個線程都可以設置不同的回調函數

?

如果內存是從高到低構建...棧則也是從高到低構建....那么對于棧而言

push offset _Handler?????????? ;異常處理程序的回調函數地址

push fs:[0]?????????????????????????????? ;上一個EXCEPTION_REGISTRATION結構的地址

mov?? fs:[0],esp?????????????????????? ;設置當前EXCEPTION_REGISTRATION結構的地址

esp此時 正好指向你構建的EXCEPTION_REGISTRATION結構體

?

SEH異常處理回調函數的參數定義與篩選器器的回調函數的參數定義有所不同,其定義如下,其調用約定為C格式,

_Handler proc C _lpExceptionRecord,_lpSEH,_lpContext,_lpDispatcherContext

_lpExceptionRecord? 指向EXCEPTION_RECORD結構(保存異常的相關信息)

_lpContext?????????????????? 指向一個Thread Context結構-保存線程上下文

_lpSEH?????????????????????????指向注冊回調函數時EXCEPTION_REGISTRATION結構的首地址--利用這個字段可以用棧來傳遞一些自定義數據如SafeCode地址

?

回調函數的返回值:

ExceptionContinueExecution(等于0):回調函數返回后,系統將線程環境設置為_lpContext參數指定的CONTEXT結構并繼續執行

ExceptionContinueSearch(等于1):回調函數拒絕處理這個異常,系統將通過 EXCEPTION_REGISTRATION結構的prev字段得到前一個回調函數的地址并調用他

ExceptionNestedException(等于2):回調函數執行過程中,又發生了新的異常,即觸發了嵌套異常

ExceptionCollidedUnwind(等于3):發生了嵌套展開操作

?

代碼:

<span style="font-family:Microsoft YaHei;font-size:13px;">		.386.model flat,stdcalloption casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include	windows.inc
include	user32.inc
includelib	user32.lib
include	kernel32.inc
includelib	kernel32.libL macro var:VARARGLOCAL @lbl.const@lbl db var,0.codeexitm <offset @lbl>
endm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Code Segment
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;SEH Handler
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Handler proc C _lpExceptionRecord,_lpSEH,_lpContext,_lpDispatcherContextLOCAL	@szBuffer[256]:BYTEpushadmov	esi,_lpExceptionRecordmov	edi,_lpContextassume esi:ptr EXCEPTION_RECORD,edi:ptr CONTEXTinvoke	wsprintf,addr @szBuffer,L("異常位置:%08x,異常代碼:%08x,異常標志:%08x"),[edi].regEip,[esi].ExceptionCode,[esi].ExceptionFlagsinvoke	MessageBox,NULL,addr @szBuffer,L("---"),MB_OKmov		eax,_lpSEHpush		[eax + 8]pop		[edi].regEippush		[eax + 0ch]pop		[edi].regEsp					;這個是屬于當前線程的-而不是當前的棧指針assume esi:nothing,edi:nothingpopadmov	eax,ExceptionContinueExecution		;這個會先返回到內核里面去ret_Handler endp
start:assume fs:nothingpush		ebp						;添加的自定義數據push		offset _SafePlace			;添加的自定義數據......push		offset _Handlerpush		fs:[0]mov		fs:[0],espxor		eax,eaxmov		dword ptr [eax],0_SafePlace:invoke	MessageBox,NULL,L("----"),L("----"),MB_OKpop 		fs:[0]add		esp,0ch					;恢復棧平衡invoke	ExitProcess,NULL
end start
</span>


?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375310.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375310.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375310.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Asp.net MVC 4新項目中創建area的后續操作

Asp.net MVC 4新項目中創建area后&#xff0c;往往HomeController與area的HomeController路由發生混淆&#xff0c;需要手工設置一些地方避免mvc無法識別默認路由的狀況。 無廢話具體步驟&#xff1a; 1. 檢查早Global.asax和\App_Start\RouteConfig.cs中是否已經自動添加了Are…

55-混沌操作法之我見:一、逆勢操作.(2015.2.7)

混沌操作法之我見&#xff1a;一、逆勢操作 首先談談&#xff0c;均線以及鱷魚線。單獨的市場價格表達了t時刻價格的個體情況&#xff0c;均線表達了一段時間內價格的綜合情況。t時刻的價格與均線的比較&#xff0c;表達了考慮了過去以及當前綜合價格的比較情況&#xff0c;即t…

SEH鏈和展開操作

每次我們定義了一個新的SEH異常處理回調函數,EXCEPTION_REGISTRATION結構的prev字段都被要求填寫上一個EXCEPTION_REGISTRATION結構的地址,隨著應用程序對模塊的調用一層層深入下去的時候,那么最后回調函數會形成一個SEH鏈 當程序中有多個線程在運行的時候,每個線程中都會存在各…

spring的基本知識

首先是回顧一下spring的基本知識 1、controller 控制器&#xff08;注入服務&#xff09; 2、service 服務&#xff08;注入dao&#xff09; 3、repository dao&#xff08;實現dao訪問&#xff09; 4、component &#xff08;把普通pojo實例化到spring容器中&#xff0c;相當于…

vs2010 EF4.0 訪問mysql

需要安裝mysql-connector-net-6.3.5 6.8.9的安裝完后在dbfirst里找不到對應的提供程序 鏈接字符串里需要 指定下編碼(如果不是gbk的話) <add name"sourceEntities" connectionString"metadatares://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;pr…

Win32ASM 變長參數的理解

C語言里面 提供了一些宏 可以使用變長參數 int MsgPrintf(INT dwszBuffer,TCHAR* szCaption,TCHAR* szFormat,...){LPVOID lpszBuffer;va_list pArgList;va_start(pArgList,szFormat);lpszBuffer HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,100);_vsntprintf((LPTSTR)lpsz…

jquery判斷一個div的邊界是否超出另外一個div的邊界

摘要&#xff1a;本文簡單介紹jquery判斷一個div的邊界是否超出另外一個div的邊界&#xff0c;如果超出邊界做出相應的處理。 1、實現效果 判斷前 判斷后 2、實現思路 實現類似的判斷&#xff0c;主要是獲取兩個div在瀏覽器中的上下左右的四至&#xff0c;在jquery中&#xff0…

Gson解析Json格式數據

//數據定義&#xff1a;class User{ String name; String password; String getName(){}void setName(){}}Gson gsonnew Gson(); ////解析一條json數據&#xff1a;令str為[{"name":"21001","password":"21001"}] User usernew User()…

進程的細節

從今天開始,重新學習一些細節性質的東西 一.在VS開發環境中,應用程序的入口點: _tWinMain WinMainCRTStartup _tWinMain wWinMainCRTStartup _tmain mainCRTStartup _tmain wmainCRTStartup 相關的介…

maven環境快速搭建(轉)

最近&#xff0c;開發中要用到maven&#xff0c;所以對maven進行了簡單的學習。因為有個maven高手在身邊&#xff0c;所以&#xff0c;很快就上手了&#xff0c;我這里算是自我總結吧。關于maven是什么東東&#xff0c;請參考其它文章。 ----------------準備工作-------------…

cocos2d-x3.0 相對布局(一)

2dx相對布局和Android非常類似。假設前完成Android它應該是easy入門。Size widgetSize Director::getInstance()->getWinSize();Text* alert Text::create("Layout", "fonts/Marker Felt.ttf", 30 );alert->setColor(Color3B(159, 168, 176));aler…

管理員以標準權限運行時

在XP時代,大多數用戶都用一個管理員(administrator)帳號來登錄Windows 利用這個賬戶,用戶幾乎能沒有任何限制的訪問重要的系統資源,因為該賬戶被授予了很高的權限,一旦用這個帳號登錄了xp以及xp之前的操作系統,Windows操作系統就會創建一個安全令牌(security token).每當有代碼…

HDU 4791 amp; ZOJ 3726 Alice#39;s Print Service (數學 打表)

題目鏈接&#xff1a; HDU:http://acm.hdu.edu.cn/showproblem.php?pid4791 ZJU:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId5072 Problem DescriptionAlice is providing print service, while the pricing doesnt seem to be reasonable, so people using…

奪命雷公狗---ECSHOP---08---商品頁的拇改成星星

<strong>用戶評價&#xff1a;</strong>{*---------商品評價星星開始----------*}<img src"./images/stars{$goods.comment_rank}.gif" alt"comment rank {$goods.comment_rank}">{*---------商品評價星星結束-------*} 這里主要是要有星…

文件指針

一.移動文件指針 SetFilePointer,hFile,lDistanceToMove,lpDistanceToMoveHigh,dwMoveMethod dwMoveMethod 指明移動的模式 FILE_BEGIN 不管文件處于什么地方,總是從文件的頭部開始移動,這時的位置參數相當于指定了一個絕對位置 FILE_CURRENT 從當前的文件指針處開始移…

見證下的自我變化-2014全年總結

又是一年總結季&#xff0c;回過頭看看看自己的成長&#xff0c;心里真的是滿滿的喜悅之情…… 一年前自己的總結博客&#xff1a;http://blog.csdn.net/huo065000/article/details/19632603 半年前自己的總結博客&#xff1a;http://blog.csdn.net/huo065000/article/details/…

【Linux學習篇】This virtual machine is configured for 64-bit guest operating systems.……

在學習Linux的基本操作的時候&#xff0c;安裝虛擬環境則提示自己 This virtualmachine is configured for 64-bit guest operatingsystems.……起初由于各種拒絕的心理&#xff0c;所以屏蔽了這個錯誤&#xff0c;但是屏蔽永遠也解決不了問題的&#xff0c;所以自己則嘗試百度…

圖解SSIS監視文件夾并自動導入數據

圖解SSIS監視文件夾并自動導入數據 原文:圖解SSIS監視文件夾并自動導入數據 演示案例&#xff1a;讓系統自動監視文件夾&#xff0c;并把文件夾下面的excel文件導入到sql中&#xff0c;之后清空目錄。這個過程以往都需要寫程序來實現或者定時執行&#xff0c;現在可以用ssis來訂…

DLL轉Lib

在C中,為了允許操作符重載和函數重載,C編譯器往往按照某種規則改寫每一個入口點的符號名,以便使用同一個名字(具有不同的參數類型或者是不同的作用域)有多種不同的用法,而不會打破現有基于C的鏈接器,.這項技術通常被稱為改編(Name Mangling)或者名稱修飾(Name Decoration),許多…

WP8手機解鎖時提示“請確保IPOVERUSBSVC服務正常運行”解決方法

如果你各種重啟服務 卸載手機 重裝驅動都試過了還不行&#xff0c;請看看你是否安裝了Hyper-v或Vitualbox虛擬機&#xff0c;很有可能是虛擬交換機造成的。 我在網絡連接屬性里看到這個 把它卸載后&#xff0c;解鎖成功。 解鎖后記得重新安裝卸載的那個網絡服務轉載于:https://…