脱壳之aspack压缩壳

  一般再执行Shell部分代码时,会先保存上下文环境,使用push指令(pushad/pushfd),执行Shell部分代码之后,再使用pop指令(popad/popfd)恢复环境,使堆栈平衡,故使用ESP定律进行简单脱壳。

1.使用OD加载程序,发现pushad指令,判断程序已加壳。
在这里插入图片描述
2.按下F8单步步过,使得程序走到CALL的位置,然后对ESP下断点,再将程序运行起来
在这里插入图片描述
在这里插入图片描述
3.程序断下来的地方即为pop的地方
在这里插入图片描述
4.F8单步步过,找到原始OEP
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
5.在原始OEP处,右键菜单,选择用OllyDump脱壳调试进程
在这里插入图片描述
6.点击获取EIP作为OEP按钮,再点击脱壳按钮将文件转存到磁盘中
在这里插入图片描述
7.不要关闭OD!使用导入表修复工具(ImpREC)对导入表进行修复
在这里插入图片描述
8.选择正在脱壳的进程,不要关闭OD!
在这里插入图片描述
9.修改OEP,并自动查找IAT,获取IAT信息后,获取输入表,再转储到文件,选择之前在OD中dump出的文件进行修复
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
10.使用010Editor关闭随机机制,保存文件
在这里插入图片描述
11.完成此次简单脱壳
在这里插入图片描述

单步跟踪脱壳

  当我们单步跟踪时,第一个遇到的函数是GetModuleHandleA,调用此函数获取的信息是kernel32的基地址
在这里插入图片描述
  继续寻找下一个函数调用GetProcAddress,有了GetModuleHandleA+GetProcAddress两个函数,kernel32模块中的所有函数都可以获取并调用
在这里插入图片描述
此处出现了VirtualAlloc函数,此函数一般与解压解密代码有一定的关联
在这里插入图片描述
又调用了VirtualAlloc函数,查看内部调用发现很繁琐,先分析参数
在这里插入图片描述
分析参数发现这4个参数与我们想要找的解压代码函数类似
有申请的内存地址、代码段大小,步过分析缓冲区,第二个参数中放的就是解压代码
在这里插入图片描述
继续向下分析,发现这一段代码在寻找E8、E9,然后修复E8、E9后面的值,也就是说整个代码段CALL和JMP都会被修复
在这里插入图片描述
观察修复后的值和未修复的值,发现修复后的值是原先的代码,而未修复的值是经过转换的,这个值看起来是为了迎合压缩算法而进行的转换
在这里插入图片描述
经过循环代码进行了解压,并修正了代码,继续向下分析,可以看到这里将解压的代码拷贝到了原始代码段的代码
在这里插入图片描述
拷贝完成后,申请的内存就没有用了,也确实在下面发现了释放内存的函数
在这里插入图片描述
单步发现此段代码在进行循环解压代码、数据等各区段
在这里插入图片描述
继续跟踪发现,代码访问了重定位的区段,分析后发现是在重定位代码
在这里插入图片描述
其中这一行代码是清除重定位信息的,正是有了这行代码,我们在脱壳之后才导致随机基址无法支持,所以在脱壳时,我们应该将这一行代码NOP掉
在这里插入图片描述
继续跟踪后,发现了GetModuleHandleA函数的调用,而GetModuleHandleA->LoadLibraryA->GetProcAddress三个函数连在一起,比较容易能猜出代码功能,从获取模块基址到加载模块,再到获取函数地址,一般情况下修复IAT才会有这样一组操作
在这里插入图片描述
继续分析找到了填充IAT的地方
在这里插入图片描述
此处下断点可以看到IAT函数调用都恢复
在这里插入图片描述
继续跟踪,最后就是修改各区段的内存属性,填充原始OEP,跳转到原始OEP
在这里插入图片描述
在跟踪过程中,我们遇到了重定位相关的代码,并发现有对重定位表清除的操作
在这里插入图片描述
在内存中,大片以3开头的word数据,一般都是基址重定位信息,基址的RVA是16000
在这里插入图片描述
在清除重定位信息的地方下断点,观察寄存器的值和寄存器指向的内容
在这里插入图片描述
可以看出此处在清除重定位表中的数据,将其NOP,此处内容上文已经提到
在这里插入图片描述
基址重定位表的RVA为16000,大小为0xC74
在这里插入图片描述
在这里插入图片描述
将dump出的程序,使用LordPE对数据目录表中基址重定位项进行修改,程序就可以支持随机基址了
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值