首页
社区
课程
招聘
[求助]求 safengine(or shielden) 2.x IAT 修复脚本
发表于: 2012-1-6 20:48 16384

[求助]求 safengine(or shielden) 2.x IAT 修复脚本

2012-1-6 20:48
16384
近段时间一直在研究这个传说中的猛壳,确实对于我们这种小菜鸟来说,真的好猛,入口点知道在哪里,可就是断不下来,断下后可恶的输入表不好修复,对我而言能分析代码其实就足够了,彻底脱壳对我来说也没什么实际意义,当然有哪位大牛有OEP的短法也请赐教。

但是这该死的 IAT 修复起来真要命,一直在 safengine 段中跟了好久也要不就是跟丢要不就是跟过。。这个 Nooby 这可恨!我恨死他了~但是说回来,safengine VM 的功底肯定没 VMP TMD 之类的强,毕竟他们靠这个吃饭的,safengine 做足了反调试、反DUMP、antiAnything的功夫,但是要想在 VM 界立足一个 nooby 大牛还是不够的。

最后希望广大壳友不要气馁,矛与盾总是步步紧逼的,越是有挑战性的壳,越是号称“最强”的壳,崩溃的速度越快。safengine 这个壳做了很多宣传,用 10 万块来吸引眼球,并不是想证明他的壳有多强,只是一种炒作手段,最简单不过的手段,他一个 nooby 能抵抗千千万万的大牛吗?答案是肯定的,那就是“NO”!

=======================================================

求人不如求己是我一贯的作风。再也不做标题党!

经过仔细分析后,简单的写了中低复杂度的 IAT 修复脚本。

这种 复杂度的在SE壳中的 CALL 大概会占到 60% 左右,以下是 代码。

101A4AC9    50              PUSH EAX
101A4ACA    60              PUSHAD
101A4ACB    9C              PUSHFD
101A4ACC    B8 879A950B     MOV EAX,0B959A87
101A4AD1    BB B15F8304     MOV EBX,4835FB1
101A4AD6    03C3            ADD EAX,EBX
101A4AD8    8B00            MOV EAX,DWORD PTR DS:[EAX]
101A4ADA    33C3            XOR EAX,EBX
101A4ADC    874424 24       XCHG DWORD PTR SS:[ESP+24],EAX
101A4AE0    FF4424 28       INC DWORD PTR SS:[ESP+28]
101A4AE4    9D              POPFD
101A4AE5    61              POPAD
101A4AE6    C3              RETN <--- 难度最低的时候 EIP 到这里的时候 ESP 就是 API。

稍微再高一个级别的在 C3 处不返回 API,而是返回后到下面这里:

0944068B    68 F1893564     PUSH 643589F1
09440690    F71424          NOT DWORD PTR SS:[ESP]
09440693    813424 CA7659E7 XOR DWORD PTR SS:[ESP],E75976CA
0944069A    C3              RETN

也有可能是 RETN 4 的比如以下代码:

09440663    68 E03659E7     PUSH E75936E0
09440668    68 10718F6D     PUSH 6D8F7110
0944066D    F71424          NOT DWORD PTR SS:[ESP]
09440670    C10C24 05       ROR DWORD PTR SS:[ESP],5
09440674    C2 0400         RETN 4

所以脚本如下: 这是第一版,没有对 RETN 进行判断,随后会发一个完善一些的脚本,并且不再需要UIF修复,供菜鸟们学习。

var codebase
var secode1
var secode2
var apiaddr
var calladdr
var fixaddr
var retaddr
var temaddr

var oep
var temeax
var temebx
var temecx
var temedx
var temebp
var temesp
var temesi
var temedi

mov codebase,10001000
mov secode1,1018d000
mov secode2,10317000
mov oep,eip
mov temeax,eax
mov temebx,ebx
mov temecx,ecx
mov temedx,edx
mov temebp,ebp
mov temesp,esp
mov temesi,esi
mov temedi,edi

mov eip,codebase

findcall:
find eip,#E8??????00#
cmp $RESULT,0
je exit
mov calladdr,$RESULT
GCI calladdr,DESTINATION
mov fixaddr,$RESULT
find fixaddr,#50609cb8????????#,8
cmp $RESULT,0
jne startfix //这里发现低复杂度 CALL,直接开始处理了
find fixaddr,#e9??????00#,5
cmp $RESULT,0
je nextcall
mov sejmp,$RESULT
GCI sejmp,DESTINATION
mov fixaddr,$RESULT
find fixaddr,#68????????9c81442404????????9d#,0f
cmp $RESULT,0
jne next // 高复杂度的暂时忽略

nextcall:
add calladdr,1
mov eip,calladdr
jmp findcall

startfix:
mov esp,temesp
mov eip,calladdr

findret:
sti
find eip,#C3#, 1  //第一阶段直接查找 RETN
cmp $RESULT,0
mov retaddr,$RESULT
je findret
gn [esp] // 如果有返回但是ESP 又不是 API的则进入第二阶段
cmp $RESULT,0
jne fixret

findret2:
sti
find eip,#C3#,1
cmp $RESULT,0
mov retaddr,$RESULT
jne findiat
find eip,#C2??00#,3 // 这里查 RETN 4\8\C\10 之类,第二版中会做判断,根据他来读取寄存器里的返回地址,并作为下一个 EIP
mov retaddr,$RESULT
cmp $RESULT,0
je findret2

findiat:
gn [esp] //分析 APIname
cmp $RESULT,0
je findret2

fixret:
mov apiaddr,[esp] // 直接 asm call APIAddress,用 UIF 修复就可以了
eval "call {apiaddr}"
asm calladdr,$RESULT

next:
add calladdr,1
mov eip,calladdr
mov esp,temesp
mov eax, 0
mov ebx, 0
mov ecx, 0
mov edx, 0
mov esi, 0
mov edi, 0
mov ebp, 0
jmp findcall

exit:
mov eip,oep
mov esp,temesp
mov edi,temedi
mov esi,temesi
mov ebp,temebp
mov eax,temeax
mov ebx,temebx
mov ecx,temecx
mov edx,temedx
ret


以下是复杂度高的:

10193E8A   /E9 08770400     JMP ms.101DB597

跳过来以后,会反复执行以下代码,听说有特征码,可我还没能找到。因为我的SE 是 2090 的

101DB597    68 D6339FA0     PUSH A09F33D6
101DB59C    9C              PUSHFD
101DB59D    814424 04 61137>ADD DWORD PTR SS:[ESP+4],6F7F1361
101DB5A5    9D              POPFD
101DB5A6    C3              RETN

再比这个高的复杂度最后加这种结构,其实说回来复杂度不同就是结合的问题而已。

0944068B    68 F1893564     PUSH 643589F1
09440690    F71424          NOT DWORD PTR SS:[ESP]
09440693    813424 CA7659E7 XOR DWORD PTR SS:[ESP],E75976CA
0944069A    C3              RETN

其实复杂度高度都可以用我的脚本跑起来的,但是不保证完全正确,有时会跟丢的。

另外提示下,其实SE 的反调试并不是想象的那么恐怖,用strongOD v0.4.5.810 轻松忽悠SE。如果被发现,Ctrl+F2 几次就可以。

本脚本只适合菜鸟使用~~~呵呵 只是娱乐而已

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 220
活跃值: (721)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
LZ是标题党?
2012-1-6 20:51
0
雪    币: 292
活跃值: (126)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
没标题党啊?是你眼花。。。我写着 “求”呢
2012-1-6 20:57
0
雪    币: 671
活跃值: (2940)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
估计现在也不算强壳了,早有人搞定了
2012-1-6 21:36
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
safengine 的 VM 受 VMP 的启发而成 , 每个 handler 中掺杂了大量的花指令
vmp 的 handler 很清晰,目的性明确

与其费时间脱壳,不如直接带壳破解
2012-1-6 21:38
0
雪    币: 41
活跃值: (440)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
safengine壳
2012-1-7 13:11
0
雪    币: 2259
活跃值: (1431)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
期待大牛出通用脱壳机吧!
2012-1-8 19:26
0
雪    币: 547
活跃值: (2185)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
8
这种壳曾经遇到过就是带壳调试也不是都能搞定
2012-1-8 23:41
0
雪    币: 204
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我以前从不研究壳  都认为可以带壳搞

木有想到这个东西的反调试  挺强的  比VM的强
2012-1-11 17:28
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
mark  学习
2012-8-3 17:29
0
雪    币: 1095
活跃值: (4177)
能力值: ( LV5,RANK:69 )
在线值:
发帖
回帖
粉丝
11
SE再次火了  
2012-8-3 21:13
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
safengine 版本不同,则在进行IAT修复的脚本是不一样的,我是根据它的IAT的跳转到壳的过程中,发现进入虚拟机前的跳转地址后的二制数为API调用的字符串进行识别他的API调用的系统库和API函数字符串 ,然后根据这两个字符串,对该对地址进行修复。 程序调用API时 会有一个跳转,如:jmp     dword ptr [402008] 二进制特征码为FF25  壳将其程序所有的跳转 全部使用CALL命令进行替换,Delphi  编译的语言 在调用API时 会有一个跳转时,在每一个跳转后有8BC0特征码,用 脚本命令find $RESULT ,#E8??????00??8bc0# 来进行查询 ,从而修复API的调用时的跳转。
因为壳对程序的所有的jmp和call命令 进行变形,所以 要用脚本来测试跳转到壳代码后,回程序代码时的堆栈平衡,来判断是原程序的代码为JMP命令 ,还是CALL命令。从而对所有的  jmp  call 和api 跳转和IAT进行修复,因为这样的脚本的运行工作量比较大,而且还容易非法而退出脚本程序 ,所以在用脚本找出所有的需要修复的地址后,变成标准格式的文本,用C++做一个判断程序 ,用程序对原加壳的程序进行直接写入,这样速度更加快一点,我解过两个版本的Safengine Protector v2.0.7.0 Safengine Protector v2.0.8.0   好像是这样的吧我忘了,API、jmp和 Call的 修复我脚本检查API 、jmp 和CALL 要用3小时的时间 ,一个程序的IAT的修复和 跳转的修复,需要一天的时间 ,修复完成后,对修复的程序 进行BUG测试 需要半天。总的来说, 这个壳有点要命 ,所有的 API调用、jmp  和CALL都到壳里去了,而且API的调用壳里加了虚拟机代码。
2012-8-17 23:17
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
补充说一下,这个壳的反调试比较到位,每个版本都有变化,OLLYICE经常 过不去,让人要崩溃。
2012-8-17 23:24
0
游客
登录 | 注册 方可回帖
返回
//