大神论坛

找回密码
快速注册
查看: 93 | 回复: 0

[原创] Enigma6.8脱壳+修复(下) (附Enigma6.8加壳工具和无壳程序)

主题

帖子

3

积分

初入江湖

UID
110
积分
3
精华
威望
6 点
违规
大神币
68 枚
注册时间
2021-06-20 15:15
发表于 2021-08-14 23:31
本帖最后由 comeon 于 2021-08-14 23:31 编辑

修复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等壳的脱文,感谢大家的支持。


下方隐藏内容为本帖所有文件或源码下载链接:

游客你好,如果您要查看本帖隐藏链接需要登录才能查看, 请先登录

返回顶部