恶意代码分析实战—第18章加壳与脱壳

脱壳存根

被加壳程序中的脱壳存根由操作系统加载,然后脱壳存根负载加载原始程序。对于加壳程序来说,可执行程序的入口点指向脱壳存根,而不是原始代码。原始程序通常存储在加壳程序的一个或多个附加节中。

脱壳存根执行了以下三步操作:

1. 将原始程序脱壳到内存中;

2. 解析原始可执行文件的所有导入函数;

3. 将可执行程序转移到原始的程序入口点(OEP)。

尾部跳转

一旦脱壳存根完成脱壳,他就必须转到OEP运行。转到OEP的指令通常被叫做尾部跳转指令(jmp、ret、call)。

书中对于脱壳过程图示如下:

 

Lab18-01.exe

首先利用peid进行查壳

可以看出这是一个被UPX加壳的文件。UPX是一个压缩壳,并不是一个加密壳。

在OD中打开Lab18-01.exe分析: 

可以看出这并不是OEP,而是脱壳存根。为了进行脱壳,我们需要找到尾部跳转从而得到OEP。00409DC0处的指令为pushad,在脱壳存根中为了保持栈平衡,也一定会一个popad的命令。

在OD中查找popad命令,在00409F43处看到jmp指令。

在IDA中定位到00409F43分析:

结果UPX压缩后,IDA不能识别处 00409F43处的有效地址,所以猜测该处的jmp就是尾部跳转指令。

OD中在00409F43处下断点并步过分析:

所以该处既是原始程序的OEP,右键OEP后使用OllyDump插件脱壳:

“重建输入表”取消勾选后点击脱壳。 然后使用ImportREC获取导入表

点击修复转存文件

至此已完成脱壳。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
评论

打赏作者

Sin hx

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值