Aspack脱壳

对这里一直有点模糊,稀里糊涂的解决了,全部推到来一次吧

前期准备

  • PE Tools

  • demo.exe

  • ida8.2

  • ImportREC

  • Aspack

  • 010editor

源代码:

1
2
3
4
5
#include"stdio.h"
int main(){
printf("hello world!");
return 0;
}

分析加密变化

image-20240327221625795

在文件可选头可以发现主要是EP和SizeOfImage发生了修改

image-20240327222112344

除此外文件新加了两个节区(这个用010editor模版直接看还看不出来,可能软件设置问题)

脱壳

算法流程

源程序 加壳程序
断点在EP(_mainCRTStartup) 断点在EP(start)
进入main函数
main函数执行完退出回到_mainCRTStartup
_mainCRTStartup执行结束
  • _mainCRTStartup由编译器提供的函数,根据编译器的不同也可能是start函数,作用是初始化运行时库,用户的主函数区为main

_mainCRTStartup

ESP定律

利用堆栈平衡,当popad压入的寄存器数据时,对这些数据进行硬件访问断点,至于为什么不是内存断点,我试过停不下来,可能是因为内存断点每次标记的是一个页,对于这个页上所有的内容程序遇到后就会暂停,然后又会去判断是不是要求的,然后就卡死在里面了吧,然后栈的所在页比较特殊,就。。只是一种猜测


oep

当pushad执行后对堆栈的数据下硬件访问断点,可以看到此时已完成解密,恢复基本数据,往oep出发

ret后发现回到了原始OEP

image-20240328003351050

dump

主要修改入口点,其他可以暂时不管,这样可以直接将内存解密好的文件重新装回新的exe

image-20240328004953895

IAT表修复

  • 先使用ImportREC修改OEP,然后自动寻找IAT
  • 将找到的IAT放入刚dump文件

image-20240328010514184

修补前后修补后的运行如图

image-20240328010639220

总结

很好,以后别想再难住我了,对硬件断点和内存断点理解的也更深了✌️