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.exe
00401011
~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.exe
00401011
~0040101F
為第一個Nag
0040100F | 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
為第二個Nag
00401039 | 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 使用笔记 (四)