逆向脱壳-压缩壳脱壳单步跟踪方法

2 篇文章 0 订阅

1、压缩壳原理

所有的文件在存储中都是以0和1的形式存在的。

比如说一个文件的字节内容是“111111100000000000000000000000000000000000000000000000001111”,你要完全写出来的话,会很长很长,

但如果你用“1{7}0{49}1{4}”来描述它(当然这只是为方便说明这样写,并不是真的是一种压缩算法),也能得到同样的信息,但却只有13个字节,这样就减小了文件体积。

有些算法是无损的,也就是说都可以还原成与原文件一模一样;也有些算法是有损算法,但一般压缩比高一点,可以压缩得更小。
一般压缩壳很少用自己独创的压缩算法,都是根据需要选用已经很成熟了的算法.在具体应用中,文件都相当复杂,根据一定的数学算法,权衡把哪段字节用一个特定的更小字节代替,

就可以实现数据最大程度的无损压缩.相同类型的文件,其内部也具有很多相似的结构,所有有很多算法都是针对具体文件类型才有最大的效率,

比如gzip,zlib,以及图形格式png使用deflate压缩算法,gif用lzw算法,等等.这些算法也能用于可执行文件.压缩壳把全部文件资源

(一般就是一个可执行程序)用一种或几种算法进行压缩,运行时再解压缩释放到内存,然后让系统运行它.

2 单步跟踪方法

2.1 单步跟踪原理

单步跟踪法可以看作是在对于加壳程序的动态调试中,存在两种情况:一种是对于地址明确的汇编指令按照向下跳转进行F8单步步过,而对于向上跳转的情况,应当在下方没有call/jmp/jnz这一类指令前方点击F4运行到该处,继续F8向下运行;另外一种是对于地址不明确的应当进行F7(单步步入),进到函数里面进行第一种情况的操作(两种情况都会进行举例说明)。相同之处在于,壳程序的结束标志。一般来说壳的解密过程不会和原程序的OEP在同一个区块当中,所以当在党部跟踪过程中发现进行大段的跳转时需要注意,下一个指令就会是源程序的OEP。

2.2 单步跟踪实例

针对上述说的两种情况,分别对UPX加密壳和AsPack加密壳进行举例说明。

以2020湖湘杯第二道逆向为例,原题为无壳的exe文件:exe程序链接:链接:https://pan.baidu.com/s/1PlfSOKKBTF8a7qL8dKwwNQ      提取码:cscj 

(1)UPX加密壳

exe程序开始进行查壳:

对于无壳的程序进行UPX加壳后进行查壳:

接下来,进行单步跟踪方法的脱壳实战,打开OD,加载程序,到达壳程序入口点,单步步过进行,向下跳转F8,向上跳转则在下方中的call/jmp/jnz之前F4,之后继续F8。

比如上图情况,也许你们会存在一个问题,为啥在遇到向上跳转的时候要在下方中的call/jmp/jnz之前F4,而不是在下一条指令处F4呢?

这里就明确表示了,在 jmp easyre.0041453E处向上跳转时,进行上面一些指令进行解压缩,当满足 jbe short easyre.004145DC条件后跳转的位置时004145DC,而不是jmp下一条指令的位置004145DB,所以,如果直接在JMP下一条指令进行F4,那么程序就会直接跑‘飞’了。

明白这一点后,继续按照上述操作进行向下运行,直到:

到达该条指令处,可以发现当前位置时004146AB,而这条JMP指令跳转的位置是0040DE05,这样就可大致确定,下一个指令处就是源程序的OEP了。

接下来的脱壳方法,就是正常操作了;首先利用LordPE进行镜像修正接着完全DUMP下来,之后利用ImportREC对文件进行修复包括IAT、重定位表等(UPX只需要修复IAT),去掉无效函数后,重新写入就完成了。

(2)AsPack加密壳

进行上述一样的操作,将样本文件进行AsPack加壳(就不贴图了),直接OD就发现一个问题:

这条call指令访问的位置在地址栏处没有显示出来,遇到这种情况,如果F8运行的话,就会出现跑得不知道去哪里的情况,也不能直接F4运行下一条指令,所以进行F7单步步入查看call的函数:

进入函数后正常单步跟踪就行了,当遇到上述情况后,记得F7就行。直到:

当看到这里是,也行有的人不懂,为啥要先PUSH 0040DE05到栈当中去再retn。原理是再调用retn时,程序会调用栈中的栈顶值作为返回的地址,也就是说这里的PUSH加上retn相当于JMP/JNZ等的跳转指令。这里发现跳转的地址与当前的地址相差很大一段,也就是说找到了源程序的OEP入口了。

接下来就是脱壳方法;首先利用LordPE进行镜像修正接着完全DUMP下来,之后利用ImportREC对文件进行修复包括IAT、重定位表等(UPX只需要修复IAT),去掉无效函数后,重新写入就完成了。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值