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