加密与解密——软件保护方式

软件保护方式:

:外壳程序先于原有程序运行,在内存中解密还原原始程序后恢复原始程序的执行。

压缩壳
加密壳
虚拟机保护:将已知程序代码翻译虚拟机自定义的字节码,然后再虚拟机中执行程序。给跟踪程序带来难度,但是增加了程序的体积,同时降低了程序的运行效率

脱壳过程

  1. 保存入口参数
  2. 获取API地址
  3. 解密区段并还原
  4. 重建IAT表
  5. 重定位项处理
  6. HOOKAPI
  7. 跳转至OEP

查找OEP
跨区段(外壳段跳到分配的段,再跳到原程序段)
内存访问断点(外壳程序解压.text段需要访问访问.text内存区域,跳回OEP时再次访问.text节)

堆栈平衡原理(ESP定律)
外壳程序在运行前需要保存栈帧信息,在释放出原程序之后,会恢复栈帧信息,而大多数程序的第一条汇编语句是push操作,会向ESP所指向区域写入数据,那么在程序运行前在ESP处设置内存访问断点,当程序再次访问ESP处时,表明即将进入OEP。

重建输入表:
加壳时,源程序的输入表会被加壳程序破坏。在进行脱壳时需要重建。重建输入表的原理如下:

首先通过dump的内存程序映像,识别出IAT表(识别方法为通过call指令的跳转进行查找,IAT表中数据为连续的函数地址,不同dll的函数地址以00隔开)。

识别出IAT表后,在dump程序中构造出输入表的IMAGE_IMPORT_NAME struct,包含加载的dll名称和引入的函数列表,然后填充一个 IMAGE_DATA_TRUNK结构充当INT表,INT表的内容根据上面的结构体进行创建.

最后,构建IID数组,依据以上内容填充数组内容,并将firsttrunk 指向原来的IAT,originalfirsttrunk指向刚才创建的INT表,同时将INT表的内容拷贝至IAT表
以上工作完成之后,修改PE头中的输入表地址,这样在加载器加载PE文件时会根据上述内容重新构建IAT表内容

DLL重定位表的构建:
根据OEP识别出源程序区段,并通过引用重定位数据的指令处下断点的方式,找到外壳程序进行重定位的代码。并在重定位处加入补丁代码,获取到需要重定位的所有条目的RAV。然后通过ReloREC程序将这些重定位条目的RAV写入到dump.dll中重定位表中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值