x64dbg - 第二十八章 | 反匯編練習(十七)
前言
這篇延續上一篇x64dbg - 第二十七章 | 反匯編練習(十六),針對提供的輔助程式eXeScope.exe
做破解,因未註冊的eXeScope.exe
,僅可對相同的檔案做一次的修改。
目標程式
檔案下載:eXeScope.exe
解壓密碼:morosedog
程式簡介
這是一套可將程式中的英文字挑出來加以修改、翻譯,將軟體轉成中文的操作介面來,它包括可更改選單menu
、字體font
、對話方塊dialog
,它還能直接修改EXE
,DLL
,OCX
..etc
.
任務目標
- 破解註冊
- 分析註冊碼算法 (未實現)
分析程式
執行
eXeScope.exe
開啟主程式
點擊
幫助
->註冊(R)...
彈出
註冊
視窗輸入
你的名字(N)
、ID
點擊
確定
彈出
錯誤
視窗,內容無效的 ID 或名字
點擊
文件
->打開(O)...
選擇上一章的
Urlegal.exe
展開
資源
->對話框
選擇
103
編輯對話框內的網址
Dialog: 103
、Static: http://www.worldlynx.net/pgerhart/
注意:
103 (十進制)
,0x67 (十六進制)
表示為Nag
視窗的hInstance
修改
http://www.worldlynx.net/pgerhart/
->https://morosedog.gitlab.io/
點擊
保持更新
點擊
確定
再次點擊
文件
->打開(O)...
選擇上一章的
Urlegal.exe
展開
資源
->對話框
選擇
103
編輯對話框內的網址
Dialog: 103
、Static: http://www.worldlynx.net/pgerhart/
注意:
103 (十進制)
,0x67 (十六進制)
表示為Nag
視窗的hInstance
修改
https://morosedog.gitlab.io/
->http://www.worldlynx.net/pgerhart/
點擊
保持更新
彈出
錯誤
視窗,內容你還沒有註冊,只能寫入一次。
檢驗顯示是使用Borland Delphi 6.0 - 7.0 [Overlay]
編寫。
搜尋思路
- 使用搜尋字串找關鍵字
- 根據堆疊的調用,判斷產生
Nag
視窗的函數位置
修改思路
- 跳過註冊邏輯判斷
- 分析註冊碼算法 (未實現)
實際分析
開啟
eXeScope.exe
於反匯編視窗點選右鍵選擇
搜尋(S)
->目前模組
->字串引用(S)
搜尋
輸入ID
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23位址 反組譯 字串
0040F5C9 mov eax,exescope.40F764 "VarIdiv"
0045525E mov edx,exescope.455278 "WidthType"
0045AD08 mov eax,dword ptr ds:[446930] "|iD"==L"楼D"==&"pIG"
0046C38A mov ecx,exescope.46C450 "JumpID(\"\",\"%s\")"
004BC39A mov edx,exescope.4BC524 "~Tmp.mid"
004BC5C3 mov edx,exescope.4BC6B0 "MIDI"
004BE349 mov eax,exescope.4BE5FC "PixWidth"
004BE374 mov eax,exescope.4BE63C "AvgWidth"
004BE382 mov eax,exescope.4BE650 "MaxWidth"
004BE3CC mov eax,exescope.4BE6B4 "WidthBytes"
004C0065 mov ecx,exescope.4C007C "Resident (Exported Functions)"
004C00AE mov ecx,exescope.4C00C4 "Non-resident (Exported Functions)"
004C108A push exescope.4C11D4 "GUID="
004C2B32 mov ecx,exescope.4C2BE4 "ID"
004C2B5E mov eax,exescope.4C2BF0 "无效的 ID 或名字"
004C7328 mov ecx,exescope.4C7628 "Resident"
004C7356 mov ecx,exescope.4C763C "Non-resident"
004C974B mov edx,exescope.4C98F4 "MIDI (*.mid)|*.mid"
004C9F2D mov edx,exescope.4CA048 "MIDI (*.mid)|*.mid"
004CBD7B mov ecx,exescope.4CBF2C "Width"==L"楗瑤h"
004CBE0F mov ecx,exescope.4CBF68 "ID"
004CC0C9 mov ecx,exescope.4CC268 "Width"==L"楗瑤h"點擊
无效的 ID 或名字
到達
004C2B5E
位址,觀察指令1
2
3
4
5
6
7
8
9
10004C2B57 | EB 20 | jmp exescope.4C2B79 |
004C2B59 | 6A 00 | push 0 |
004C2B5B | 8D55 EC | lea edx,dword ptr ss:[ebp-14] |
004C2B5E | B8 F02B4C00 | mov eax,exescope.4C2BF0 | 4C2BF0:"无效的 ID 或名字"
004C2B63 | E8 680D0000 | call exescope.4C38D0 |
004C2B68 | 8B45 EC | mov eax,dword ptr ss:[ebp-14] |
004C2B6B | 66:8B0D 202C4C00 | mov cx,word ptr ds:[4C2C20] |
004C2B72 | B2 01 | mov dl,1 |
004C2B74 | E8 2F4BF7FF | call exescope.4376A8 |
004C2B79 | 33C0 | xor eax,eax |004C2B57 | EB 20 | jmp exescope.4C2B79 |
會跳過无效的 ID 或名字
004C2B57
設定中斷點F9
執行程式點擊
幫助
->註冊(R)...
彈出
註冊
視窗輸入
你的名字(N)
、ID
點擊
確定
彈出
錯誤
視窗,內容無效的 ID 或名字
發現程式並沒有斷點在
004C2B57
向上觀察
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45004C2AC6 | 0F84 8D000000 | je exescope.4C2B59 |
004C2ACC | A1 E8FE4C00 | mov eax,dword ptr ds:[4CFEE8] | 004CFEE8:"T.M"
004C2AD1 | 8B00 | mov eax,dword ptr ds:[eax] |
004C2AD3 | E8 7821F4FF | call exescope.404C50 |
004C2AD8 | 85C0 | test eax,eax |
004C2ADA | 7E 7D | jle exescope.4C2B59 |
004C2ADC | 8D55 F0 | lea edx,dword ptr ss:[ebp-10] |
004C2ADF | A1 FCFE4C00 | mov eax,dword ptr ds:[4CFEFC] |
004C2AE4 | 8B00 | mov eax,dword ptr ds:[eax] |
004C2AE6 | E8 11FCFCFF | call exescope.4926FC |
004C2AEB | 8B45 F0 | mov eax,dword ptr ss:[ebp-10] |
004C2AEE | 8D4D F4 | lea ecx,dword ptr ss:[ebp-C] |
004C2AF1 | BA B82B4C00 | mov edx,exescope.4C2BB8 | 4C2BB8:".ini"
004C2AF6 | E8 2570F4FF | call exescope.409B20 |
004C2AFB | 8B4D F4 | mov ecx,dword ptr ss:[ebp-C] |
004C2AFE | B2 01 | mov dl,1 |
004C2B00 | A1 2CBE4300 | mov eax,dword ptr ds:[43BE2C] | 0043BE2C:"x綜"
004C2B05 | E8 D293F7FF | call exescope.43BEDC |
004C2B0A | 8BF0 | mov esi,eax |
004C2B0C | A1 E8FE4C00 | mov eax,dword ptr ds:[4CFEE8] | 004CFEE8:"T.M"
004C2B11 | 8B00 | mov eax,dword ptr ds:[eax] |
004C2B13 | 50 | push eax |
004C2B14 | B9 C82B4C00 | mov ecx,exescope.4C2BC8 | 4C2BC8:"Name"
004C2B19 | BA D82B4C00 | mov edx,exescope.4C2BD8 | 4C2BD8:"Reg"
004C2B1E | 8BC6 | mov eax,esi |
004C2B20 | 8B38 | mov edi,dword ptr ds:[eax] |
004C2B22 | FF57 04 | call dword ptr ds:[edi+4] |
004C2B25 | A1 4CFE4C00 | mov eax,dword ptr ds:[4CFE4C] | 004CFE4C:"X.M"
004C2B2A | 8B00 | mov eax,dword ptr ds:[eax] |
004C2B2C | 50 | push eax |
004C2B2D | BA D82B4C00 | mov edx,exescope.4C2BD8 | 4C2BD8:"Reg"
004C2B32 | B9 E42B4C00 | mov ecx,exescope.4C2BE4 | 4C2BE4:"ID"
004C2B37 | 8BC6 | mov eax,esi |
004C2B39 | 8B38 | mov edi,dword ptr ds:[eax] |
004C2B3B | FF57 04 | call dword ptr ds:[edi+4] |
004C2B3E | 8BC6 | mov eax,esi |
004C2B40 | E8 9B10F4FF | call exescope.403BE0 |
004C2B45 | A1 5CFC4C00 | mov eax,dword ptr ds:[4CFC5C] |
004C2B4A | C600 01 | mov byte ptr ds:[eax],1 |
004C2B4D | C783 4C020000 01000000 | mov dword ptr ds:[ebx+24C],1 |
004C2B57 | EB 20 | jmp exescope.4C2B79 |
004C2B59 | 6A 00 | push 0 |
004C2B5B | 8D55 EC | lea edx,dword ptr ss:[ebp-14] | [ebp-14]:&"舡A"
004C2B5E | B8 F02B4C00 | mov eax,exescope.4C2BF0 | 4C2BF0:"无效的 ID 或名字"
004C2B63 | E8 680D0000 | call exescope.4C38D0 |發現兩個關鍵跳轉
1
2004C2AC6 | 0F84 8D000000 | je exescope.4C2B59 |
004C2ADA | 7E 7D | jle exescope.4C2B59 |004C2ADA
、004C2AC6
設定中斷點點擊
確定
004C2AC6 | 0F84 8D000000 | je exescope.4C2B59 |
跳轉已實現會跳轉到
無效的 ID 或名字
je
跳轉實現為ZF=1
,我們將其修改為ZF=0
F8
繼續步過,持續觀察步過到下方指令時
1
004C2ADA | 7E 7D | jle exescope.4C2B59 |
004C2ADA | 7E 7D | jle exescope.4C2B59 |
跳轉未實現F8
繼續步過,持續觀察步過到下方指令時
1
004C2B57 | EB 20 | jmp exescope.4C2B79 |
004C2B57 | EB 20 | jmp exescope.4C2B79 |
跳轉已實現跳過了
无效的 ID 或名字
F9
繼續執行點擊
幫助
->註冊(R)...
彈出
註冊
視窗顯示
已註冊
點擊
文件
->打開(O)...
選擇上一章的
Urlegal.exe
展開
資源
->對話框
選擇
103
編輯對話框內的網址
Dialog: 103
、Static: http://www.worldlynx.net/pgerhart/
注意:
103 (十進制)
,0x67 (十六進制)
表示為Nag
視窗的hInstance
修改
http://www.worldlynx.net/pgerhart/
->https://morosedog.gitlab.io/
點擊
保持更新
沒有彈出
錯誤
視窗,內容你還沒有註冊,只能寫入一次。
恭喜程式真正被破解
分析總結
004C2AC6
,實現跳轉則彈出失敗訊息。
修改思路
根據分析總結
004C2AC6
使用 NOP 填充
實際修改
開啟
eXeScope.exe
反匯編視窗中按下
Ctrl + G
輸入004C2AC6
,會跳轉到004C2AC6
位址對
004A5461
按右鍵選擇二進位
->用 NOP 填充 (Ctrl + 9)
修改後如下
1
2
3
4
5
6
7
8
9
10
11
12
13// 修改前
004A5461 | 0F85 D7010000 | jne exescope.4A563E |
004A5467 | 896C24 34 | mov dword ptr ss:[esp+34],ebp |
004A546B | 8B45 18 | mov eax,dword ptr ss:[ebp+18] |
// 修改後
004A5461 | 90 | nop |
004A5462 | 90 | nop |
004A5463 | 90 | nop |
004A5464 | 90 | nop |
004A5465 | 90 | nop |
004A5466 | 90 | nop |
004A5467 | 896C24 34 | mov dword ptr ss:[esp+34],ebp |
004A546B | 8B45 18 | mov eax,dword ptr ss:[ebp+18] |點擊
修補程式
或是快捷鍵Ctrl + P
點擊
修補檔案(P)
另存檔名
eXeScope.crack.exe
恭喜補丁產生
eXeScope.crack.exe
註:以上參考了
x64dbg
x64dbg’s documentation!
看雪論壇 的 [原创]非常适合新手学习的eXeScope深入分析