1. 程式人生 > >OD 實驗(十六) - 從對話框入手對程序的逆向

OD 實驗(十六) - 從對話框入手對程序的逆向

gpa 右鍵 入棧 template ESS 接下來 步驟 技術 img

對話框:

對話框從類型上分為兩類:modal 對話框和 modeless 對話框,就是模態對話框和非模態對話框,也有叫成模式和非模式

模態對話框不允許用戶在不同窗口間進行切換,非模態對話框允許用戶在不同窗口間進行切換

兩者形成區別的原理是模態對話框由 windows 為它內建一個消息循環,而非模態對話框的消息則是通過用戶程序中的消息循環派送的

創建模態對話框是由調用 DialogBoxParam 函數實現的,而創建非模態對話框是調用 CreatDialogParam 函數實現

程序:

技術分享圖片

點擊 SETUP.EXE 進行安裝

按默認步驟安裝

技術分享圖片

這是主界面

技術分享圖片

點擊 File -> Register 是進行註冊的地方

技術分享圖片

關閉程序

技術分享圖片

它會彈出該對話框,該對話框是模態對話框

技術分享圖片

如果直接按退出會顯示該幫助文檔

技術分享圖片

只有點擊 I Will Register Soon 才會退出程序

用 eXeScope 載入程序

技術分享圖片

選擇 資源 -> 對話框 -> 103,是程序要退出時候的對話框

技術分享圖片

103 為 MFC 下的 lpTemplateName 對話框模板

逆向:

用 OD 載入程序

技術分享圖片

右鍵 -> 查找 -> 所有命令

技術分享圖片

查找 push 0x67,67 為 103 的十六進制

調用模態對話框 DialogBoxParam 的時候會將它的參數入棧,103 也是它的第一個參數

技術分享圖片

雙擊,來到它的位置

技術分享圖片

在該代碼塊開頭下一個斷點

技術分享圖片

跑一下程序

技術分享圖片

點擊退出程序之後,沒有彈出對話框,直接停在該斷點處

如果函數 A 調用函數 B 的話,函數 A 會被 push 入棧,當函數 B 執行完之後返回到函數 A 的時候,函數 A 會被 pop 出棧

看一下棧窗口

技術分享圖片

返回到 004023C0 來自 00401220

右鍵 -> 反匯編窗口中跟隨

技術分享圖片

來到了該地址

上面那個 call 就是調用剛才那個過程

技術分享圖片

上面有個 jnz 跳轉指令,如果 eax 是一個非零值,它就會進行跳轉,跳轉就能跳過那個 call 指令

在 test 指令上面的 call 指令處下一個斷點

技術分享圖片

重新跑一下程序

點擊關閉程序的按鈕之後停在該斷點處

技術分享圖片

按 F7 步入

技術分享圖片

只有幾條指令之後就執行 retn,沒有條件跳轉,可能程序一運行就直接在這裏檢查是否註冊

在該過程開頭下一個斷點

技術分享圖片

重新跑一下程序

技術分享圖片

一打開程序,就停在該斷點處,說明這個過程就是檢查是否註冊

如果該過程返回非零值就會跳過程序最後的那個對話框

接下來修改指令

技術分享圖片

如果修改將上面這條指令改為 mov eax, 0x1 的話,會覆蓋掉後面的那條指令

技術分享圖片

所以把這兩條對 eax 的值有影響的指令做修改,改為 mov eax, 0x1

技術分享圖片

選擇這兩行指令,右鍵 -> 匯編,進行修改

技術分享圖片

改完之後保存程序,運行

技術分享圖片

Register 按鈕已經不能點擊了,退出程序的時候也沒有對話框了

OD 實驗(十六) - 從對話框入手對程序的逆向