OllyDBG - 第七章 | 反匯編練習 (一)
這邊開始就要針對網路上提供給新手的CrackMe程式進行練習,在後面幾篇應該都會是這些練習文章。在到達一定的反匯編的組合語言瓶頸的時候,將會開始針對組合語言進行學習了解。
註:這邊的教學和反匯編過程絕對不是
絕對,一定有其他的方法和思路。
檔案下載
目的程式:
hello.7z
解壓縮密碼:
1 | morosedog |
使用PEid檢驗
檢驗顯示是使用Microsoft Visual C++ v6.0編寫。

開啟hello.exe使用並分析
- 開啟
hello.exe - 彈出視窗標題為
Hello內容為Welcome!

目標說明
將標題和內容的內容進行修改,並且另存檔案
思路 (本人弱弱的,勿噴)
首先為彈出視窗,所以應該可以利用OllyDBG - 第三章 | 函數參考的方式來找到斷點,接續進行分析找到記憶體位置進行修改內容。
硬幹法,一步一步看Code,看在什麼地方跳出視窗,針對該隊指令下斷點並進行分析,找到記憶體位置進行修改內容。
註:以上兩種方法,我都有實驗過,都可以達成目標
使用OllyDBG分析 (方法一)
- 啟動
OllyDBG - 按下快捷鍵
F3 - 選擇
hello.exe - 在入口點地址後面加上註解 (良好的註解有助於分析)

- 按下
Ctrl + N - 瀏覽一下函數,在上方可以判定是一個訊息窗口,所以基本上找類似
MessageBox的函數

- 在該函數按下右鍵
- 選擇
在每個參考上設定斷點

- 按下
F9執行程式 - 斷點在
0040100E |. FF15 9C504000 call dword ptr ds:[<&USER32.MessageBoxA>>; \MessageBoxA

F7進入F8一步一步到75F8FD28 FF75 10 push dword ptr ss:[ebp+10] ; hello.0040603C- 此時注意資訊視窗
堆疊 ss:[0018FEF8]=0040603C (hello.0040603C), ASCII "Hello"- 說明了該
Hello資料是從0040603C來的
- 說明了該
- 在資訊上窗上的這筆資料右鍵選擇
在資料視窗中跟隨數值 - 在最下面的資料視窗會看到
Hello的數值註:這邊還不進行修改數值,繼續分析

- 接續
F8一步一步到75F8FD2B FF75 0C push dword ptr ss:[ebp+C] ; hello.00406030 - 此時注意資訊視窗
堆疊 ss:[0018FEF4]=00406030 (hello.00406030), ASCII "Welcome!"- 說明了該
Welcome!資料是從00406030來的
- 說明了該
- 在資訊上窗上的這筆資料右鍵選擇
在資料視窗中跟隨數值 - 在最下面的資料視窗會看到
Welcome!的數值

- 在資料視窗中選反白
Welcome!這段HEX 資料 - 按下
空白鍵

- 在ASCII裡面輸入
J.J's Blogs - 在HEX +0D 的最後面補上
00,並按下確定註:00的用意可以參考,ASCII
白話文就是字符串用00做為結尾

- 按下
F9 - 看到訊息視窗跳出來
- 此時可以看到內容已經變更為
J.J's Blogs- 註:眼尖的你一定發現標題不見了,那是因為記憶體位置被蓋掉了(溢出),這邊不特別說明

- 註:眼尖的你一定發現標題不見了,那是因為記憶體位置被蓋掉了(溢出),這邊不特別說明

- 在資料視窗點擊右鍵選擇
複製到可執行檔案

- 在視窗按下右鍵選擇
備份->儲存資料到檔案 - 另存在別的位置,黨名改為
hello(Cracked).exe

- 執行
hello(Cracked).exe註:會發現內容怪怪的,標題又回來了⋯ (我不是很確定為什麼,所以不在這邊做解釋)
- 目標達成

## 使用OllyDBG分析 (方法二)
- 啟動
OllyDBG - 按下快捷鍵
F3 - 選擇
hello.exe - 在入口點地址後面加上註解 (良好的註解有助於分析)
- 執行
F8一步一步往下 - 會發現執行到
004010E9 |. E8 12FFFFFF call 00401000後會跳出訊息視窗 F2斷點在這Ctrl + F2重新開始F9執行程式- 斷點到
004010E9 |. E8 12FFFFFF call 00401000 - 按下
F7進入 - 會進入到
00401000 /$ 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL

針對代碼解釋
首先最前面知道是用C++撰寫的程式,然後使用的函數為MessageBox函數
下方可以看到傳入的參數類型為(HWND,LPCTSTR,LPCTSTR,UINT)
1 | int MessageBox( |
類型:HWND
- 要建立的消息框的所有者窗口的句柄。如果此參數為NULL,則消息框沒有所有者窗口。
類型:LPCTSTR
- 要顯示的消息。如果字符串由多行組成,則可以使用每行之間的回車符和/或換行符分隔行。
類型:LPCTSTR
- 對話框標題。如果此參數為NULL,則默認標題為“ 錯誤”。
輸入:UINT
- 對話框的內容和行為。此參數可以是來自以下標誌組的標誌的組合。消息框中顯示的按鈕
回到反匯編代碼這邊看到OllyDBG很好心的根據dll自動註解了;
第一個動作 push 0 ;Style = MB_OK|MB_APPLMODAL
第二個動作 push 0040603C ;Title = "Hello"
第三個動作 push 00406030 ;Text = "Welcome!"
第四個動作 push 0 ;hOwner = NULL
第五個動作 call dword ptr ds:[<&USER32.MessageBoxA>>; \MessageBoxA
夠過分析,可以發現匯編的動作和傳入的參數是相反的,所以參數堆疊的順序是從右往左的。
1 | 00401000 /$ 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL |
- 分析完成後繼續
F8 - 停到
00401002 |. 68 3C604000 push 0040603C ; |Title = "Hello" - 看到資訊窗口
0040603C=0040603C (ASCII "Hello")表示該值的記憶體位址 - 在下方的資料窗口,按下
Ctrl + G - 輸入
0040603C - 在資料視窗中選反白
Hello這段HEX 資料 - 按下
空白鍵 - 在ASCII裡面輸入
J.J's - 在HEX +0D 的最後面補上
00,並按下確定 - 按下
F9 - 看到訊息視窗跳出來
- 此時可以看到標題已經變更為
J.J's - 後續步驟就不再示範⋯⋯請參考方法一後半部

總結
這次可以算是沒有先看教學就先做分析 (第一個方法),算是有成功踏出第一步,然後第二個方法,是教學文章提及的,主要值得學習的是在004010E9 |. E8 12FFFFFF call 00401000裡面那邊有特別做解釋,多增長一些知識。
慢慢地對於反匯編越來越有興趣了,共勉。
註:以上參考了
CSDN billvsme的专栏 的 OllyDbg 使用笔记 (一)
