1、實驗環境
操作系統: mac os x 10.12
調試工具:hopper disassemble v4
程序:010 editor for mac
官網地址:http://www.sweetscape.com/010editor/
2、開始分析
2.1、尋找線索
看一下正常執行時的整個流程,并從中獲得線索。
在關于里面找到注冊然后彈出注冊的信息框,輸入用戶名和密碼,點擊 check license,然后提示 “Invalid name or password…….”,如圖-1。
現在找到了第一條線索,記為線索1。線索1:stringInvalidNameOrPassword字符串“Invalid name or password…”。
圖-1
2.2、分析線索1
打開 hopper disassembler v4,將010editor 拖拽到hopperdisassembler上,如下圖:
通過hopper中的字符串查找定位到stringInvalidNameOrPassword出現的位置,如圖-2。
圖-2
再查看stringInvalidNameOrPassword在哪些地方被引用了。
選中stringInvalidNameOrPassword所在地址,按一下“X”鍵,顯示出該地址的所有引用,如圖-3。
圖-3
雙擊圖-3中的地址,即可顯示出該調用地址處的反匯編代碼,如圖-4。
接下來就要分析 sub_1002e5f10 這個函數。到這里,我門又有了新的疑點:
1、 stringInalidNameOrPassword這條路是從哪里走過來的?
2、 該函數中有沒有正確的路?如果有,哪么正確的路在哪里?
3、 正確的路與stringInalidNameOrPassword的路是在哪里走岔的?
上面的三個疑點都在 sub_1002e5f10 函數中找。
圖-4
光標放在1002e69e4 處,然后點擊工具欄中的CFG module 顯示函數流程圖如圖-5。
圖-5
總的來說loc_1002e6900 是一條錯誤的路(trial+invalidNameOrPassword)。
再找loc_1002e6900 的來源,如圖-6。
圖-6
再向上找,找 loc_1002e65b8 的來源,如圖-7。可以看到是在loc_1002e6363處和正常的授權路分岔了。
關鍵是 ebx的值,如果ebx == 0xdb 該函數就走授權的路。
現在用偽代碼模式查看這塊代碼,如圖-8。這時,我們定位到了三個重要函數 sub_1000c9230 sub_1000c90e0 sub_1002e9e40。
其中sub_1002e9e40函數是用來聯網校驗授權信息的,這里就不進入該函數分析來。
ebx 的值是 sub_1000c9230 的返回值,所以如果能控制sub_1000c90e0 的返回值就能控制該函數走授權的路了。
圖-7
圖-8
進入sub_1000c90e0 函數進行分析,如圖-9。sub_1000c90e0 的返回值有 0x113, 0xdb, 0x20c, 0xed, 0x71, 0x177, 0xf9,0x2f共8種。
其中0xdb是走的授權路線。在該函數中調用了sub_1000c9230 函數,如果能控制 sub_1000c9230 的返回值為0x2d 就能讓sub_1000c90e0返回 0xdb。
其實為了保險起見可以將 sub_1000c90e0 函數中的第三行 rax = 0x113改成rax = 0xdb。這樣就能保證 sub_1000c90e0 返回的是 0xdb。
圖-9
函數分析sub_1000c9230。
先來查看該函數的所以引用。
00000001000c9106 call sub_1000c9230 ;在sub_1000c90e0 函數中。
00000001002e62f2 call sub_1000c9230 ;在sub_1002e5f10 函數中。
沒有授權時,在sub_1002e5f10返回的是0xe7,在 sub_1000c90e0中返回的不是 0x2d。
函數sub_1000c9230的返回值有rax= 0x93, 0xe7, 0x2d,0x4e四種,每個返回值都有自己的特殊含義。
其中0x2d就是走授權道路的返回值;0x93 是tial 或者 Invalid name or password。
[size=14.6667px]
修改 sub_1000c9230函數使其只返回0x2d,我的修改方式是將[size=14.666666984558105px]
[Asm] 純文本查看 復制代碼
|
1
2
3
|
00000001000c9268 mov r12d, 0x93
00000001000c926e cmp dword [rax+4], 0x0
00000001000c9272 je loc_1000c9552
|
修改成
[Asm] 純文本查看 復制代碼
|
1
2
3
4
|
00000001000c9268 mov r12d, 0x2d
00000001000c926e cmp dword [rax+4], 0x0
00000001000c9272 jmp loc_1000c9552
00000001000c9277 nop
|
參照圖-7,將sub_1002e5f10 函數中的
[Asm] 純文本查看 復制代碼
|
1
|
00000001002e631c je loc_1002e6363
|
修改成
[Asm] 純文本查看 復制代碼
|
1
|
00000001002e631c jne loc_1002e6363;目的是繞過sub_1002e9e40網絡驗證。
|
通過線索1,我們找到來正常授權的路,線索1的路也走完了。保存修改。
運行修改后的文件時,提示圖-10
圖-10
2.3尋找新線索[size=14.6667px]
其實在提示圖-10窗口之前有個窗口一閃而退,那個窗口提示的是什么哪?
通過錄像的方式錄下來然后慢放暫停。其實那個提示框是圖-11。
現在我們又找到了新的線索(2條)。
[size=14.6667px]線索2: stringLicensedTo = “Licensed to:”
[size=14.6667px]線索3: stringInvalid license=“Invalid license”。
2.3.1分析線索2
線索2:stringLicensedTo = “Licensed to:”通過字符串查找并鎖定到引用函數,分析函數流程如圖-12。修改成如圖-13。
圖-11
圖-12
圖-13
[size=14.6667px]
2.3.2分析線索3[size=14.6667px]
線索3: stringInvalid license=“Invalid license”。通過字符串查找并鎖定到引用函數為sub_1002e7620。分析函數 sub_1002e7620 流程如圖-14
圖-14
[size=14.6667px]
簡化一下如下:
[C++] 純文本查看 復制代碼
|
01
02
03
04
05
06
07
08
09
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
|
if (eax > 0xda)//loc_1002e782a
{
if (eax > 0x20b)//1002e78b2
{
if ( eax != 0x20c)//1002e7b0f
{
goto 1002e8413;
}
else
{
Upgrade Required
}
}
else
{
if( eax > 0x176)
{
goto 1002e7b73;//Evaluation
}
else
{
if(eax > 0x112)
{
if(eax != 0x113)//1002e7da4
invalid license
else
days left
}
else
{
if(eax == 0xdb)
goto 1002eb295;//OK registered
else
envaluied version
}
}
}
}
else if(eax != 0x2f)
{
goto 1002e8413;//Evaluation Version
}
else
{
Bad Clock Dat;
}
|
可以修改成
[C++] 純文本查看 復制代碼
|
1
2
3
4
5
6
7
|
if (eax > 0xda){
goto 1002eb295;//OK registered
}
else
{
goto 1002eb295;//OK registered
}
|
即
[Asm] 純文本查看 復制代碼
|
1
2
3
|
00000001002e782a mov eax, dword [r15+0x18c] ; CODE XREF=sub_1002e7620+487, sub_1002e7620+501
00000001002e7831 cmp eax, 0xda
00000001002e7836 ja loc_1002e78b2
|
修改成
[Asm] 純文本查看 復制代碼
|
1
2
3
4
5
|
loc_1002e782a:
00000001002e782a mov eax, dword [r15+0x18c] ; CODE XREF=sub_1002e7620+487, sub_1002e7620+501
00000001002e7831 jmp loc_1002e8295
00000001002e7836 nop
00000001002e7837 nop
|
|