OD 實驗(二十一) - 對反除錯程式的逆向分析(二)
程式:
執行程式
點選“Verify”
關閉該程式,啟動 OD
再執行程式
逆向:
用 OD 載入程式
按 F8 往下走
執行完這個 call 指令就彈出了對話方塊
這個 call 指令呼叫了 DialogBoxParam 函式建立模態對話方塊
如果步入該函式的話,會跳到動態連結庫中
如果按 Alt+F9 讓程式回到執行區域的時候停下也不行
DialogBoxParam 函式具體實現什麼樣的操作由引數 IpDialogFunc 決定,IpDialogFunc 為指向模態對話方塊過程的指標
IpDialogFunc 引數指向的地址為 40108C
在該處下一個斷點,執行程式
停在斷點處
按 F8 往下走
執行跳轉,一路預設往下走
到了動態連結庫中,按 Alt+F9
程式又回到了起始處,繼續往下走
這次的跳轉沒有實現
接著往下走
走到這個地方會響一聲彈出對話方塊的聲音,然後又回到原處
這個 call 處下一個斷點,重新跑一下程式
停在這個地方後,按 F8
彈出了對話方塊
看來是這個 call 語句
步入這個 call 語句
這裡先是呼叫了一個 API 函式 CreateToolhelp32Snapshot 來建立程序快照
這兩個是它的引數
這個函式的第一個引數 dwFlags 用來指定“快照”中需要返回的物件,第二個引數 th32ProcessID 用來指定要獲取哪一個程序的快照,當獲取系統程序列表或獲取 當前程序快照時可以設為 0
該函式如果呼叫成功,返回快照的控制代碼;呼叫失敗,返回 INVALID_HANDLE_VALUE
eax 的值為 BC,函式呼叫成功
執行完這句,EDI 的值為 OLLYDBG.EXE
然後呼叫 Process32First 函式,前面兩個是它的函式
當利用函式 CreateToolhelp32Snapshot 函式獲得當前執行程序的快照後,可以用 Process32First 函式來獲得第一個程序的控制代碼
接著往下走
[System Process] 為 Process32First 函式的結果
然後呼叫 lstrcmpi 函式對它的兩個引數進行對比,前面兩個是它的引數
如果兩個的值相同返回 0,不同返回 1
值為 1,兩個引數的值不同
這個跳轉就沒有實現,如果是 0 的話,跳轉實現
接著往下走
接下來呼叫了 Process32Next 函式,前面兩個為它的引數
Process32Next 函式用來獲得下一個程序的控制代碼
接著往下走
Process32Next 獲取的是 System
然後呼叫 lstrcmpi 函式進行字串對比,兩個值不一樣,返回 1
跳轉沒有實現
往下走
這個跳轉往上跳,是一個迴圈
通過 Process32Next 函式逐個地獲取程序的控制代碼,並判斷程序中是否有“OLLYDBG.EXE”
如果程序中存在 OLLYDBG.EXE 就會彈出錯誤的對話方塊
如果程序中沒有 OLLYDBG.EXE,則呼叫 CloseHandle,然後返回,ollybug.exe 不區分大小寫