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 使用笔记 (三)