x64dbg - 第二十一章 | 反匯編練習(十)
目標程式
檔案下載:fjprodsetup.exe
解壓密碼:morosedog
程式簡介
Flash Jigsaw Producer具有舒適的界面,能夠從任何尺寸高達2800x2800像素的BMP,GIF或JPG圖像建立Flash拼圖。
前置作業
- 使用
管理者權限安裝 Next安裝- 安裝完畢自動開啟主程式

任務目標
- 破解非註冊版本限制的功能。
分析程式
- 開啟
fjproducer.exe - 點擊
Options->Flash Sizes... - 見標題後方多了
(unregistered)

- 點擊
Desk->Select... - 彈出視窗,標題為
No Registration!內容為For registered users only

檢驗顯示是使用Microsoft Visual C++ 7.0編寫。

搜尋思路
- 使用搜尋字串找關鍵字。
修改思路
- 修改驗證的邏輯
實際分析
開啟
fjproducer.exe於反匯編視窗點選右鍵選擇
搜尋(S)->目前模組->字串引用(S)搜尋輸入unregistered運氣不錯,發現標題的字串
1
2位址 反組譯 字串
00404700 push fjproducer.429CC8 "Flash Jigsaw Producer (unregistered)"左鍵雙擊
到達
00404700位址,向上觀察會跳轉跳過彈出訊息視窗的指令1
2
3
4
5
6
7
8
9
10
11
12
13004046E0 | 8A4424 04 | mov al,byte ptr ss:[esp+4] |
004046E4 | 84C0 | test al,al |
004046E6 | 74 12 | je fjproducer.4046FA |
004046E8 | A1 440A4300 | mov eax,dword ptr ds:[430A44] |
004046ED | 68 F09C4200 | push fjproducer.429CF0 | 429CF0:"Flash Jigsaw Producer"
004046F2 | 50 | push eax |
004046F3 | FF15 5C924200 | call dword ptr ds:[<&SetWindowTextA>] |
004046F9 | C3 | ret |
004046FA | 8B0D 440A4300 | mov ecx,dword ptr ds:[430A44] |
00404700 | 68 C89C4200 | push fjproducer.429CC8 | 429CC8:"Flash Jigsaw Producer (unregistered)"
00404705 | 51 | push ecx |
00404706 | FF15 5C924200 | call dword ptr ds:[<&SetWindowTextA>] |
0040470C | C3 | ret |004046E6 | 74 12 | je fjproducer.4046FA |會跳到彈出未註冊對
004046E6按右鍵選擇二進位->用 NOP 填充 (Ctrl + 9)1
2
3
4
5// 修改前
004046E6 | 74 12 | je fjproducer.4046FA |
// 修改後
004046E6 | 90 | nop |
004046E7 | 90 | nop |F9執行程式點擊
Options->Flash Sizes...見標題後方多了
(unregistered)點擊
Desk->Select...彈出視窗,標題為
No Registration!內容為For registered users only發現程式並沒有真正破解
在此可以確認單純跳過只是修改標題的內容
Ctrl + F2重新啟動(S)- 反匯編視窗中按下
Ctrl + G輸入004046E6,會跳轉到004046E6位址 - 到達
00404700位址,向上觀察影響je跳轉1
2
3004046E0 | 8A4424 04 | mov al,byte ptr ss:[esp+4] |
004046E4 | 84C0 | test al,al |
004046E6 | 74 12 | je fjproducer.4046FA | test al,al影響je的跳轉結果mov al,byte ptr ss:[esp+4]會異動al的值004046E0 | 8A4424 04 | mov al,byte ptr ss:[esp+4] |右鍵選擇尋找參考(R)->選定的位址(S)- 可見以下位址參考
1
2
3位址 反組譯
004047D3 call fjproducer.4046E0
00404880 call fjproducer.4046E0 - 右鍵選擇
Set breakpoint on all commands(在所有命令上設置斷點) Ctrl + F2重新啟動(S)F9執行程式- 斷點
004047D3 | E8 08FFFFFF | call fjproducer.4046E0 | F7步入- 斷點在
004046E0 | 8A4424 04 | mov al,byte ptr ss:[esp+4] | - 可以發現這邊是決定標題顯示的地方
Ctrl + F2重新啟動(S)F9執行程式斷點
004047D3 | E8 08FFFFFF | call fjproducer.4046E0 |向上觀察
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
170040478B | 68 60034300 | push fjproducer.430360 | 430360:"C:\\Users\\morose\\AppData\\Local\\YavSoft\\fjproducer\\startup.ini"
00404790 | 68 8CE04200 | push fjproducer.42E08C | 42E08C:"fjpefi0azn1tat3byxaf"
00404795 | 68 249D4200 | push fjproducer.429D24 | 429D24:"Program ID"
0040479A | 68 149D4200 | push fjproducer.429D14 | 429D14:"Registration"
0040479F | FF15 28904200 | call dword ptr ds:[<&WritePrivateProfile |
004047A5 | 8B0D ACE34200 | mov ecx,dword ptr ds:[42E3AC] | 0042E3AC:&"Password"
004047AB | 68 60034300 | push fjproducer.430360 | 430360:"C:\\Users\\morose\\AppData\\Local\\YavSoft\\fjproducer\\startup.ini"
004047B0 | 6A 28 | push 28 |
004047B2 | 68 34034300 | push fjproducer.430334 | 430334:"<No Pass>"
004047B7 | 68 089D4200 | push fjproducer.429D08 | 429D08:"<-No Pass->"
004047BC | 51 | push ecx |
004047BD | 68 149D4200 | push fjproducer.429D14 | 429D14:"Registration"
004047C2 | FF15 68904200 | call dword ptr ds:[<&GetPrivateProfileSt |
004047C8 | 68 34034300 | push fjproducer.430334 | 430334:"<No Pass>"
004047CD | E8 6EFEFFFF | call fjproducer.404640 |
004047D2 | 50 | push eax |
004047D3 | E8 08FFFFFF | call fjproducer.4046E0 |004047CD、004047C2與0040479F的call回傳eax的值004047CD、004047C2與0040479F設定中斷點移除其他中斷點
Ctrl + F2重新啟動(S)F9執行程式斷點在
0040479F | FF15 28904200 | call dword ptr ds:[<&WritePrivateProfile |F8一步一步過,並持續觀察eax的變化004047CD的call回傳eax的值,FFFFFF00,故這個需要在F7步入觀察F7步入觀察程式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2400404640 | 83EC 2C | sub esp,2C |
00404643 | 56 | push esi | esi:"<No Pass>"
00404644 | 8B7424 34 | mov esi,dword ptr ss:[esp+34] | [esp+34]:"<No Pass>"
00404648 | 8BC6 | mov eax,esi | esi:"<No Pass>"
0040464A | 8D50 01 | lea edx,dword ptr ds:[eax+1] | edx:"No Pass>"
0040464D | 8D49 00 | lea ecx,dword ptr ds:[ecx] |
00404650 | 8A08 | mov cl,byte ptr ds:[eax] |
00404652 | 40 | inc eax |
00404653 | 84C9 | test cl,cl |
00404655 | 75 F9 | jne fjproducer.404650 |
00404657 | 2BC2 | sub eax,edx | edx:"No Pass>"
00404659 | 83F8 04 | cmp eax,4 |
0040465C | 73 07 | jae fjproducer.404665 |
0040465E | 32C0 | xor al,al |
00404660 | 5E | pop esi | esi:"<No Pass>"
00404661 | 83C4 2C | add esp,2C |
00404664 | C3 | ret |
00404665 | 6A 03 | push 3 |
00404667 | 68 C49C4200 | push fjproducer.429CC4 | 429CC4:"fjr"
0040466C | 56 | push esi | esi:"<No Pass>"
0040466D | E8 6EAA0100 | call fjproducer.41F0E0 |
00404672 | 83C4 0C | add esp,C |
00404675 | 85C0 | test eax,eax |
00404677 | 75 E5 | jne fjproducer.40465E |中間過程應該是在驗證註冊的內容
0040465E | 32C0 | xor al,al |最後傳入eax的值在此可以假設
0040465E回傳的eax是否註冊成功0040465E | 32C0 | xor al,al |按下空白鍵將指令修改為
xor al, 0x1,按下確定修改後如下
1
2
3
4// 修改前
0040465E | 32C0 | xor al,al |
// 修改後
0040465E | 32C0 | xor al,1 |移除所有中斷點
F9執行程式點擊
Desk->Select...功能正常使用
點擊
Options->Flash Sizes...見標題沒有為註冊訊息
恭喜程式真正被破解
分析總結
0040465E回傳是否註冊成功的關鍵eax值
修改思路
根據分析總結
- 修改直接賦予
al的值為0x1
實際修改
開啟
fjproducer.exe0040465E | 32C0 | xor al,al |按下空白鍵將指令修改為
xor al, 0x1,按下確定修改後如下
1
2
3
4// 修改前
0040465E | 32C0 | xor al,al |
// 修改後
0040465E | 32C0 | xor al,1 |點擊
修補程式或是快捷鍵Ctrl + P點擊
修補檔案(P)另存檔名
fjproducer.crack.exe恭喜補丁產生
fjproducer.crack.exe
註:以上參考了
x64dbg
x64dbg’s documentation!
CSDN billvsme的专栏 的 OllyDbg 使用笔记 (十)
