x64dbg - 第十八章 | 反匯編練習(七)
目標程式
檔案下載:pcsurgeon.exe
解壓密碼:morosedog
程式簡介
PC Surgeon是診斷和修復Windows平台所需的強大工具。超過65種特性和功能,使你能夠診斷,監控和修復你的系統。
前置作業
下載目標程式並解壓縮,pcsurgeon.exe
右鍵選擇內容
->相容性
->勾選以相容模式執行這個程式
->選擇Windows XP (Service Pack 3)
->勾選以系統管理員的身份執行此程式
。
註:因為軟體老舊,所以用Windows XP來執行,方可正常開啟。
任務目標
- 移除提示購買視窗(Nag)。
- 移除驗證試用天數判斷。
分析程式
開啟
pcsurgeon.exe
彈出視窗,下方顯示
Cannot retrieve IP Info
(無法檢索IP訊息)註:這個可能是因為Win7環境或是因為虛擬環境造成該軟體無法抓取IP的資訊,可以忽略。
按下
OK
彈出視窗
Register for only $20.00usd. You have 5 days remaining in your evaluation.
(註冊只需$ 20.00usd。 你還有5天的試用時間。)
- 稍待片刻視窗會被關閉,並開啟主程式
- 注意到主程式標題
PC Surgeon <unregistered - 5 days remaining..>
(PC外科醫生<未註冊 - 剩餘5天..) - 點擊
Help
->About
- 看到
<Unregistered Version>
(<未註冊版本>)
- 點擊
Use Reg Key
- 會要求輸入
First Name
、Last Name
、Registration Key
來做註冊
檢驗顯示是使用Borland Delphi 6.0 - 7.0
編寫。
額外補充
lea
與mov
的差異lea
傳遞變數位置mov
傳遞變數數值
fld st(0),dword ptr ds:[5CCA3C]
- 將
5CCA3C
的四個位元組浮點數值,存入st(0)
- 將
fsub st(0),qword ptr ds:[eax]
- 將
st(0)
浮點數值 減去eax
的八個位元組浮點數值
- 將
搜尋思路
- 使用搜尋字串找關鍵字。
註:
unregistered
個跟About
中的<Unregistered Version>
修改思路
- 使用
NOP
填充替代彈出Nag
的部分 - 使用
jmp
跳過驗證的部分
實際分析
開啟
pcsurgeon.exe
於反匯編視窗點選右鍵選擇
搜尋(S)
->目前模組
->字串引用(S)
搜尋
輸入unregistered
發現
PC Surgeon <unregistered -
,對其設定中斷點F9
執行程式彈出視窗,下方顯示
Cannot retrieve IP Info
(無法檢索IP訊息)註:該視窗就是忽略按下
OK
即可斷點
005CC83C | 68 70CB5C00 | push pcsurgeon.5CCB70 | 5CCB70:"PC Surgeon <unregistered - "
F8
一步一步過步過到下方指令時
1
005CC894 | FF92 EC000000 | call dword ptr ds:[edx+EC] |
彈出視窗
Register for only $20.00usd. You have 5 days remaining in your evaluation.
(註冊只需$ 20.00usd。 你還有5天的試用時間。)在此可以確認,這邊就是第一個
Nag
向上觀察會跳轉實現會跳過彈出訊息視窗的指令
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
29005CC820 | A1 8CEB6000 | mov eax,dword ptr ds:[60EB8C] |
005CC825 | 8038 00 | cmp byte ptr ds:[eax],0 |
005CC828 | 0F85 07010000 | jne pcsurgeon.5CC935 |
005CC82E | A1 DCF16000 | mov eax,dword ptr ds:[60F1DC] |
005CC833 | 8038 00 | cmp byte ptr ds:[eax],0 |
005CC836 | 0F85 F9000000 | jne pcsurgeon.5CC935 |
005CC83C | 68 70CB5C00 | push pcsurgeon.5CCB70 | 5CCB70:"PC Surgeon <unregistered - "
005CC841 | D905 3CCA5C00 | fld st(0),dword ptr ds:[5CCA3C] |
005CC847 | A1 8CEC6000 | mov eax,dword ptr ds:[60EC8C] |
005CC84C | DC20 | fsub st(0),qword ptr ds:[eax] |
005CC84E | 83C4 F4 | add esp,FFFFFFF4 |
005CC851 | DB3C24 | fstp tword ptr ss:[esp],st(0) |
005CC854 | 9B | fwait |
005CC855 | 8D55 E4 | lea edx,dword ptr ss:[ebp-1C] | [ebp-1C]:L"5"
005CC858 | B8 94CB5C00 | mov eax,pcsurgeon.5CCB94 | 5CCB94:L"0"
005CC85D | E8 42FAE3FF | call pcsurgeon.40C2A4 |
005CC862 | FF75 E4 | push dword ptr ss:[ebp-1C] | [ebp-1C]:L"5"
005CC865 | 68 A0CB5C00 | push pcsurgeon.5CCBA0 | 5CCBA0:" days remaining..>"
005CC86A | 8D45 E8 | lea eax,dword ptr ss:[ebp-18] | [ebp-18]:"PC Surgeon <unregistered - 5 days remaining..>"
005CC86D | BA 03000000 | mov edx,3 |
005CC872 | E8 A98AE3FF | call pcsurgeon.405320 |
005CC877 | 8B55 E8 | mov edx,dword ptr ss:[ebp-18] | [ebp-18]:"PC Surgeon <unregistered - 5 days remaining..>"
005CC87A | 8B45 FC | mov eax,dword ptr ss:[ebp-4] |
005CC87D | E8 22D5EAFF | call pcsurgeon.479DA4 |
005CC882 | 8B45 FC | mov eax,dword ptr ss:[ebp-4] |
005CC885 | 8B80 20120000 | mov eax,dword ptr ds:[eax+1220] |
005CC88B | C680 20030000 01 | mov byte ptr ds:[eax+320],1 |
005CC892 | 8B10 | mov edx,dword ptr ds:[eax] |
005CC894 | FF92 EC000000 | call dword ptr ds:[edx+EC] |005CC828 | 0F85 07010000 | jne pcsurgeon.5CC935 |
與005CC836 | 0F85 F9000000 | jne pcsurgeon.5CC935 |
會跳轉過彈出Nag
005CC828
、005CC836
設定中斷點,並移除其他中斷點Ctrl + F2
重新啟動(S)F9
執行程式斷點在
005CC828 | 0F85 07010000 | jne pcsurgeon.5CC935 |
跳轉未實現jne
跳轉未實現為ZF=1
,我們將其修改為ZF=0
F9
執行程式主程式直接開啟,標體無試用版的標示
在此可以確認
5CC935
位址為開啟主程式
移除
005CC828
中斷點Ctrl + F2
重新啟動(S)F9
執行程式斷點在
005CC836 | 0F85 F9000000 | jne pcsurgeon.5CC935 |
跳轉未實現jne
跳轉未實現為ZF=1
,我們將其修改為ZF=0
F9
執行程式主程式直接開啟,標體無試用版的標示
在此可以確認再次
5CC935
位址為開啟主程式
移除所有中斷點
於反匯編視窗點選右鍵選擇
搜尋(S)
->目前模組
->字串引用(S)
搜尋
輸入unregistered
發現
<Unregistered Version>
,對其設定中斷點F9
執行程式開啟主程式點擊
Help
->About
斷點
0056247B | BA B8265600 | mov edx,pcsurgeon.5626B8 | 5626B8:"<Unregistered Version>"
向上觀察會跳轉實現會跳過
<Unregistered Version>
訊息準備的指令1
2
3
4
5
6
7
80056245E | A1 8CEB6000 | mov eax,dword ptr ds:[60EB8C] | eax:"擊C"
00562463 | 8038 00 | cmp byte ptr ds:[eax],0 | eax:"擊C"
00562466 | 75 22 | jne pcsurgeon.56248A |
00562468 | 8B83 08030000 | mov eax,dword ptr ds:[ebx+308] | eax:"擊C"
0056246E | B2 01 | mov dl,1 |
00562470 | E8 1F78F1FF | call pcsurgeon.479C94 |
00562475 | 8B83 24030000 | mov eax,dword ptr ds:[ebx+324] | eax:"擊C", [ebx+324]:"擊C"
0056247B | BA B8265600 | mov edx,pcsurgeon.5626B8 | 5626B8:"<Unregistered Version>"00562466 | 75 22 | jne pcsurgeon.56248A |
會跳過訊息準備的指令00562466
設定中斷點,並移除其他中斷點Ctrl + F2
重新啟動(S)F9
執行程式開啟主程式點擊
Help
->About
斷點在
00562466 | 75 22 | jne pcsurgeon.56248A |
跳轉未實現jne
跳轉未實現為ZF=1
,我們將其修改為ZF=0
F9
執行程式About
視窗開啟,顯示Licensed Version. Do Not Copy!
(許可版本。 不要抄襲!)在此可以確認
00562466
位址跳過試用版訊息準備
分析總結
005CC828
、005CC836
位址判斷是否為註冊版,決定是否要跳轉005CC935
位址開啟主程式00562466
位址跳過試用版訊息準備
修改思路
根據分析總結
- 使用
jmp
直接跳轉實現到主程式直接開啟。 - 使用
jmp
直接跳轉實現過About
訊息準備。
實際修改
開啟
pcsurgeon.exe
005CC828 | 0F85 07010000 | jne pcsurgeon.5CC935 |
按下空白鍵將指令修改為
jmp 0x005CC935
,按下確定修改後如下
1
2
3
4// 修改前
005CC828 | 0F85 07010000 | jne pcsurgeon.5CC935 |
// 修改後
005CC828 | E9 08010000 | jmp pcsurgeon.5CC935 |00562466 | 75 22 | jne pcsurgeon.56248A |
按下空白鍵將指令修改為
jmp 0x0056248A
,按下確定修改後如下
1
2
3
4// 修改前
00562466 | 75 22 | jne pcsurgeon.56248A |
// 修改後
00562466 | EB 22 | jmp pcsurgeon.56248A |點擊
修補程式
或是快捷鍵Ctrl + P
點擊
修補檔案(P)
另存檔名
pcsurgeon.crack.exe
恭喜補丁產生
pcsurgeon.crack.exe
註:開啟新的補丁.exe不要忘記設定相容性和管理員執行。
實際驗證
- 開啟
pcsurgeon.crack.exe
- 直接開啟主程式,標題無試用天數,成功破解
- 開啟
About
,顯示Licensed Version. Do Not Copy!
(許可版本。 不要抄襲!),成功破解
額外分析
1 | // 跳轉`Nag`部分指令 |
可見
cmp
關鍵的eax
值都是由0060EB8C
位址取得條件為
eax=0
為試用版005CC820 | A1 8CEB6000 | mov eax,dword ptr ds:[60EB8C] |
右鍵選擇尋找參考(R)
->位址: 60EB8C
可見以下位址參考
1
2
3
4
5
6
7
8
9
10
11
12位址 反組譯
0050B6F4 mov eax,dword ptr ds:[60EB8C]
0056245E mov eax,dword ptr ds:[60EB8C]
005B44B3 mov eax,dword ptr ds:[60EB8C]
005C2BF6 mov edx,dword ptr ds:[60EB8C]
005C2BFE mov eax,dword ptr ds:[60EB8C]
005C2E68 mov edx,dword ptr ds:[60EB8C]
005CC748 mov eax,dword ptr ds:[60EB8C]
005CC7D6 mov eax,dword ptr ds:[60EB8C]
005CC820 mov eax,dword ptr ds:[60EB8C]
005CCC49 mov eax,dword ptr ds:[60EB8C]
005CCCCB mov eax,dword ptr ds:[60EB8C]右鍵選擇
Set breakpoint on all commands
(在所有命令上設置斷點)Ctrl + F2
重新啟動(S)F9
執行程式斷點
005C2BF6 | 8B15 8CEB6000 | mov edx,dword ptr ds:[60EB8C] |
向下觀察
1
2
3
4005C2BF6 | 8B15 8CEB6000 | mov edx,dword ptr ds:[60EB8C] |
005C2BFC | 8802 | mov byte ptr ds:[edx],al |
005C2BFE | A1 8CEB6000 | mov eax,dword ptr ds:[60EB8C] |
005C2C03 | 8038 00 | cmp byte ptr ds:[eax],0 |mov byte ptr ds:[edx],al
在賦值cmp byte ptr ds:[eax],0
判斷兩個皆嘗試
第一個嘗試
1
2
3
4
5
6
7
8// 修改前
005C2BFC | 8802 | mov byte ptr ds:[edx],al |
// 修改後
005C2BFC | C602 01 | mov byte ptr ds:[edx],1 |
005C2BFF | 90 | nop |
005C2C00 | 90 | nop |
005C2C01 | 90 | nop |
005C2C02 | 90 | nop |移除所有斷點
Ctrl + F2
重新啟動(S)F9
執行程式直接開啟主程式,標題無試用天數,成功破解
開啟
About
,顯示Licensed Version. Do Not Copy!
(許可版本。 不要抄襲!),成功破解
- 第二個嘗試
1
2
3
4// 修改前
005C2C03 | 8038 00 | cmp byte ptr ds:[eax],0 |
// 修改後
005C2C03 | 8038 01 | cmp byte ptr ds:[eax],1 | Ctrl + F2
重新啟動(S)F9
執行程式- 彈出視窗
Register for only $20.00usd. You have 15 days remaining in your evaluation.
(註冊只需$ 20.00usd。 你還有15天的試用時間。) - 主程式,標題試用天數15天
- 開啟
About
,顯示<Unregistered Version>
(<未註冊版本>)
額外修改
開啟
pcsurgeon.exe
005C2BFC | 8802 | mov byte ptr ds:[edx],al |
按下空白鍵將指令修改為
mov byte ptr ds:[edx], 0x1
,按下確定註:記得勾選
使用 NOPs 填充(F)
修改後如下
// 修改前
005C2BFC | 8802 | mov byte ptr ds:[edx],al |
// 修改後
005C2BFC | C602 01 | mov byte ptr ds:[edx],1 |
005C2BFF | 90 | nop |
005C2C00 | 90 | nop |
005C2C01 | 90 | nop |
005C2C02 | 90 | nop |點擊
修補程式
或是快捷鍵Ctrl + P
點擊
修補檔案(P)
註:這邊會有需要重定位的問題,點擊
Yes
即可另存檔名
pcsurgeon.crack.exe
恭喜補丁產生
pcsurgeon.crack.exe
註:開啟新的補丁.exe不要忘記設定相容性和管理員執行。
註:以上參考了
x64dbg
x64dbg’s documentation!
CSDN billvsme的专栏 的 OllyDbg 使用笔记 (七)
知乎 的 汇编语言–x86汇编指令集大全