SetUnhandledExceptionFilter觸發條件:
1、當程序有異常,且沒相應的處理
2、沒有人進行反調試,滿足這兩個條件的時候,就會其中傳輸的參數(實則就是一個異常處理函數) 來進行處理
但是這個異常處理函數如果被用來檢測是否有人為進行反調試的時候,這個就可以用來當作反調試
1、載入OD,給UnhandledExceptionFilter下斷點,因為UnhandledExceptionFilter里面又調用了ZwQueryInformationProcess進行反調試檢測
2、可以發現ZwQueryInformationProcess傳入的參數為如下
3、跟隨緩沖區的數據為如下
4、F8單步步過,發現緩沖區保存的值已經發生了改變,當這個值不是為00000000的時候那么被判斷為有人為的在進行調試
然后直接被結束進程
5、那么如果我們把緩沖區的值置為0看下,已經知道了接下來會進行的事情SetUnhandledExceptionFilter觸發條件,有異常,沒人處理,沒人調試,所以肯定觸發SetUnhandledExceptionFilter中傳入的處理參數,那么給這個處理函數也下個斷點
6、下完之后,重復如上操作,然后緩沖區的值置為0,就被斷到如下地址
7、F8,來到關鍵跳,來到這里就已經代表了,此時是正常運行,並且把輸入的值進行正常的判斷,如果這個跳轉跳了那么就是輸入錯誤,沒跳就是輸入正確,那么將ZF置1進行不跳轉,發現成功
總結:程序的作者先是故意觸發異常,讓UnhandledExceptionFilter進行處理,然后在其中調用了ZwQueryInformationProcess進行反調試的檢測,如果發現沒有人進行反調試,並且當程序有異常,且沒相應的處理 ,就會將SetUnhandledExceptionFilter中處理異常的函數進行處理,而這個異常的函數處理也就是賬號密碼的驗證