打開ollydbg點選"選項"-"Debugging options"-"Exceptions"用于設定異常出現時od的預設處理行為。

windows異常機制中對異常的處理為:第一次異常處理過程中,先尋找調試器,如果調試器能處理異常,則結束異常處理流程,否則将異常交由程式的VEH/SEH機制處理;如果程式處理了異常,則結束異常處理,否則,windows進行第二次異常處理過程。"Ignore (pass to program) following exception"下的複選框被勾選/取消時,将影響Od第一次異常處理的行為。當複選框被勾選時,od收到異常後,傳回"異常未處理"給系統,進而由應用程式來處理異常;當複選框未被勾選,od傳回"異常已處理"給系統,由此停止異常處理流程。
接下來,我們用一段程式來說明這個結論,在main函數中觸發av異常,如果在第一輪異常進行中,Od處理了異常,則不會進入exceptFilter異常過濾函數;反之,程式會進入exceptFilter函數,并以此輸出"filter"和"end":
#include <stdio.h>
int exceptFilter()
{
printf("filter\n");
return 1;
}
int _tmain(int argc, _TCHAR* argv[])
{
if(argc==1)
{
__try
{
*(int*)0=1;
}
__except(exceptFilter())
{}
}
printf("End\n");
return 0;
}
先來看下av項未被勾選,程式運作到*(int*)0=1時的情況:
這種情況下,任由我按F7單步運作,程式一直卡死在指令:
010E10A5 C7 DB C7
并在Od底部顯示"Access violation...use Shift+F9 to pass exception to pragram".
為什麼有這樣的現象?很簡單,因為Od傳回異常已處理,但事實是異常還在,下一次運作這條指令時還會觸發av異常,這次Od又傳回異常已處理。如此往複,就顯得程式卡死在這條指令上。如果我們按Od的提示,按下"shift+F9"則會使程式進入exceptFilter函數。
現在,我們勾選av複選框,讓od不處理異常,然後重新開機程式,程式順利進入異常處理函數exceptFilter,并沒有卡死在av指令上: