脱壳之未知加密壳

640?wx_fmt=gif


拿到一个程序之后首先用PEID查看一下有什么有用的信息。

640?wx_fmt=png


只能发现链接器版本是VC6.0。根据经验可以推论出此程序的OEP特征。


平衡堆栈的汇编代码SUB  esp,0x58


第一个调用的函数是:GetVersion()


类似的程序特征如下图。

640?wx_fmt=png


程序入口有标准的pushad/pushfd,使用ESP定律下硬件执行断点。

640?wx_fmt=png


运行之后依次找到pushfd pushad之后,单步几下就会到达oep位置。

640?wx_fmt=png

640?wx_fmt=png


到达程序入口点,ctrl+A进行分析之后发现,第一个函数没有显示Getversion()。推测可能被加密了。

640?wx_fmt=png


壳当中生成加密IAT的步骤是:


  • 获取原始IAT的函数地址,并保存到一定位置。


  • 申请空间,构造新的IAT函数。


  • 原始函数地址填充代码段,构造新IAT函数代码进行加密。


  • 将新构造的函数地址填充到IAT表。


  • 跟进去这个地址查看一下,发现返回值弹出真正的函数地址。

640?wx_fmt=png


设置硬件断点,重新运行程序。

640?wx_fmt=png


断到壳代码中填充IAT表的地方。

640?wx_fmt=png


写入IAT的地方是一个循环,包括获取原始函数地址,函数地址被拷贝到新的代码段中,然后将新的代码段地址写入IAT


首先在填充IAT处,下断点,ctrl+F11,进行run跟踪。

640?wx_fmt=png


获取到原始函数地址。

640?wx_fmt=png


继续往上查看EAX来自于哪。

640?wx_fmt=png


将原始函数地址写入到代码段。

640?wx_fmt=png


我们要做的任务就是把获取原始函数的地址填写到IAT中。


通过写脚本来运行。

//定义变量
VAR dwGetAPIAddr
VAR dwSetIATAddr
VAR dwOEP
VAR dwTep

MOV dwGetIATAddr,001D0474    // 获取 API 地址的地方    
MOV dwSetIATAddr,001D0897  // 填充 IAT 的地方
MOV dwOEP, 0047148B            // OEP

//去除断点
BC
BPHWC
BPMC

// 设置断点
BPHWS dwOEP, "x"
BPHWS dwGetIATAddr,"x"
BPHWS dwSetIATAddr ,"x"



//构造循环
LOOP1:

RUN   //运行程序


//判断是否是获取API的地方
cmp eip, dwGetAPIAddr
JNZ SIGN1

mov dwTep,eax          //将原始函数地址用一个临时变量保存
jmp LOOP1

//判断是否是填充API的地方
SIGN1:

cmp eip, dwSetIATAddr
JNZ SIGN2

mov [edx],dwTep           //将原始函数地址写入IAT表
jmp LOOP1

//判断是否为OEP
SIGN2:
cmp eip, dwOEP          //到达OEP处退出
JZ EXIT

jmp LOOP1

//结束
EXIT:
MSG "IAT解密完成"


脚本运行成功界面:

640?wx_fmt=png


最后需要dump文件,修改输入表。

640?wx_fmt=png


运行成功界面。

640?wx_fmt=png


640?



- End -


640?wx_fmt=png

看雪ID:Jabez                              

https://bbs.pediy.com/user-825190.htm


本文由 Jabez 原创

转载请注明来自看雪社区


640?

热门图书推荐:

640?立即购买!


看雪学院官方QQ群

640?wx_fmt=png

QQ:953174865


欢迎入群交流!


热门技术文章:        




640?

公众号ID:ikanxue

官方微博:看雪安全

商务合作:wsc@kanxue.com

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值