首页
论坛
课程
招聘
[原创]Enigma6.8脱壳+修复(下)
2021-8-12 21:02 10873

[原创]Enigma6.8脱壳+修复(下)

2021-8-12 21:02
10873

最近家里电路有问题总是跳闸,拖拖拉拉就到了今天才写。

修复IAT

第二种单纯加密

这种处理IAT的就算单纯的进行运算解密出对应新的FF25表对应的函数地址跳转,每个加密过的IAT都有对应不同的push xxxxxxxx一个值,EG壳这种处理手法和老版本几乎是一样的,没有太大的变动。


如果大家想详细跟下他的解密可以进入这个CALL

005C84B8    E8 3FC0FFFF     CALL PE提取_p.005C44FC

EAX就是返回的地址,就是壳自己创建的FF25跳转表对应的函数跳转,如果我们写脚本处理就很简单了,这个解密CALL是公用的所有函数的解密都是调用这一个解密CALL


我简单的来说下脚本的实现思路吧

  1. 由于这个样本是VC++编译的所有的函数调用都是以FF15 CALL的形式简接调用我们只需从00401000开始往下找FF15开头的汇编语句即可

  2. 当我们找到FF15汇编语句是我们可以+4取间接调用地址里的值是否小于5FF00000(系统函数地址都是高地址,壳申请的都是低的地址)

  3. 我们可以在壳创建的FF25地址表选择地址表所处的全部区域下内存访问断点,再按照2的方法获取对应的函数地址填充会1的地址里即可

EG壳对于这种方法还有一个线程干扰,怎么回事呢?就是当你用脚本跑修复IAT时他会时不时调用sleep函数来暂停线程干扰修复,根据我的观察可以发现加壳程序对比没加壳的程序多了2条线程,当我终止这2条线程后程序会退出,就是一个简单的ExitProcess函数的调用退出我们直接在函数内部ret掉程序就不会退出,正常运行了,也不再会调用sleep函数干扰我们修复了。




脚本代码如下:

var addr
var taddr
var addriat
var taddriat

bc
bpmc
bphwcall
bprm 6ccca5,f2a

mov addr,401000

start:
findop addr,#ff15????#,ffff
mov addr,$RESULT + 4
cmp $RESULT,0
je exit
mov taddr,[$RESULT + 2],4
mov taddriat,taddr
mov taddr,[taddr],4
cmp taddr,4f000000
ja start
cmp taddr,500000
jb start
mov eip,$RESULT
eob fix
run

fix:
mov addriat,[eip + 2],4
mov addriat,[addriat],4
mov [taddriat],addriat,4
jmp start

exit:
ret


第三种模拟+加密

最后一种加密也是最难还原的,我把EG壳翻了底朝天我还是无法找到这种IAT处理出现对应原函数的地方,我猜测EG壳在SDK处理的时候就将这一小部分函数给按字节获取重写进壳程序保存起来了,现场就不会再二次获取函数出现暴露的风险。EG壳这种模拟虽然力度比较大但是也是有前提条件的不是任何函数都可以模拟的,更具对比发现他主要是挑一些编译语言所必带的函数来进行加密,不仅如此在这部分函数里再挑选整个函数没有call的调用没有跳转的函数进行重写。


大概有这些函数:

00425148 >7C810C6D  kernel32.GetCommandLineA
00425248 >7C80CD37  kernel32.SetHandleCount
00425198 >7C80DE95  kernel32.GetCurrentProcess
00425220 >7C811752  kernel32.GetVersion
004502C0 >7C82511A  kernel32.FreeResource
004502B4 >7C8099C0  kernel32.GetCurrentProcessId
00425290  7C80B741   kernel32.GetModuleHandleA
004250F8  7C80CD37  kernel32.SetHandleCount




还有几个比较特殊的函数又是另外独特的重写手法,用公用解密call解密后的返回地址是另外一种,我总结了下就这几个,语言不同可能会有变动

kernel32.GetModuleHandleA  
kernel32.LoadLibraryExA
ntdll.RtlGetLastWin32Error

我们可以用DIE64来查加壳程序的编译器然后去找到对应无壳的程序来比照填写函数地址即可。数量不会很多的,如果碰上未知的函数我们可以看call的所需要的push参数个数来大致判断是哪个函数。


附近有各语言无壳例子和脚本,最后再提下EG壳的函数加密不止会加密程序的IAT,他还会把所加载的系统dll内的函数也给加密,具体不知道有什么用,脚本我也一起发给大家吧。


好了,EG6.8的旅程就到这里结束了。随着我的继续探索,视情况我还会给大家带来VMP TMD SE  OB等壳的脱文,感谢大家的支持。


[注意] 欢迎加入看雪团队!base上海,招聘CTF安全工程师,将兴趣和工作融合在一起!看雪20年安全圈的口碑,助你快速成长!

最后于 2021-8-14 17:31 被大道在我编辑 ,原因:
上传的附件:
收藏
点赞3
打赏
分享
最新回复 (6)
雪    币: 324
活跃值: 活跃值 (344)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
院士 活跃值 2021-8-13 18:50
2
0
不错,支持,期待vmp SE的脱文。
雪    币: 2003
活跃值: 活跃值 (77)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rescuo 活跃值 2021-8-14 09:57
3
0
X64的讲讲呢?
雪    币: 1680
活跃值: 活跃值 (1374)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
大道在我 活跃值 2021-8-14 17:29
4
0
rescuo X64的讲讲呢?
都差不多的,官网现在最新的X32 X64都是6.8版本处理手法都是一样的
雪    币: 12632
活跃值: 活跃值 (1477)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
白菜大哥 活跃值 2021-8-18 10:51
5
0
你好,问下一起吗,我也喜欢这个壳。ps :不是黑产。。纯技术学习。
雪    币: 1744
活跃值: 活跃值 (1131)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
欧阳休 活跃值 2021-8-18 11:56
6
0