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直播授课