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文件与虚拟内存之间的映射