旧调重弹-SetUnhandledExceptionFilter的使用问题
生活随笔
收集整理的這篇文章主要介紹了
旧调重弹-SetUnhandledExceptionFilter的使用问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
舊調重彈-SetUnhandledExceptionFilter的使用問題
kongfoo/2005.12.19
.?Delphi中使用SetUnhandledExceptionFilter的問題
這幾天在寫一個測試程序,包括使用SetUnhandledExceptionFilter來
反OD調試,關于SetUnhandledExceptionFilter的反調試原理之前(一年前了哈)
simonzh2000等人都有詳細講述,這里就不多講了,在Delphi里面要用這個
函數卻有點問題,先看看代碼:
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.
很簡單的一個程序,但得到的效果卻不是預期之中的,在彈出'Final?SEH'
之后又彈出一個Runtime?error。如果在窗體之中的按鈕事件里面寫這樣的測試
代碼的話,效果更加是“離奇”,彈出一個“除0錯”之后就沒事發生了,根本
沒有去Handler里面。
究其原因,Delphi編譯出來的程序有自己的一套用SEH建立起來的異常處理
機構,是自動的,在程序啟動之初就建立起來了。就連上面這樣簡單的程序也一
樣,在SetUnhandledExceptionFilter之前就建立了一個SEH結構。如果要達到預
期效果:發生異常時去到我們的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.
現在程序按照我們的想法運行了。在窗體的按鈕OnClick事件中使用也正常。
SetUnhandledExceptionFilter在高級語言中應用時應該要注意一下這個問題了。
特別是用高級語言寫殼用到這個反調試技巧時。另外說一說在異常處理函數返回
值為-1時的問題。hume在《SEH?in?ASM研究》中的資料說到:
EXCEPTION_EXECUTE_HANDLER?equ?1?表示我已經處理了異常,可以優雅地結束了?
EXCEPTION_CONTINUE_SEARCH?equ?0?表示我不處理,其他人來吧,于是windows調用默認的處理程序顯示一個錯誤框,并結束?
EXCEPTION_CONTINUE_EXECUTION?equ?-1?表示錯誤已經被修復,請從異常發生處繼續執行?
網上搜到一些關于SetUnhandledExceptionFilter的文章演示的都是返回值
為1的情況,而在反調試當中,這種情況是沒用的,因為返回到系統之后程序就
結束了,有用的是返回為-1的情況。具體設置和我們平時的SEH異常處理函數類
似,在到達SetUnhandledExceptionFilter指定的異常處理函數之后,[[esp+4]+4]
處就是CONTEXT?STRUCT。看代碼可以更清晰(測試環境:winxp?sp2):
//這里是用SetUnhandledExceptionFilter設置的異常處理函數
@Handler:
??mov?eax,[esp+4]
??mov?eax,[eax+4]
??add?dword?ptr?[eax+0B8],2?//異常指令2個字節長,加2指向下一條指令。eax指向CONTEXT?STRUCT。
??mov?eax,-1
??retn
//設置代碼:
??push?offset?@Handler
??call?SetUnhandledExceptionFilter
??xor?edx,edx
??idiv?edx
??nop?//可以在這里下斷測試(當然,OD要patch?UnhandledExceptionFilter)。
OK,收工。
kongfoo/2005.12.19
.?Delphi中使用SetUnhandledExceptionFilter的問題
這幾天在寫一個測試程序,包括使用SetUnhandledExceptionFilter來
反OD調試,關于SetUnhandledExceptionFilter的反調試原理之前(一年前了哈)
simonzh2000等人都有詳細講述,這里就不多講了,在Delphi里面要用這個
函數卻有點問題,先看看代碼:
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.
很簡單的一個程序,但得到的效果卻不是預期之中的,在彈出'Final?SEH'
之后又彈出一個Runtime?error。如果在窗體之中的按鈕事件里面寫這樣的測試
代碼的話,效果更加是“離奇”,彈出一個“除0錯”之后就沒事發生了,根本
沒有去Handler里面。
究其原因,Delphi編譯出來的程序有自己的一套用SEH建立起來的異常處理
機構,是自動的,在程序啟動之初就建立起來了。就連上面這樣簡單的程序也一
樣,在SetUnhandledExceptionFilter之前就建立了一個SEH結構。如果要達到預
期效果:發生異常時去到我們的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.
現在程序按照我們的想法運行了。在窗體的按鈕OnClick事件中使用也正常。
SetUnhandledExceptionFilter在高級語言中應用時應該要注意一下這個問題了。
特別是用高級語言寫殼用到這個反調試技巧時。另外說一說在異常處理函數返回
值為-1時的問題。hume在《SEH?in?ASM研究》中的資料說到:
EXCEPTION_EXECUTE_HANDLER?equ?1?表示我已經處理了異常,可以優雅地結束了?
EXCEPTION_CONTINUE_SEARCH?equ?0?表示我不處理,其他人來吧,于是windows調用默認的處理程序顯示一個錯誤框,并結束?
EXCEPTION_CONTINUE_EXECUTION?equ?-1?表示錯誤已經被修復,請從異常發生處繼續執行?
網上搜到一些關于SetUnhandledExceptionFilter的文章演示的都是返回值
為1的情況,而在反調試當中,這種情況是沒用的,因為返回到系統之后程序就
結束了,有用的是返回為-1的情況。具體設置和我們平時的SEH異常處理函數類
似,在到達SetUnhandledExceptionFilter指定的異常處理函數之后,[[esp+4]+4]
處就是CONTEXT?STRUCT。看代碼可以更清晰(測試環境:winxp?sp2):
//這里是用SetUnhandledExceptionFilter設置的異常處理函數
@Handler:
??mov?eax,[esp+4]
??mov?eax,[eax+4]
??add?dword?ptr?[eax+0B8],2?//異常指令2個字節長,加2指向下一條指令。eax指向CONTEXT?STRUCT。
??mov?eax,-1
??retn
//設置代碼:
??push?offset?@Handler
??call?SetUnhandledExceptionFilter
??xor?edx,edx
??idiv?edx
??nop?//可以在這里下斷測試(當然,OD要patch?UnhandledExceptionFilter)。
OK,收工。
總結
以上是生活随笔為你收集整理的旧调重弹-SetUnhandledExceptionFilter的使用问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 检查文件上传完成_“我的数据上传NCBI
- 下一篇: 修复Bug大幅升级 Sun发布MySQL