日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

旧调重弹-SetUnhandledExceptionFilter的使用问题

發(fā)布時(shí)間:2025/3/15 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 旧调重弹-SetUnhandledExceptionFilter的使用问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
舊調(diào)重彈-SetUnhandledExceptionFilter的使用問題
kongfoo/2005.12.19

.?Delphi中使用SetUnhandledExceptionFilter的問題

  這幾天在寫一個(gè)測(cè)試程序,包括使用SetUnhandledExceptionFilter來
反OD調(diào)試,關(guān)于SetUnhandledExceptionFilter的反調(diào)試原理之前(一年前了哈)
simonzh2000等人都有詳細(xì)講述,這里就不多講了,在Delphi里面要用這個(gè)
函數(shù)卻有點(diǎn)問題,先看看代碼:

program?SetUnhandledExceptionFilterTest;
uses?Windows;

procedure?Handler;
begin
??MessageBox(Hwnd(0),'Final?SEH','.',0);
??asm
????mov?eax,1
????retn
??end;
end;

begin
??SetUnhandledExceptionFilter(@Handler);
??asm
????xor?edx,edx
????idiv?edx
??end;
end.

  很簡(jiǎn)單的一個(gè)程序,但得到的效果卻不是預(yù)期之中的,在彈出'Final?SEH'
之后又彈出一個(gè)Runtime?error。如果在窗體之中的按鈕事件里面寫這樣的測(cè)試
代碼的話,效果更加是“離奇”,彈出一個(gè)“除0錯(cuò)”之后就沒事發(fā)生了,根本
沒有去Handler里面。
  究其原因,Delphi編譯出來的程序有自己的一套用SEH建立起來的異常處理
機(jī)構(gòu),是自動(dòng)的,在程序啟動(dòng)之初就建立起來了。就連上面這樣簡(jiǎn)單的程序也一
樣,在SetUnhandledExceptionFilter之前就建立了一個(gè)SEH結(jié)構(gòu)。如果要達(dá)到預(yù)
期效果:發(fā)生異常時(shí)去到我們的Handler里面,然后就完事了,我們就要先清掉
Delphi建立的SEH。再來看看代碼:

program?SetUnhandledExceptionFilterTest;
uses?Windows;

procedure?Handler;
begin
??MessageBox(Hwnd(0),'Final?SEH','.',0);
??asm
????mov?eax,1
????retn
??end;
end;

begin
??//首先要清掉SEH
??asm
???@Loop:
????mov?eax,fs:[0]
????cmp?dword?ptr?[eax],$FFFFFFFF
????je?@SEHCleared
????mov?eax,[eax]
????mov?fs:[0],eax
????jmp?@Loop
???@SEHCleared:
??end;
??SetUnhandledExceptionFilter(@Handler);
??asm
????xor?edx,edx
????idiv?edx
??end;
end.

  現(xiàn)在程序按照我們的想法運(yùn)行了。在窗體的按鈕OnClick事件中使用也正常。
SetUnhandledExceptionFilter在高級(jí)語言中應(yīng)用時(shí)應(yīng)該要注意一下這個(gè)問題了。
特別是用高級(jí)語言寫殼用到這個(gè)反調(diào)試技巧時(shí)。另外說一說在異常處理函數(shù)返回
值為-1時(shí)的問題。hume在《SEH?in?ASM研究》中的資料說到:

EXCEPTION_EXECUTE_HANDLER?equ?1?表示我已經(jīng)處理了異常,可以優(yōu)雅地結(jié)束了?
EXCEPTION_CONTINUE_SEARCH?equ?0?表示我不處理,其他人來吧,于是windows調(diào)用默認(rèn)的處理程序顯示一個(gè)錯(cuò)誤框,并結(jié)束?
EXCEPTION_CONTINUE_EXECUTION?equ?-1?表示錯(cuò)誤已經(jīng)被修復(fù),請(qǐng)從異常發(fā)生處繼續(xù)執(zhí)行?

  網(wǎng)上搜到一些關(guān)于SetUnhandledExceptionFilter的文章演示的都是返回值
為1的情況,而在反調(diào)試當(dāng)中,這種情況是沒用的,因?yàn)榉祷氐较到y(tǒng)之后程序就
結(jié)束了,有用的是返回為-1的情況。具體設(shè)置和我們平時(shí)的SEH異常處理函數(shù)類
似,在到達(dá)SetUnhandledExceptionFilter指定的異常處理函數(shù)之后,[[esp+4]+4]
處就是CONTEXT?STRUCT??创a可以更清晰(測(cè)試環(huán)境:winxp?sp2):

//這里是用SetUnhandledExceptionFilter設(shè)置的異常處理函數(shù)
@Handler:
??mov?eax,[esp+4]
??mov?eax,[eax+4]
??add?dword?ptr?[eax+0B8],2?//異常指令2個(gè)字節(jié)長(zhǎng),加2指向下一條指令。eax指向CONTEXT?STRUCT。
??mov?eax,-1
??retn

//設(shè)置代碼:
??push?offset?@Handler
??call?SetUnhandledExceptionFilter
??xor?edx,edx
??idiv?edx
??nop?//可以在這里下斷測(cè)試(當(dāng)然,OD要patch?UnhandledExceptionFilter)。

  OK,收工。

總結(jié)

以上是生活随笔為你收集整理的旧调重弹-SetUnhandledExceptionFilter的使用问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。