OllyDBG - 第十一章 | 反匯編練習 (三) 上
在上一篇的反匯編中獲得了很大的進展,也很明確知道自己在技術上缺少了什麼,主要就是組合語言和80x86的相關知識;在這塊的部分,我會在反匯編的過程中,不斷的去補充這方面的知識,希望透過不斷的練習時做,慢慢熟悉,而不是透過死背的方式去做學習!
檔案下載
目的程式:
reverseMe.7z
解壓縮密碼:
1 | morosedog |
使用PEid檢驗
檢驗顯示是使用MASM32 / TASM32 [Overlay]編寫。

開啟reverseMe.exe使用並分析
- 開啟
reverseMe.exe - 直接跳出訊息視窗標題為
Key File ReverseMe內容為Evaluation period out of date. Purchase new license

目標說明
讓程式使其驗證通過。
思路 (本人弱弱的,勿噴)
首先跳出一些訊息,所以應該可以利用OllyDBG - 第二章 | 字串參考的方式來找到關鍵字斷點,接續進行分析找到驗證的地方
使用OllyDBG分析
- 啟動
OllyDBG - 按下快捷鍵
F3 - 選擇
reverseMe.exe - 在入口點地址後面加上註解 (良好的註解有助於分析)

- 於反匯編視窗按下右鍵
- 選擇
尋找->所有參考文字字串

- 會開啟一個
文字字串參考位於 reveerseM:CODE的視窗 - 找到
Evaluation period out of date. Purchase new license下斷點

F9執行程式- 斷點到
00401084 . 68 17204000 push 00402017 ; ||Text = "Evaluation period out of date. Purchase new license" - 繼續
F8 - 到達
0040108B . E8 D7020000 call <jmp.&USER32.MessageBoxA> ; |\MessageBoxA - 就會跳出訊息視窗

- 開始分析這段代碼,可以發現他在執行
call <jmp.&USER32.MessageBoxA>之前push了四個參數 - 所以我們可以研判不能進入到這
- 於是往上看什麼地方可以跳過這段的判斷
- 發現
0040107B . /75 1D jnz short 0040109A ; |這段可以跳過 - 針對這段上方的
00401078 . 83F8 FF cmp eax,-1 ; |的指令做分析

Ctrl + F2重新開始- 直接
F8慢慢執行追蹤 - 會發現主要跳轉判斷前面是在
call <jmp.&KERNEL32.CreateFileA>然後push了七個參數,可以看到OPEN_EXISTING表示僅在文件或設備存在時打開它 - 繼續運行執行到
00401078 . 83F8 FF cmp eax,-1 ; | - 會發現 eax = FFFFFFFF 與 -1 做比較
- 根據cmp結果
jnz 若不等於0則跳越 ZF=0(這段的比較結果,放在額外補充那邊說明) - 所以我們可以假設他要去打開一個
Keyfile.dat的檔案
1 | 0040105C . 6A 00 push 0 ; |/hTemplateFile = NULL |
- 在相同目錄下建立一個
Keyfile.dat檔案 Ctrl + F2重新開始- 直接
F8慢慢執行追蹤 - 繼續運行執行到
00401078 . 83F8 FF cmp eax,-1 ; | - 會發現 eax = 00000088 與 -1 做比較
- 根據cmp結果
jnz 若不等於0則跳越 ZF=0(這段的比較結果,放在額外補充那邊說明) - 實現跳轉到
0040109A > \6A 00 push 0 ; /pOverlapped = NULL

- 繼續
F8 - 到
004010BF . /7C 36 jl short 004010F7會跳轉 - 繼續
F8 - 到達
00401105 . E8 5D020000 call <jmp.&USER32.MessageBoxA> ; |\MessageBoxA - 跳出訊息視窗標題為
Key File ReverseMe內容為Keyfile is no valid. Sorry.

- 根據上面的分析,凡是跳轉到
004010F7的就是失敗 - 直接看指令,看有沒有跳轉到不一樣的地方
- 發現
004010D8 . /E9 28010000 jmp 00401205 - 跳轉的地方是成功的訊息視窗

- 既然找到跳出成功訊息視窗的位置,那我們直接暴破吧
- 直接在
00401078 83F8 FF cmp eax,-1判斷檔案這邊直接做跳轉 - 修改成
jmp 00401205註:簡單解釋就是讀取檔案後去cmp這件事情直接改掉,變成直接跳到跳出成功訊息。

總結
這邊直接使用暴破的方式,沒有特別去分析Keyfile.dat的解析方式;主要是因為我發現cmp dword ptr ds:[402173],10這段的理解沒有很清楚,需要再對組合語言這個指令近一步了解。
應該在下一篇會針對分析Keyfile.dat的解析方式,會先花點時間了解一些組合語言,這樣解釋起來比較正確。
額外補充
這邊馬上補充cmp eax, -1的說明:
當前eax = FFFFFFFF
cmp FFFFFFFF, -1 結果會是相等 = 0 ,所以下方的jnz 若不等於0則跳越 ZF=0,是不會跳轉的。
註:cmp相等 = 0
為什麼FFFFFFFF 會等於 -1?
負數的表示是用補數再加1來做表示的。
00000001 = 二進制的 0000 0000 0000 0000 0000 0000 0000 0001
= 補數 1111 1111 1111 1111 1111 1111 1111 1110
= 加1 1111 1111 1111 1111 1111 1111 1111 1111
而1111 1111 1111 1111 1111 1111 1111 1111 = 十六進制的 FFFFFFFF
所以 cmp 會相等就是這樣來的~
所以當CreateFileA去OPEN_EXISTING的時候,找不到檔案的狀況下,函數回傳到eax的值就是FFFFFFFF。
註:我這邊提供一些可以參考的文章 (以上的練習我沒事先參考)
CSDN billvsme的专栏 的 OllyDbg 使用笔记 (三)
