OllyDBG - 第十三章 | 反匯編練習 (四) 上
反匯編到現在也差不多有一點點的經驗了,這篇將會多介紹一些東西,這邊要介紹有些程式中討厭的Nag視窗。
什麼是Nag?翻譯為:撈叨;所以是什麼呢?就是常有一些產品,在尚未註冊或是已經過期的狀態一下,在開啟程式前,會跳出一個提醒視窗,告知要購買新的序號了,還有在結束的時候,也會出現這個視窗;這就稱之為Nag視窗。
還有這個程式的PE被故意修改過了,所以在用OD開啟的時候會出現錯誤,至於什麼是PE,這邊先不講解,這邊主要還是在於反匯編的練習,後面會慢慢提到一些其他的知識。
檔案下載
目的程式:
RegisterMe.Oops.7z
解壓縮密碼:
1 | morosedog |
使用PEid檢驗
檢驗顯示是使用MASM32 / TASM32編寫。

開啟RegisterMe.Oops.exe使用並分析
- 開啟
RegisterMe.Oops.exe - 跳出
Nag視窗,顯示標題Register Me內容Remove the nags to resister This will make program fully registered :)) - 按下
確定 - 跳出主程式視窗,顯示標題
Register Me ! wait no longer :))內容You need to register me now! It is supposed ti be quite easy. Just patch the program to remove the Nags. - 點擊
關閉 - 跳出
Nag視窗,顯示標題Register Me內容Oops! Iam not registered !!
分析:基本上就是找到彈跳視窗的函數,然後找到判斷的地方,將其跳過,應該就可以了



目標說明
在開啟程式後,Nag視窗都不顯示
使用OllyDBG開啟錯誤卡死問題
主要是因為PE的部分被惡修改,造成OD執行上的錯誤。


打開選項 -> 除錯設定 -> 事件,將設定第一次暫停於選擇系統斷點,這樣就不會卡死
註:改好
PE問題,要反匯編程式記得修改回WinMain(若位置已知)

使用OllyDBG 修正PE檔頭
- 按下
Alt + M或是上方的M圖示,開啟記憶體視窗 - 你可以看到
PE檔頭 - 我們要注意的是地址為00開頭,如果是7xx看到的,那些
PE檔頭是dll的。

而我這邊的建議是用另一個OD開啟第OllyDBG - 第十一章 | 反匯編練習 (三) 上的目標程式,來做比對
這樣你就可以很清楚知道,到底哪些地方怪怪的
比較一下兩張圖片的
PE大小,一個為00005000,一個為00001000- 通常正常的
PE大小應該都為00001000
- 通常正常的
而且下方的
代碼、資料、輸入表…等等都不見了由此可見,這個
PE檔頭真的有問題


左鍵雙擊有問題的那個
PE檔頭相信到這邊會有一堆看不懂的東西,這很正常,我也沒很懂,因為我不了解
PE的結構不過沒關係,我們先往下看,看到
004000C0 50 45 00 00>ASCII "PE" ; PE signature (PE),這邊就是PE檔頭的開始同樣的,我們開啟兩個的來做比對,就可以發現有一些資料被異常修改的很大
我這邊有特別標示出怪怪的資料


- 我們將這些怪怪的資料,根據比對的資料去做修改
- 點選資料,點擊右鍵選擇
修改整數
1 | SizeOfCode = 40000400 改成比對的資料 600 |
註:基本上資料的最高位有數值,基本上是不太可能的,這程式沒有很大,所以4000400,基本上應該是0000400,只是我這邊用比對的資料去做修改,也是可以的(算是運氣好)。
- 我們要另存這個檔,先記住修改的位置為
00400DC~0040013C這中間 - 我們回到反匯編視窗
- 在最下方的資料視窗按下
Ctrl + G輸入00400DC - 選中
00400DC~0040013C - 按下右鍵選擇
複製到可執行檔案 - 在跳出視窗按下右鍵選擇
備份->儲存資料到檔案 - 另存檔名為
RegisterMe.Oops.fixPE.exe


- 將
選項->除錯設定->事件,將設定第一次暫停於選擇WinMain(若位置已知) - 按下
F3 - 開啟剛剛另存的
RegisterMe.Oops.fixPE.exe - 恭喜沒再報錯誤了
註:這邊提供修好的RegisterMe.Oops.fixPE.7z給予下載
使用OllyDBG分析
在開始之前,建議還是使用OD先做初步的分析在做爆破或是破解。
然而經過前面多篇的反覆練習,對於OD的使用,有了基本的功力,在這邊將會直接開始使用動態圖來做分析反匯編,將不再透過文字來描述,僅僅會說明一些修改的重點。
方法一:
- 使用修改指令的方式跳過惱人的
Nag視窗 - 主要是將會跳出
Nag的判斷或是call將其使用jmp的方式跳過

方法二:
- 使用
NOP來將跳出Nag的指令做填充

總結
這邊已經開始提到PE檔頭的部分,我對這塊也是不了解的,在反匯編練習到一段落後,將會開始來說明一下PE。
額外補充
- GetModuleHandleA,這個API函數用於獲取程式的ImageBase (基址)
- 名詞的解釋
- Image Base = 基址,PE裝入記憶體時的基地址。默認情況下,EXE文件在記憶體中對應的地址是0x00400000,DLL文件是0x10000000。這些位置可能通過編譯選項修改
- VA = (VirtualAddress, 虛擬地址),PE文件中的指令裝入記憶體後的地址
- RVA = (RelativeVirtuakAddress, 相對虛擬地址),是記憶體地址相對於映射基址的偏移量
- EP = (EntryPoiny, 程式入口點)
- 虛擬地址,基址,相對虛擬地址三者之間
- VA = Image Base + RVA
註:我這邊提供一些可以參考的文章
CSDN billvsme的专栏 的 OllyDbg 使用笔记 (四)
PE文件与虚拟内存之间的映射
