OD 實驗(十六) - 從對話框入手對程序的逆向
對話框:
對話框從類型上分為兩類: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 實驗(十六) - 從對話框入手對程序的逆向