首页
社区
课程
招聘
[BD][ASProtect 1.35 build 04.25][Stolen code+CRC] X-Fonter6-beta
发表于: 2006-7-19 09:33 5951

[BD][ASProtect 1.35 build 04.25][Stolen code+CRC] X-Fonter6-beta

cyto 活跃值
31
2006-7-19 09:33
5951
X-Fonter6-beta-setup.exe

附件是我对stolen code的分析过程,供跟我一样的菜鸟参考。

ASProtect 2.1x SKE -> Alexey Solodovnikov
Version: ASProtect 1.35 build 04.25 Release [Extract]

Borland Delphi 6.0 - 7.0
Stolen code,CRC

1.Dump:
运行Volx的脚本Aspr2.XX_IATfixer_v1.02.osc,Resume来到OEP:
007D3284     55              push ebp                          // 无stolen oep
007D3285     8BEC            mov ebp,esp
007D3287     83C4 F0         add esp,-10
007D328A     B8 DC277D00     mov eax,X-Fonter.007D27DC
007D328F     E8 1C4BC3FF     call X-Fonter.00407DB0
007D3294     E9 01000000     jmp X-Fonter.007D329A

LordPE选择进程dump为dumped.exe。
上ImportREC,选择进程,OEP=003D3284,自动搜索,Asprotect插件,还有1个没有修复:


另外2个有疑问:


见到ws2_32.dll就讨厌,经常出问题。
不管了,先保存备用,然后Refix,存为dumped_.exe

OD载入dumped_.exe,异常:
堆栈:0012FD84   00435FC1    返回到 dumped_.00435FC1 来自 dumped_.0043475C
跟随,发现n多函数为解开:
0043474C   - FF25 AC1C8200   jmp dword ptr ds:[821CAC]
00434752     8BC0            mov eax,eax
00434754   - FF25 A81C8200   jmp dword ptr ds:[821CA8]
0043475A     8BC0            mov eax,eax
0043475C   - FF25 A41C8200   jmp dword ptr ds:[821CA4]     // 跟随到这里
00434762     8BC0            mov eax,eax
00434764   - FF25 A01C8200   jmp dword ptr ds:[821CA0]

原程序为:
00434754   - FF25 A81C8200   jmp dword ptr ds:[821CA8]      ; WS2_32.WSAGetLastError
0043475A     8BC0            mov eax,eax
0043475C   - FF25 A41C8200   jmp dword ptr ds:[821CA4]      ; WS2_32.WSAStartup
00434762     8BC0            mov eax,eax
00434764   - FF25 A01C8200   jmp dword ptr ds:[821CA0]      ; WS2_32.WSACleanup

看来还是ws2_32.dll惹的祸。
只好采用Volx的方法,dump region,拿到idata的数据覆盖掉,Alt+M查看idata区段,821000,size=5000。

2.idata修复:
上Volx的修改脚本:Aspr2.XX_IATfixer_v1.02-idata.osc
运行修改后的脚本, OD 出现讯息框 " lab7" 时就可以 dump region(区段821000,Size=5000,就是IAT表的位置)了,存为idata.dmp区段。

LordPE载入dumped.exe:

把idata.dmp覆盖掉00421000区段(821000-400000=421000),Rebuild PE。

3.修复IAT表:
经过idata修复后的脱壳程序dumped.exe仍然有问题。
堆栈:0012FFA0   00407DC1    返回到 dumped.00407DC1 来自 dumped.00407CEC
00407CEC   - FF25 A4128200   jmp dword ptr ds:[8212A4]     
原来是输入表没搞定。原程序运行IAT修复脚本后,把IAT表copy过来粘贴,保存为dumped1.exe。

记得用ImportREC修复的时候还有一个函数无效,轮到它出场了,载入dumped1.exe:
堆栈:0012FF50   0041350D    返回到 dumped1.0041350D 来自 dumped1.00408534
00408534   - FF25 E0148200   jmp dword ptr ds:[8214E0]
跟踪原程序发现是:
016F7590     E8 B7E2FEFF     call 016E584C         ; jmp to kernel32.GetProcAddress
ds:[01709274]=77E6E6A9 (kernel32.GetProcAddress)
修改保存为dumpe2.exe。

4.Stolen code 1:
载入运行又异常:
0012FBA8   004DBC42    返回到 dumped2.004DBC42 来自 dumped2.0040AC50
0040AC50     68 0000E201     push 1E20000          // 到壳里
0040AC55     C3              retn

跟踪原程序到这里:
...
01E200A3     89D1            mov ecx,edx
01E200A5     39C9            cmp ecx,ecx
01E200A7     F3:A6           repe cmps byte ptr es:[edi],byte ptr ds:[esi]
01E200A9     74 2A           je short 01E200D5
01E200AB     8A5E FF         mov bl,byte ptr ds:[esi-1]
01E200AE     80FB 61         cmp bl,61
01E200B1     72 08           jb short 01E200BB
01E200B3     80FB 7A         cmp bl,7A
01E200B6     77 03           ja short 01E200BB
01E200B8     80EB 20         sub bl,20
01E200BB     8A7F FF         mov bh,byte ptr ds:[edi-1]
01E200BE     80FF 61         cmp bh,61
01E200C1     72 08           jb short 01E200CB
01E200C3     80FF 7A         cmp bh,7A
...
有点熟,OD加载一个Borland Delphi 6.0 - 7.0参考程序,搜索,呵呵找到,拷贝二进制:
56 57 53 89 C6 89 D7 09 C0 74 03 8B 40 FC 09 D2 74 03 8B 52 FC 89 C1 39 D1 76 02 89 D1 39 C9 F3 A6 74 2A 8A 5E FF 80 FB 61 72 08 80 FB 7A 77 03 80 EB 20 8A 7F FF 80 FF 61 72 08 80 FF 7A 77 03 80 EF 20 38 FB 74 D8 0F B6 C3 0F B6 D7 29 D0 5B 5F 5E C3

粘贴后汇编代码如下:
0040AC50     56              push esi
0040AC51     57              push edi
0040AC52     53              push ebx
0040AC53     89C6            mov esi,eax
0040AC55     89D7            mov edi,edx
0040AC57     09C0            or eax,eax
0040AC59     74 03           je short dumped2.0040AC5E
0040AC5B     8B40 FC         mov eax,dword ptr ds:[eax-4]
0040AC5E     09D2            or edx,edx
0040AC60     74 03           je short dumped2.0040AC65
0040AC62     8B52 FC         mov edx,dword ptr ds:[edx-4]
0040AC65     89C1            mov ecx,eax
0040AC67     39D1            cmp ecx,edx
0040AC69     76 02           jbe short dumped2.0040AC6D
0040AC6B     89D1            mov ecx,edx
0040AC6D     39C9            cmp ecx,ecx
0040AC6F     F3:A6           repe cmps byte ptr es:[edi],byte ptr ds:[esi]
0040AC71     74 2A           je short dumped2.0040AC9D
0040AC73     8A5E FF         mov bl,byte ptr ds:[esi-1]
0040AC76     80FB 61         cmp bl,61
0040AC79     72 08           jb short dumped2.0040AC83
0040AC7B     80FB 7A         cmp bl,7A
0040AC7E     77 03           ja short dumped2.0040AC83
0040AC80     80EB 20         sub bl,20
0040AC83     8A7F FF         mov bh,byte ptr ds:[edi-1]
0040AC86     80FF 61         cmp bh,61
0040AC89     72 08           jb short dumped2.0040AC93
0040AC8B     80FF 7A         cmp bh,7A
0040AC8E     77 03           ja short dumped2.0040AC93
0040AC90     80EF 20         sub bh,20
0040AC93     38FB            cmp bl,bh
0040AC95   ^ 74 D8           je short dumped2.0040AC6F
0040AC97     0FB6C3          movzx eax,bl
0040AC9A     0FB6D7          movzx edx,bh
0040AC9D     29D0            sub eax,edx
0040AC9F     5B              pop ebx
0040ACA0     5F              pop edi
0040ACA1     5E              pop esi
0040ACA2     C3              retn

5.Stolen Code 2:
继续,又来到:
0012F7BC   004D76DC    返回到 dumped2.004D76DC 来自 dumped2.0040CF88
0040CF88     68 0000E301     push 1E30000
0040CF8D     C3              retn               // 又到壳里

跟踪原程序:
01E30000     57              push edi                              ; push edi
01E30001     56              push esi                              ; push esi
01E30002     EB 02           jmp short 01E30006
01E30006     8DBC28 96B44600 lea edi,dword ptr ds:[eax+ebp+46B496]
01E3000D     EB 01           jmp short 01E30010
01E30010     337C24 28       xor edi,dword ptr ss:[esp+28]
01E30014     C1D7 E1         rcl edi,0E1
01E30017     337C24 08       xor edi,dword ptr ss:[esp+8]
01E3001B     BF 2A944A00     mov edi,4A942A
01E30020     64:EB 02        jmp short 01E30025
01E30025     8D7C02 65       lea edi,dword ptr ds:[edx+eax+65]
01E30029     2BF8            sub edi,eax
01E3002B     64:EB 02        jmp short 01E30030
01E30030     8D7C0F 9B       lea edi,dword ptr ds:[edi+ecx-65]
01E30034     26:EB 02        jmp short 01E30039
01E30039     2BF9            sub edi,ecx                           ; =mov edi,edx
01E3003B     13F5            adc esi,ebp
01E3003D     50              push eax
01E3003E     BE EAB54400     mov esi,44B5EA
01E30043     337424 08       xor esi,dword ptr ss:[esp+8]
01E30047     5E              pop esi                               ; =mov esi,eax
01E30048     81F1 665486C2   xor ecx,C2865466
01E3004E     034C24 18       add ecx,dword ptr ss:[esp+18]
01E30052     034C24 38       add ecx,dword ptr ss:[esp+38]
01E30056     3E:EB 02        jmp short 01E3005B
01E3005B     03CB            add ecx,ebx                           ; X-Fonter.004D1E0C
01E3005D     8D8C3A FFFFFFFF lea ecx,dword ptr ds:[edx+edi-1]
01E30064     2BCF            sub ecx,edi
01E30066     2BCA            sub ecx,edx                           ; =mov ecx,-1
01E30068     83C8 FF         or eax,FFFFFFFF
01E3006B     F7D0            not eax                               ; =xor eax,eax
01E3006D     F2:AE           repne scas byte ptr es:[edi]          ; repne scas byte ptr es:[edi]
01E3006F     F7D1            not ecx
01E30071     C1DF 45         rcr edi,45
01E30074     2E:EB 01        jmp short 01E30078

得到前面的Stolen code,如下:
push edi
push esi
mov edi,edx
mov esi,eax
mov ecx,-1
...

Ctrl+S搜索参考程序,找到,拷贝二进制:
57 56 89 D7 89 C6 B9 FF FF FF FF 31 C0 F2 AE F7 D1 89 D7 31 D2 F3 A6 8A 46 FF 8A 57 FF 29 D0 5E 5F C3

汇编代码如下:
0040CF88     57              push edi
0040CF89     56              push esi
0040CF8A     89D7            mov edi,edx
0040CF8C     89C6            mov esi,eax
0040CF8E     B9 FFFFFFFF     mov ecx,-1
0040CF93     31C0            xor eax,eax
0040CF95     F2:AE           repne scas byte ptr es:[edi]
0040CF97     F7D1            not ecx
0040CF99     89D7            mov edi,edx
0040CF9B     31D2            xor edx,edx
0040CF9D     F3:A6           repe cmps byte ptr es:[edi],byte ptr ds:[esi]
0040CF9F     8A46 FF         mov al,byte ptr ds:[esi-1]
0040CFA2     8A57 FF         mov dl,byte ptr ds:[edi-1]
0040CFA5     29D0            sub eax,edx
0040CFA7     5E              pop esi
0040CFA8     5F              pop edi
0040CFA9     C3              retn

6.CRC:
程序终于开始启动,出现NAG窗口,点击试用后又异常:
007CEF7B     80B8 74090000 0>cmp byte ptr ds:[eax+974],0   // 这里异常
007CEF82     0F84 C2020000   je dumped2.007CF24A
007CEF88     8B45 EC         mov eax,dword ptr ss:[ebp-14]

在OD窗口往上翻看到很熟悉的CRC验证:
007CEEB6     8D8C11 D00CB437 lea ecx,dword ptr ds:[ecx+edx+37B40CD0]
007CEEBD     2BCA            sub ecx,edx
007CEEBF     03CB            add ecx,ebx
007CEEC1     85C9            test ecx,ecx
007CEEC3     0F84 29000000   je dumped2.007CEEF2                       
// 这里,跟踪其他Asrpotect的时候CRC验证经常看到,需要修改为jmp,保存为cyto.exe。
这下程序彻底加载完毕。

7.Stolen code 3:
点击左边切换功能模块的时候又异常:01E60000不易读取。
搜索jmp 01E60000:
007C2EA7   - E9 54D16901     jmp 01E60000
这个stolen code多了。

先熟悉下该程序的变形跳转及变形call。
进入第二层到变形跳转变形call的类型判断处:
017046B2     FFD2              call edx
017046B4     2C 02             sub al,2                    // here,注意al值
017046B6     72 0B             jb short 017046C3           // 0,1
017046B8     74 33             je short 017046ED           // 2
017046BA     FEC8              dec al
017046BC     74 73             je short 01704731           // 3
017046BE     E9 C2000000       jmp 01704785
进入第3层到下一行地址指向:
01EC0114     FF6424 FC         jmp dword ptr ss:[esp-4]     // 下一行代码的地址

恢复代码过程冗长,手工一行一行copy,碰到跳转不得不重来几回,这样得到跳转实现与未实现的代码。
详细分析见附件文章。

8.Stolen code 4:
点击右边切换功能模块的时候又异常:01E50000不易读取。
搜索jmp 01E50000:
007BD8A9    /E9 01000000     jmp cyto2.007BD8AF
007BD8AE    |90              nop
007BD8AF   - E9 4C276901     jmp 01E50000

恢复代码后发现装不下,只好从007BD8A9开始。
详细分析见附件文章。

9.后记:
经过这2个大段code的恢复后,功能基本全了,只是启动还提示试用30天,没能搞定,郁闷!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 417
活跃值: (475)
能力值: ( LV9,RANK:1250 )
在线值:
发帖
回帖
粉丝
2
上传脱壳修复后的程序,请测试是否有平台问题。
上传的附件:
2006-7-19 09:41
0
雪    币: 417
活跃值: (475)
能力值: ( LV9,RANK:1250 )
在线值:
发帖
回帖
粉丝
3
原程序有点大就不传了。
上传的附件:
2006-7-19 09:42
0
雪    币: 245
活跃值: (195)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
4
在 WINDOWS XP SP1

哕行有?铨....

你的 Import Table 修?有?铨....

2006-7-19 11:25
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
支持+学习,老久没来看雪了
2006-7-19 11:52
0
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
6
1. 0040AC50, 004D76DC 是模拟标准函数, 不能算严格意义上的stolen code (标准函数中没有子call,aspr也不会抽它的跳转和比较)

2. 我找到3处aspr 的CRC, 好像你只修了1处,还有2处7D3294和7B58FC也许会吃到,也许不会吃到,但作为脱壳破解应该要修一下比较好.在stephenteh的作品中, 他常常把这些aspr CRC还原成原始的宏, 做到那样就比较厉害了

3. 这个试练品有6处key lock~. 也就是需要realkey才能解码. 因此有小部分的可能功能有限制. 我告诉你其中的2处吧7B58C1和7BFD36等,另外4处手动找一下也很快. aspr1.3X的keylock功能是有漏洞的, 这个试练品很不幸运, 可以无key解码那6处地方~. aspr问题太多了.....

题外话.建议cyto兄看看一aspr的example例子, 把那些吃透, 你会收获不小
2006-7-19 11:53
0
雪    币: 417
活跃值: (475)
能力值: ( LV9,RANK:1250 )
在线值:
发帖
回帖
粉丝
7
最初由 shoooo 发布
1. 0040AC50, 004D76DC 是模拟标准函数, 不能算严格意义上的stolen code (标准函数中没有子call,aspr也不会抽它的跳转和比较)

2. 我找到3处aspr 的CRC, 好像你只修了1处,还有2处7D3294和7B58FC也许会吃到,也许不会吃到,但作为脱壳破解应该要修一下比较好.在stephenteh的作品中, 他常常把这些aspr CRC还原成原始的宏, 做到那样就比较厉害了

3. 这个试练品有6处key lock~. 也就是需要realkey才能解码. 因此有小部分的可能功能有限制. 我告诉你其中的2处吧7B58C1和7BFD36等,另外4处手动找一下也很快. aspr1.3X的keylock功能是有漏洞的, 这个试练品很不幸运, 可以无key解码那6处地方~. aspr问题太多了.....
........


谢谢指点!
我要继续努力。
2006-7-19 12:29
0
雪    币: 319
活跃值: (2404)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
8
cyto请把Aspr2.XX_IATfixer_v1.02-idata发上来一下。用idata的数据覆盖的办法好象Volx在哪个帖子提到过。不知那个帖子在哪里。
2006-7-19 22:07
0
雪    币: 233
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
最初由 csjwaman 发布
cyto请把Aspr2.XX_IATfixer_v1.02-idata发上来一下。用idata的数据覆盖的办法好象Volx在哪个帖子提到过。不知那个帖子在哪里。


http://www.unpack.cn/viewthread.php?tid=5455&extra=page%3D1&page=2
2006-7-20 00:25
0
雪    币: 319
活跃值: (2404)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
10
谢谢了!
2006-7-20 07:45
0
游客
登录 | 注册 方可回帖
返回
//