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.exe
0040465E | 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 使用笔记 (十)