大神论坛

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

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

主题

帖子

3

积分

初入江湖

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

背景

最近在研究壳,去试了试最新的Enigma脱壳,虽然也脱了但是还是有一些勉强,修复IAT并不完美需要手工处理掉一些不同语言所必带的函数才能完全修复掉IAT,有完美方法的朋友可以回帖告诉我。


平台:windows XP 32位

工具:OD、REC

加壳对象:VC6.0程序

寻找OEP

OEP的寻找比较简单,我没有让入口虚拟化,水平有限,只勾选了输入表的保护,其他的默认。

寻找OEP我使用的是语言特有的特征码定位的方法,这种方法很快啊,单步跟OEP比较难这个壳对断点的检测也很严,对于F8单步跟踪也有对应的检测手段,例如步过某个CALL计算出来的返回地址会变成错误的值无法正常返回上一层。我们也要尽量避免使用CC断点和内存断点,只用硬件断点来调试程序。


我们可以自己在网上找一个VC++6.0无壳程序找到OEP头部的CALL(前几个都行,别太远,也别太近),各种语言例子程序我也会打包给大家一份供参考。

我寻找的特征码是33 C0 6A 00 39 44 24 08 68 00 10 00 00 0F 94 C0 50 FF 15 ?? ?? ?? ?? 85 C0

我们先让程序跑起来,毕竟几乎所以的加密壳都会填充原始代码段数据,运行程序会让程序把代码段解码方便我们用特征码定位OEP

在这里下硬件执行断点即可,重新载入程序F9让程序执行过去会断在我们的执行断点处,我们看堆栈窗口直接返回到上一层的调用就行OEP

OEP的寻找到这里就结束了,不难,这种方法除了入口直接虚拟化效果不好以外其他的一些处理OEP头部的方法都能定位出OEP,例如stolen code也可以有效处理找回头部代码或者可以定位接近头部的代码来进行下一步分析找回头部代码。


修复IAT

我先来介绍下EG壳处理IAT有几种手法吧

  1. 模拟函数执行

  2. 单纯加密

  3. 加密+模拟函数

  4. 还有一种特殊情况下才会有,但也是一种单纯的加密,难度属于最低的那种,我下面也会简单说一下

第一种:模拟函数执行

模拟函数执行的IAT函数就是上面截图0111开头的IAT函数就全部是模拟类型的IAT,我们随便选一个右键查找参考找到调用的call看看