天天看點

Ollydbg異常處理設定項

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

Ollydbg異常處理設定項

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時的情況:

Ollydbg異常處理設定項

這種情況下,任由我按F7單步運作,程式一直卡死在指令:

010E10A5     C7             DB C7      

并在Od底部顯示"Access violation...use Shift+F9 to pass exception to pragram". 

Ollydbg異常處理設定項

為什麼有這樣的現象?很簡單,因為Od傳回異常已處理,但事實是異常還在,下一次運作這條指令時還會觸發av異常,這次Od又傳回異常已處理。如此往複,就顯得程式卡死在這條指令上。如果我們按Od的提示,按下"shift+F9"則會使程式進入exceptFilter函數。

現在,我們勾選av複選框,讓od不處理異常,然後重新開機程式,程式順利進入異常處理函數exceptFilter,并沒有卡死在av指令上:

繼續閱讀