首页
社区
课程
招聘
[原创]Safengine Shielden 2.3.8.0 脱壳 ∷之∷ 修复IAT
发表于: 2017-7-18 13:35 28268

[原创]Safengine Shielden 2.3.8.0 脱壳 ∷之∷ 修复IAT

2017-7-18 13:35
28268

Safengine Shielden 2.3.8.0(以下称SE)对IAT的破坏还算彻底,虽然对原程序的IAT做了完整的保存,但是保护后的程序是不会调用那里的API地址的,所以原IAT其实是废掉的。

         所以在尝试修复SEIAT时,直接在IAT下断点并没有任何作用。

依据我的研究,SEAPI的调用机制是:

先映射几个常用的系统DLL到自己分配的内存区域,然后逐个搜索查询需要的shadow API,获取他们的地址。

保存shadow API或者真实 API 的地址到壳段已经被设定好的调用位置,壳程序会通过预先构造好的代码对其进行调用,这种构造好的代码我称之为Fack_API_Entry

处理所有原程序中对API的调用,使其以E8 call 的方式,通过调用构造好的Fack_API_Entry来实现调用API

(注:1、这里的 API 地址 Fack_API_Entry 是一一对应的,有多少API 地址 就有多少Fack_API_Entry

         2API 地址是被离散的存储在壳段中的。)



         通过阅读L4Nce对于修复SE 2.2.6.0  IAT的脚本,我觉得部分内容依然适用于新版面的SE。就是执行到OEPCODE段被完全解压后,通过搜索call se_data代码,找到可能的API调用位置,将EIP改到call的位置,然后执行call的代码,定位所要找的API

         但在旧版本中,读取API地址的代码段是唯一的,所以可以通过逆向分析找到关键位置,并下断点,通过脚本对断点拦截处edi的值的读取来获得API地址。而在新版本中,读取API地址的代码不是唯一的,可以说有多少API就有多少段代码,使得L4Nce的脚本在新版本中已经完全不可行。

         我的思路是用类似于找OEP的方式,通过堆栈平衡的方法找到接近Fack_API_Entry出口的位置,然后通过脚本控制单步执行寻找真实被调用的API

         这种方法最大的缺陷是没有办法处理很大量的VM或者混淆代码。万幸的是,SE中的Fack_API_Entry出口处并不存在大量的VM或者混淆。至于原因,SE作者nooby大神是这么解释的:

So what we need to do is:

1. Dump the unpacked target

2. Fix its import function calls / rebuild IAT

In most cases the target will not contain any shell SDK calls or have many VMed code which do require a running shell, so that's all it takes to unpack the target.

Talking about import protections, if you find it difficult to understand, I suggest that you pick ONE specific program like calc.exe or notepad.exe and try to protect it.

Soon you will figure out that there is not many ways to do that, you can:

1. Use random locations for each function address

2. Replace call [iAT] instructions and retrieve API during runtime

And that pretty much covers every different methods you can see in many protectors.

For #1, if you found it hard or inefficient to scan entire code section and locate all those locations, you should analyze the shell code and find the part that retrieves & fills API addresses. Make a log or something like what I did in my previous IAT fix scripts.

For #2, you will need to scan the code section and identify these calls, then make a run trace to each of them, discover their corresponding API addresses. This is most likely what you will see in SE scripts.

You may ask, is it really that simple like ... Yes! Keep in mind that any additional code adding to a simple call [iAT] will have significant performance impact on the program, so there cannot be many tricks, even the code must be simple. For case #1, the address filling process can loop many thousand times, for case #2, think of a typical message loop. So you won't see any heavy VM there, have a cup of tea and find proper ways to handle them.

Why is unpacking all about IAT fixing? Because IAT is the only thing a protector can do with "blind" targets. Unless you are dealing with a protector designed for the sole purpose of protecting that one single program, or it can't just randomly pick some places and insert extra code there. Some protectors feature resource anti dump and stuff, but that either depends on API hooking or resource tree manipulation. Considering there is usually not many resources in UnpackMEs, you can always find & dump them manually.



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

上传的附件:
收藏
免费 1
支持
分享
打赏 + 5.00雪花
打赏次数 1 雪花 + 5.00
 
赞赏  CCkicker   +5.00 2017/07/20
最新回复 (14)
雪    币: 9
活跃值: (394)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这是督促更新的节奏啊
2017-7-18 13:58
0
雪    币: 47147
活跃值: (20495)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3
Safengine  还是很有难度的,厉害!
2017-7-18 21:26
0
雪    币: 292
活跃值: (153)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
。。。移动端钱多。 
2017-7-19 00:51
0
雪    币: 12390
活跃值: (5148)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
大神又现鸟,来学习了哟
2017-7-19 16:28
0
雪    币: 25
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
写个自动脱壳工具啊
2017-8-11 14:42
0
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
LZ对Safengine研究挺多嘛
2017-8-11 21:11
0
雪    币: 17683
活跃值: (4671)
能力值: ( LV15,RANK:1878 )
在线值:
发帖
回帖
粉丝
8
Fack_API_Entry化的API算是VM(SafeEngine、老毛的VMP等)的中间层防御,(如果基本的压缩释放还原原镜像节段算是外层防御),
VM对函数体的虚拟化算是内层,这部分功能如果强,虚拟化出来的代码基本可以让多数人或分析工具怀疑人生;
虽然对付内层的虚拟化有些前沿的窥孔优化等技术的,尚不多见。坦然,攻击的目的不同,需要深入的层次也不同,不见得所有攻击都需要对抗内层防护。
不过内层防护算是抵御逆向的有效手段(无疑会影响执行效率,矛盾统一)。
网络上的脱壳等视频或教程大多也止步于中、外层(可能已经满足多数需求了)。VM在相对长的一段时间内还是有效的防御手段。
2017-8-12 09:31
0
雪    币: 175
活跃值: (2561)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
好教程,学习。
2017-10-12 22:27
0
雪    币: 142
活跃值: (22)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
很强大的说
2018-2-10 21:07
0
雪    币: 717
活跃值: (480)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
11
楼主,你能脱Safengine  Shielden  2.3.6.0的壳吗
2018-5-2 10:43
0
雪    币: 110
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
老版本脱了很多次  ,  后来离开就没动过了,几乎全忘了,

5年前  PC  加密就开始没落 
2018-5-8 13:57
0
雪    币: 368
活跃值: (431)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
13
没找到关注按钮,就mark下吧,下班看
2018-5-8 14:13
0
雪    币: 1541
活跃值: (519)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
试试手
2019-1-17 21:58
0
雪    币: 220
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
15
2.3.9怎么脱啊
2020-2-2 09:03
0
游客
登录 | 注册 方可回帖
返回
//