x64dbg - 第二十九章 | 反匯編練習(十八)
前言
這篇延續上一篇x64dbg - 第二十八章 | 反匯編練習(十七),針對提供的輔助程式eXeScope.exe
做暴力破解,這沒什麼技術含量,這邊將嘗試分析出註冊碼的算法。
目標程式
檔案下載:eXeScope.exe
解壓密碼:morosedog
程式簡介
這是一套可將程式中的英文字挑出來加以修改、翻譯,將軟體轉成中文的操作介面來,它包括可更改選單menu
、字體font
、對話方塊dialog
,它還能直接修改EXE
,DLL
,OCX
..etc
.
任務目標
- 分析註冊碼算法
額外補充
div
組合語言中除法指令- (1) 除數:有
8
位和16
位兩種,在一個寄存器或內存單元中。 - (2) 被除數:默認放在
ax
或dx
和ax
中,如果除數為8
位,被除數則為16
位,默認在ax
中存放;如果除數為16
位,被除數則為32
位,在dx
和ax
中存放,dx
存放高16
位,ax
存放低16
位。
- (1) 除數:有
搜尋思路
- 使用搜尋字串找關鍵字
修改思路
- 分析註冊碼算法
實際分析
根據上一篇的分析
004C2AC6
,實現跳轉則彈出失敗訊息開啟
eXeScope.exe
反匯編視窗中按下
Ctrl + G
輸入004C2AC6
,會跳轉到004C2AC6
位址向上觀察
1
2
3004C2ABF | E8 B8940000 | call exescope.4CBF7C |
004C2AC4 | 84C0 | test al,al |
004C2AC6 | 0F84 8D000000 | je exescope.4C2B59 |test al,al
影響je
的跳轉結果call exescope.4CBF7C
會異動al
的值004C2ABF
設定中斷點移除其他中斷點
F9
執行程式點擊
幫助
->註冊(R)...
彈出
註冊
視窗你的名字(N)
輸入abcdefghij
,ID
輸入1234567890
點擊
確定
斷點在
004C2ABF | E8 B8940000 | call exescope.4CBF7C |
F7
步入斷點在
004CBF7C | 55 | push ebp |
F8
一步一步過,並持續觀察eax
的變化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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64004CBF7C | 55 | push ebp |
004CBF7D | 8BEC | mov ebp,esp |
004CBF7F | 51 | push ecx |
004CBF80 | 53 | push ebx |
004CBF81 | 8955 FC | mov dword ptr ss:[ebp-4],edx | [ebp-4]:"abcdefghij"
004CBF84 | 8B45 FC | mov eax,dword ptr ss:[ebp-4] | [ebp-4]:"abcdefghij"
004CBF87 | E8 B48EF3FF | call exescope.404E40 |
004CBF8C | 33C0 | xor eax,eax | eax:"\\;L"
004CBF8E | 55 | push ebp |
004CBF8F | 68 1BC04C00 | push exescope.4CC01B |
004CBF94 | 64:FF30 | push dword ptr fs:[eax] |
004CBF97 | 64:8920 | mov dword ptr fs:[eax],esp |
004CBF9A | 33DB | xor ebx,ebx |
004CBF9C | 8B45 FC | mov eax,dword ptr ss:[ebp-4] | [ebp-4]:"abcdefghij"
004CBF9F | E8 AC8CF3FF | call exescope.404C50 |
004CBFA4 | 83F8 0A | cmp eax,A | eax:"\\;L", A:'\n'
004CBFA7 | 75 5C | jne exescope.4CC005 |
004CBFA9 | 8B55 FC | mov edx,dword ptr ss:[ebp-4] | [ebp-4]:"abcdefghij"
004CBFAC | B8 30C04C00 | mov eax,exescope.4CC030 | eax:"\\;L", 4CC030:"A1910"
004CBFB1 | E8 DE8FF3FF | call exescope.404F94 |
004CBFB6 | 48 | dec eax | eax:"\\;L"
004CBFB7 | 74 10 | je exescope.4CBFC9 |
004CBFB9 | 8B55 FC | mov edx,dword ptr ss:[ebp-4] | [ebp-4]:"abcdefghij"
004CBFBC | B8 40C04C00 | mov eax,exescope.4CC040 | eax:"\\;L", 4CC040:"A1423"
004CBFC1 | E8 CE8FF3FF | call exescope.404F94 |
004CBFC6 | 48 | dec eax | eax:"\\;L"
004CBFC7 | 75 3C | jne exescope.4CC005 |
004CBFC9 | B8 02000000 | mov eax,2 | eax:"\\;L"
004CBFCE | 8B55 FC | mov edx,dword ptr ss:[ebp-4] | [ebp-4]:"abcdefghij"
004CBFD1 | 8A5402 FF | mov dl,byte ptr ds:[edx+eax-1] |
004CBFD5 | 80FA 30 | cmp dl,30 | 30:'0'
004CBFD8 | 72 2B | jb exescope.4CC005 |
004CBFDA | 80FA 39 | cmp dl,39 | 39:'9'
004CBFDD | 77 26 | ja exescope.4CC005 |
004CBFDF | 40 | inc eax | eax:"\\;L"
004CBFE0 | 83F8 0B | cmp eax,B | eax:"\\;L", B:'\v'
004CBFE3 | 75 E9 | jne exescope.4CBFCE |
004CBFE5 | 8B45 FC | mov eax,dword ptr ss:[ebp-4] | [ebp-4]:"abcdefghij"
004CBFE8 | 0FB640 08 | movzx eax,byte ptr ds:[eax+8] | eax:"\\;L", eax+8:&"FMain"
004CBFEC | 8B55 FC | mov edx,dword ptr ss:[ebp-4] | [ebp-4]:"abcdefghij"
004CBFEF | 0FB652 09 | movzx edx,byte ptr ds:[edx+9] | edx:"1234567890", edx+9:"0"34567890"
004CBFF3 | 03C2 | add eax,edx | eax:"\\;L", edx:"1234567890"
004CBFF5 | B9 0A000000 | mov ecx,A | A:'\n'
004CBFFA | 33D2 | xor edx,edx | edx:"1234567890"
004CBFFC | F7F1 | div ecx |
004CBFFE | 83FA 04 | cmp edx,4 | edx:"1234567890"
004CC001 | 75 02 | jne exescope.4CC005 |
004CC003 | B3 01 | mov bl,1 |
004CC005 | 33C0 | xor eax,eax | eax:"\\;L"
004CC007 | 5A | pop edx | edx:"1234567890"
004CC008 | 59 | pop ecx |
004CC009 | 59 | pop ecx |
004CC00A | 64:8910 | mov dword ptr fs:[eax],edx | edx:"1234567890"
004CC00D | 68 22C04C00 | push exescope.4CC022 |
004CC012 | 8D45 FC | lea eax,dword ptr ss:[ebp-4] | [ebp-4]:"abcdefghij"
004CC015 | E8 7689F3FF | call exescope.404990 |
004CC01A | C3 | ret |
004CC01B | E9 5483F3FF | jmp exescope.404374 |
004CC020 | EB F0 | jmp exescope.4CC012 |
004CC022 | 8BC3 | mov eax,ebx | eax:"\\;L"
004CC024 | 5B | pop ebx |
004CC025 | 59 | pop ecx |
004CC026 | 5D | pop ebp |
004CC027 | C3 | ret |第一個條件,ID長度必須10位
1
`004CBFA4 | 83F8 0A | cmp eax,A | A:'\n'`
第二個條件,開頭必須為
A1910
或A1423
1
2
3
4
5
6
7
8
9
10004CBFA9 | 8B55 FC | mov edx,dword ptr ss:[ebp-4] | [ebp-4]:"1234567890"
004CBFAC | B8 30C04C00 | mov eax,exescope.4CC030 | 4CC030:"A1910"
004CBFB1 | E8 DE8FF3FF | call exescope.404F94 |
004CBFB6 | 48 | dec eax |
004CBFB7 | 74 10 | je exescope.4CBFC9 |
004CBFB9 | 8B55 FC | mov edx,dword ptr ss:[ebp-4] | [ebp-4]:"1234567890"
004CBFBC | B8 40C04C00 | mov eax,exescope.4CC040 | 4CC040:"A1423"
004CBFC1 | E8 CE8FF3FF | call exescope.404F94 |
004CBFC6 | 48 | dec eax |
004CBFC7 | 75 3C | jne exescope.4CC005 |第三個條件,判斷ID的第三位至第十位,是否在0~9之間
1
2
3
4
5
6
7
8
9
10004CBFC9 | B8 02000000 | mov eax,2 |
004CBFCE | 8B55 FC | mov edx,dword ptr ss:[ebp-4] | [ebp-4]:"1234567890"
004CBFD1 | 8A5402 FF | mov dl,byte ptr ds:[edx+eax-1] |
004CBFD5 | 80FA 30 | cmp dl,30 | 30:'0'
004CBFD8 | 72 2B | jb exescope.4CC005 |
004CBFDA | 80FA 39 | cmp dl,39 | 39:'9'
004CBFDD | 77 26 | ja exescope.4CC005 |
004CBFDF | 40 | inc eax |
004CBFE0 | 83F8 0B | cmp eax,B | B:'\v'
004CBFE3 | 75 E9 | jne exescope.4CBFCE |第四個動作,將第九位存入
eax
暫存器,第十位存入edx
暫存器1
2
3
4004CBFE5 | 8B45 FC | mov eax,dword ptr ss:[ebp-4] | [ebp-4]:"1234567890"
004CBFE8 | 0FB640 08 | movzx eax,byte ptr ds:[eax+8] |
004CBFEC | 8B55 FC | mov edx,dword ptr ss:[ebp-4] | [ebp-4]:"1234567890"
004CBFEF | 0FB652 09 | movzx edx,byte ptr ds:[edx+9] |第五個動作,使用備註說明
1
2
3
4004CBFF3 | 03C2 | add eax,edx | EAX = EAX + EDX
004CBFF5 | B9 0A000000 | mov ecx,A | ECX = 0xA
004CBFFA | 33D2 | xor edx,edx | EDX = 0
004CBFFC | F7F1 | div ecx | EDX = EAX % ECX第六個條件,當
EDX = 0x4
時,將bl
變為1
1
2
3
4004CBFFE | 83FA 04 | cmp edx,4 |
004CC001 | 75 02 | jne exescope.4CC005 |
004CC003 | B3 01 | mov bl,1 |
004CC005 | 33C0 | xor eax,eax |當
al = 0x1
時,跳轉不成立,說明註冊碼正確總結分析結果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(1) ID必須10位
(2) 前5位開頭必須為A1910或A1423
(3) 第6~8位,只需要在0~9之間的數字
(4) 第9~10位,邏輯如下:
當第9位等於7,第10位等於1
ASCII碼分別是:0x37和0x31
EAX = 0x37
EDX = 0x31
EAX = EAX + EDX = 0x68
ECX = 0xA
EDX = 0
當EDX = EAX % ECX = 0x68 % 0xA = 0x4即成立
註:以上參考了
x64dbg
x64dbg’s documentation!
看雪論壇 的 [原创]非常适合新手学习的eXeScope深入分析