-
-
[原创]脱壳之aspack压缩壳
-
发表于: 2022-1-4 16:26 22273
-
1. 寻找原始OEP
2. dump内存到文件
3. 修复文件
1. 堆栈平衡法(ESP定律)
壳代码就像一个函数,进入时会开辟堆栈、保存寄存器环境,退出时会恢复堆栈、恢复寄存器。所以应该是堆栈平衡的,那我们可以在壳代码操作了堆栈后对堆栈设置访问或写入断点,然后运行程序,当断点命中的时候,应该就是退出壳代码的时候。在其附近单步几次,应该就能到达程序的原始OEP。
2. 特征定位法
在我们熟悉的程序中,我们可以使用特征来定位程序原始OEP。特征有几种:
① 二进制特征
比如release版的VS2013是:
oep入口特征:E8????????E9
第一个CALL内的特征:5657BF4EE640BBBE0000FFFF3BC7
注意:搜索特征应该在程序解密之后再搜索,一般让程序跑起来,在程序代码段开始处搜索,使用Ctrl+B搜索二进制
② API特征
比如release版的VS2013的第一个API调用是:
GetSystemTimeAsFileTime
比如vc6.0的第一个API调用是:
GetVersion
比如Delphi程序第一个API调用是:
GetModuleHandleA
③编译器特征
IAT调用不同的编译器生成的调用机器码是不一样
vs -》 call [IAT地址] -》 FF15 xx xx xx xx
delphi -> jmp [IAT地址] -》 FF25 xx xx xx xx
3. 单步跟踪法
一般再执行Shell部分代码时,会先保存上下文环境,使用push指令(pushad/pushfd),执行Shell部分代码之后,再使用pop指令(popad/popfd)恢复环境,使堆栈平衡,故使用ESP定律进行简单脱壳。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- [原创]勒索病毒分析之WannaCry 11494
- [原创]脱壳之aspack压缩壳 22274
- [原创]经典病毒分析——熊猫烧香 17473
- [原创]经典扫雷游戏破解实现 13750
- [原创]脱壳之带反调试的PESpin壳 34772