x64dbg - 第十四章 | 反匯編練習(四) 上
目標程式
檔案下載:RegisterMe.Oops.exe
解壓密碼:morosedog
程式說明
這個程式的PE被故意修改過了,所以在用OllyDBG開啟的時候會出現錯誤,至於什麼是PE,這邊先不講解。
(這邊使用x64dbg沒有顯示錯誤)
什麼是Nag?翻譯為:撈叨;所以是什麼呢?
常有一些產品,在尚未註冊或是已經過期的狀態一下,在開啟程式前,會跳出一個提醒視窗,告知要購買新的序號了,還有在結束的時候,也會出現這個視窗;這就稱之為Nag視窗。
任務目標
- 查看比對
PE異常的部分 - 移除所有的
Nag視窗
分析程式
- 開啟
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 !!

- 檢驗顯示是使用
MASM32 / TASM32編寫。

搜尋思路
MASM32 / TASM32撰寫的,使用函數搜尋 (輸入框函數:MessageBox)。- 使用搜尋字串找關鍵字。
修改思路
- 使用
NOP填充替代彈出Nag的部分 - 使用
jmp跳過彈出Nag的部分
PE分析
- 開啟
RegisterMe.Oops.exe PE Viewer視窗點擊Reload- 切換到
IMAGE_OPTIONAL_HEADER與IMAGE_DIRECTORY_ENTRIES

- 另外開啟一個
x64dbg, - 開啟
reverseMe.exe PE Viewer視窗點擊Reload- 切換到
IMAGE_OPTIONAL_HEADER與IMAGE_DIRECTORY_ENTRIES

- 比較兩個
IMAGE_OPTIONAL_HEADER與IMAGE_DIRECTORY_ENTRIES的差異


- 差異如下
1
2
3
4
5
6
7
8
9
10
11
12SizeOfCode = 40000400 比對的資料 600
SizeOfInitializedData = 40000A00 比對的資料 1800
BaseOfCode = 40001000 一般都是1000
BaseOfData = 40002000 比對的資料2000
NumberOfRvaAndSizes = 40000004 一般都是10
// 這個程式沒有輸出,沒有輸出表,所以
Export Table address = 500000 應該為 0
Export Table size = 50000 應該為 0
註:詳細的修改方式可以參考OllyDBG - 第十三章 | 反匯編練習 (四) 上。
實際分析
開啟
RegisterMe.Oops.exe於反匯編視窗點選右鍵選擇
搜尋(S)->目前模組->跨模組呼叫(I)發現
MessageBoxA,對其設定中斷點F9執行程式斷點
0040101F | E8 C6010000 | call <JMP.&MessageBoxA> |F8步過彈出視窗標題為
Register Me內容為Remove the nags to register This will make program fully registered :))在此可以確認,這邊就是第一個
Nag按下確認按鈕
F8繼續步過,並持續觀察步過到下方指令時
1
00401034 | E8 19000000 | call registerme.oops.401052 |
彈出視窗標題為
Register Me ! Wait no longer :))內容為You need to register me now! It is supposed to be quite easy. Just patch the program to remove the Nags.在此可以確認,這邊是主程式的一個函數
00401052關閉視窗
斷點
00401047 | E8 9E010000 | call <JMP.&MessageBoxA> |F8步過彈出視窗標題為
Register Me內容為Oops! I am not registered !!在此可以確認,這邊就是第二個
Nag
分析總結
0040101F為第一個Nag。00401047為第二個Nag。00401034為Call00401052主程式位址。
修改思路
- 將
Nag段用NOP做填充。 - 跳過會彈
Nag的位址。
實際修改
這邊使用修改思路的第1個方法做示範。
開啟
RegisterMe.Oops.exe00401011~0040101F為第一個Nag全選,並右鍵選擇
二進位->用 NOP 填充 (Ctrl + 9)1
2
3
4
500401011 | 6A 00 | push 0 |
00401013 | 68 7D304000 | push registerme.oops.40307D | 40307D:"Register Me"
00401018 | 68 34304000 | push registerme.oops.403034 | 403034:"Remove the nags to register\r\nThis will make program fully registered :))"
0040101D | 6A 00 | push 0 |
0040101F | E8 C6010000 | call <JMP.&MessageBoxA> |00401039~00401047為第二個Nag全選,並右鍵選擇
二進位->用 NOP 填充 (Ctrl + 9)1
2
3
4
500401039 | 6A 00 | push 0 |
0040103B | 68 7D304000 | push registerme.oops.40307D | 40307D:"Register Me"
00401040 | 68 89304000 | push registerme.oops.403089 | 403089:"Oops! I am not registered !!"
00401045 | 6A 00 | push 0 |
00401047 | E8 9E010000 | call <JMP.&MessageBoxA> |點擊
修補程式或是快捷鍵Ctrl + P點擊
修補檔案(P)另存檔名
RegisterMe.Oops.NoNag.exe恭喜補丁產生
RegisterMe.Oops.NoNag.exe

這邊使用修改思路的第2個方法做示範。
開啟
RegisterMe.Oops.exe00401011~0040101F為第一個Nag0040100F | 74 13 | je registerme.oops.401024 |按下空白鍵將指令修改為
jmp 0x00401024,按下確定修改後如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16// 修改前
0040100F | 74 13 | je registerme.oops.401024 |
00401011 | 6A 00 | push 0 |
00401013 | 68 7D304000 | push registerme.oops.40307D | 40307D:"Register Me"
00401018 | 68 34304000 | push registerme.oops.403034 | 403034:"Remove the nags to register\r\nThis will make program fully registered :))"
0040101D | 6A 00 | push 0 |
0040101F | E8 C6010000 | call <JMP.&MessageBoxA> |
00401024 | 6A 0A | push A |
// 修改後
0040100F | EB 13 | jmp registerme.oops.401024 |
00401011 | 6A 00 | push 0 |
00401013 | 68 7D304000 | push registerme.oops.40307D | 40307D:"Register Me"
00401018 | 68 34304000 | push registerme.oops.403034 | 403034:"Remove the nags to register\r\nThis will make program fully registered :))"
0040101D | 6A 00 | push 0 |
0040101F | E8 C6010000 | call <JMP.&MessageBoxA> |
00401024 | 6A 0A | push A |00401039~00401047為第二個Nag00401039 | 6A 00 | push 0 |按下空白鍵將指令修改為
jmp 0x0040104C,按下確定修改後如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16// 修改前
00401039 | 6A 00 | push 0 |
0040103B | 68 7D304000 | push registerme.oops.40307D | 40307D:"Register Me"
00401040 | 68 89304000 | push registerme.oops.403089 | 403089:"Oops! I am not registered !!"
00401045 | 6A 00 | push 0 |
00401047 | E8 9E010000 | call <JMP.&MessageBoxA> |
0040104C | 50 | push eax |
0040104D | E8 BC010000 | call <JMP.&ExitProcess> |
// 修改後
00401039 | EB 11 | jmp registerme.oops.40104C |
0040103B | 68 7D304000 | push registerme.oops.40307D | 40307D:"Register Me"
00401040 | 68 89304000 | push registerme.oops.403089 | 403089:"Oops! I am not registered !!"
00401045 | 6A 00 | push 0 |
00401047 | E8 9E010000 | call <JMP.&MessageBoxA> |
0040104C | 50 | push eax |
0040104D | E8 BC010000 | call <JMP.&ExitProcess> |點擊
修補程式或是快捷鍵Ctrl + P點擊
修補檔案(P)另存檔名
RegisterMe.Oops.NoNag.exe恭喜補丁產生
RegisterMe.Oops.NoNag.exe

註:以上參考了
x64dbg
x64dbg’s documentation!
CSDN billvsme的专栏 的 OllyDbg 使用笔记 (四)
