首页
社区
课程
招聘
[分享]Asprotect SKE 2.2 的Advanced Import protection保护技术
发表于: 2006-4-7 16:38 46569

[分享]Asprotect SKE 2.2 的Advanced Import protection保护技术

2006-4-7 16:38
46569

【文章标题】: Asprotect SKE 2.2 的Advanced Import protection保护技术浅析
【文章作者】: kanxue
【作者主页】: http://www.pediy.com
【软件名称】: Asprotect SKE 2.2 build 03.19 Release加壳的目标软件
--------------------------------------------------------------------------------
  首先感谢shoooo的帮助!春节前那段时间开始学习Asprotect SKE 2.x脱壳技术,由于长时间没接触Asprotect,感觉很是吃力,多亏shoooo无私地将他的许多经验技巧相授,这样才得己掌握这款猛壳的一些脱壳技术。
  本篇文章以Asprotect SKE 2.2 build 03.19 Release加壳的目标为讲解实例(一个Microsoft Visual C++ 6.0编译的程序),压缩选项只选了一项“Advanced Import protection”,Asprotect保护的输入表情况多种,本文仅与大家探讨Advanced Import protection部分,其它更完整的输入表处理类型参考shoooo撰写的Asprotect SKE经典文章:nspack3.5主程序脱壳分析(Aspr SKE 2.X)  ,本文只是将shoooo这篇的文章提到的东西转换成实际操作过程而己 。

脱Asprotect SKE 2.x壳会遇到如下情况:
1. Emulate standard system functions(易)
2. Advanced Import protection(中)
3. stolen OEP (脱Asprotect难点就在这,体力+毅力+技巧+时间)
4. SDK       (脱Asprotect难点就在这,体力+毅力+技巧+时间)
5. 初始化表与库函数(Delphi程序)(易)

1.什么是Advanced Import protection

先来看一段加壳的代码,请注意API函数的调用部分:
00401EC5   FF7424 08             push    dword ptr [esp+8]               
00401EC9   FF15 3C504000         call    [<&KERNEL32.GetCurrentProcess>]  //这里,即call    [40503C]
00401ECF   50                    push    eax                             
00401ED0   FF15 38504000         call    [<&KERNEL32.TerminateProcess>]   //这里,即call    [405038]
00401ED6   837C24 0C 00          cmp     dword ptr [esp+C], 0

用Advanced Import protection保护后的代码,其API调用转换成了call 01200000形式:
00401EC5   FF7424 08             push    dword ptr [esp+8]
00401EC9   E8 32E1DF00           call    01200000              //这里,调用KERNEL32.GetCurrentProcess
00401ECE   AA                    stos    byte ptr es:[edi]
00401ECF   50                    push    eax
00401ED0   E8 2BE1DF00           call    01200000              //这里,调用KERNEL32.TerminateProcess
00401ED5   CA                    db      CA

以下这段文字来自shoooo的文章(稍有改动):

最初由 shoooo 发布
出处:http://bbs.pediy.com/showthread.php?s=&threadid=19313

01200000什么呢?
它是把导入函数调用的变形,原来的call [IAT] 和 jmp [IAT]的变形
01200000壳用VirtualAlloc的分配的空间,不在区段中
在我的机子上现在是call 01200000,在你的机子上就可能是call 1230000
也就是说,call 01200000壳经过计算后写入的
于是我想看看,在它写入call 01200000前是什么样子

OD载入实例程序,清除所有断点,
对0401ECA下内存写入断点 (因为00401EC9 是'E8',我们要的是后4个字节)

若干次后会断在这里

00AA6EBF 8945 00 mov [ebp], eax // 断在这儿:ebp指向00401ECA,eax写入后,使那个地方变成call 01200000
00AA6EC2 6A 0A push 0A
00AA6EC4 E8 D3E7FDFF call 00A8569C
00AA6EC9 8BC8 mov ecx, eax
00AA6ECB 038B E4000000 add ecx, [ebx+E4]
00AA6ED1 8BD6 mov edx, esi
00AA6ED3 8BC3 mov eax, ebx
00AA6ED5 E8 AAE6FFFF call 00AA5584
00AA6EDA FF0C24 dec dword ptr [esp]
00AA6EDD 03B3 E4000000 add esi, [ebx+E4]
00AA6EE3 833C24 00 cmp dword ptr [esp], 0
00AA6EE7 ^ 0F87 55FEFFFF ja 00AA6D42 //如果还有需要处理就跳上去
00AA6EED 53 push ebx
00AA6EEE E8 5D000000 call 00AA6F50
00AA6EF3 0183 EC000000 add [ebx+EC], eax
00AA6EF9 B0 01 mov al, 1
00AA6EFB 83C4 24 add esp, 24
00AA6EFE 5D pop ebp
00AA6EFF 5F pop edi
00AA6F00 5E pop esi
00AA6F01 5B pop ebx
00AA6F02 C3 retn //这里结束


正如我所说,call 01200000完全是在代码段解码后,申请空间,现在我申请到的是01200000
那么它就将需要变形的地方计算后写成call 01200000,如果你申请到的是1230000,那么你
是call 1230000

断在这里,我当然想看一看在改写成call 01200000之前,那些地址是不是正常的
很可惜,那里在改写成call 01200000,本身就是乱掉的。
或者在某个时候能知道那些变形地址原先的真实情况,可惜我找不到。
也许只有作者知道在哪里
也许根本就找不到
因为根本就不需要
对于call 01200000,它加密前只要知道2件事,1.本身所在的地址 2.IAT中的位置
对于call 01200000,现在也只要知道2件事,1.本身所在的地址 2.最后要去的导入函数的地址
它没有理由记录IAT中的位置
我们要做的是找出最后到达的导入函数的地址,然后找出它在IAT中的位置
改成原先的call [IAT] 或 jmp [IAT]

回到正题,当我们断下时,前面可能已经处理若干个了
要想得到全部的表
你有好几种选择
1. 到oep后,写一段代码搜索出所有的call 01200000的地址
2. 想办法第一时间断在上面这个地方,即00AA6EBF,ebp-1就是变形的地址,保存所有的ebp-1
3. 也许内存中本身存在这张表,我没有去找,你可以找找
最初由 shoooo 发布
如果是1,当前这个call 01200000处运行时,会重新回到调用地址,再进入导入函数
如果是0,当前这个call 01200000进入导入函数后出来,不过这种方式比较邪恶,它可能做更多的事情

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (91)
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
完全不懂
2006-4-7 16:39
0
雪    币: 229
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
经典!期待楼主修复oep和sdk的文章。

看雪出品,必属精品!

2006-4-7 17:11
0
雪    币: 159
活跃值: (339)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
呵呵...好帖子
2006-4-7 17:22
0
雪    币: 389
活跃值: (912)
能力值: ( LV9,RANK:770 )
在线值:
发帖
回帖
粉丝
5
晕.............
2006-4-7 17:33
0
雪    币: 196
活跃值: (135)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
6
晕了....
2006-4-7 17:49
0
雪    币: 218
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
看雪出品,必属精品!
2006-4-7 18:14
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
精品
2006-4-7 18:36
0
雪    币: 2256
活跃值: (941)
能力值: (RANK:2210 )
在线值:
发帖
回帖
粉丝
9
学习了
闪人~~~~~做CRACKME去喽
2006-4-7 19:02
0
雪    币: 313
活跃值: (250)
能力值: ( LV9,RANK:650 )
在线值:
发帖
回帖
粉丝
10
有壳就怕怕。
2006-4-7 19:32
0
雪    币: 191
活跃值: (345)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
11
先占个位置。
2006-4-7 20:16
0
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
作为一个诗人的角度来讲。。。

我只能说学习。。。
2006-4-7 21:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
好文章 。先收下来了
2006-4-7 21:40
0
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
14
qiang
2006-4-7 21:49
0
雪    币: 296
活跃值: (250)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
15
等出书。。。
2006-4-7 21:50
0
雪    币: 208
活跃值: (41)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
还能说什么,只能说学习了。
2006-4-7 22:01
0
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ywb
17
我就只能张嘴 表示 惊叹
2006-4-7 22:26
0
雪    币: 208
活跃值: (41)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
对00AA6D6D call edx 下硬件执行断点,重新用OD加载实例程序,由于己下硬件断点,因此这次直接断在这里:

00AA6D6D FFD2 call edx //断在这里,此次EBP指向的就要处理的地址
00AA6D6F 807B 20 00 cmp byte ptr [ebx+20], 0
00AA6D73 0F85 3D010000 jnz 00AA6EB6
00AA6D79 3C 01 cmp al, 1


另外一个程序,发现call edx这儿用he截不住,f2报保护错误,看来还得换位置
2006-4-7 22:31
0
雪    币: 250
活跃值: (103)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
19
博大精深!精彩!!详细!!!
2006-4-7 22:44
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
还能说什么...............
2006-4-7 23:14
0
雪    币: 47147
活跃值: (20450)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
21
最初由 lidou 发布
另外一个程序,发现call edx这儿用he截不住,f2报保护错误,看来还得换位置


用其他方法,有技巧可循的,提示一下:内存断点。
2006-4-7 23:35
0
雪    币: 208
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
没什么难理解的文章不错

就像学理科的人看不懂文科的东西一样 其他人能理解
2006-4-8 00:12
0
雪    币: 184
活跃值: (108)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
23
我认为ASP 2.2 和 Hying 0.76 在IAT处理上有大量的相似的地方,我不知道到底是不是英雄所见略同.

可惜去年只有syscom 和我有点这样的讨论.

http://bbs.pediy.com/showthread.php?s=&threadid=17417
2006-4-8 00:14
0
雪    币: 208
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
24
楼上的玩 hying 应该比较多吧

是略同
2006-4-8 00:40
0
雪    币: 124
活跃值: (70)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
25
以前我修复call xxxx处理的iat都是乱序建新表,这样很不美丽

看了syscom的文章后,我做的iat真是工整又工整

我也在脱aspr2.x,iat表已经搞定

不过细节有点出入,大体还是相同的

在修复oep,正在脱的这个和一般的delphi模板又有点出入。。

正在郁闷中,又不想在黑暗中摸索,能找到模板就更好了

一般是6个call,或者5个call

  PUSH EBP
  MOV EBP,ESP
  ADD ESP,-10
  MOV EAX,44C8B8
  CALL 00405BC8
  MOV EAX,[44DFB8]
  MOV EAX,[EAX]
  CALL 0044B150
  MOV ECX,[44E094]
  MOV EAX,[44DFB8]
  MOV EAX,[EAX]
  MOV EDX,[44C6F0]
  CALL 0044B168
  MOV EAX,[44DFB8]
  MOV EAX,[EAX]
  CALL 0044B1E8
  CALL 00403D20

在第2个call“CALL 0044B150”出来后的代码是

  ADD ESP,-20
  LEA EAX,[ESP+8]
  PUSH EAX
  call 0040756C  - FF25 58235100   JMP [512358]   ; kernel32.GetLocalTime
  MOV CX,[ESP+E]
  MOV DX,[ESP+A]
  MOV AX,[ESP+8]

如果有人碰到这样的delphi,请发给我用下。。。

手动修复oep就方便多了
2006-4-8 00:45
0
游客
登录 | 注册 方可回帖
返回
//