简介
首先了解下什么是壳,可以理解程序的正常代码是放在壳里的,当运行程序的时候代码执行流程,是先经过壳最终执行正常代码,一般来说加了壳的程序等于没什么用,因为程序运行后依然会释放真正的代码,打个比方:运行程序那么在内存中就还原了正常代码。
ESP 定律脱壳
这里用压缩壳进行演示,以下是 upx、aspack 工具脱壳与手动脱壳步骤。
工具脱壳 - UPX

可以发现程序加了 upx 压缩壳,工具也提示可以用 upx -d 命令进行脱壳。
upx -d main.exe手动脱壳 - UPX

打开 x64dbg 动态调试工具导入程序,它会自动定位到程序的原始入口点(Original Entry Point, OEP),可以看到有个 pushad ,用来把所有通用寄存器的值压入堆栈,就是那8个通用寄存器 EAX,EBX ... ,现在用 esp 定律进行脱壳。

运行 F8 快捷键,运行到 pushad 下面,这时候光 esp 有红色。

右键 esp 栈顶指针寄存器,选择 "在内存窗口转到",注意左下角内存区域窗口。

在这内存里下硬件访问断点,这里我选择了 字节 也可以是其他,只要下了就行。
这个时候按 F9 运行,这个时候就断下来了,这个时候只需要按 F8 步过,一直往下就能找到。

然后用 x64dbg 自带的插件,scylla 进行脱壳,可以发现脱出 upx1 变成 upx0 那么就已经成功了。

手动脱壳 - Aspack

可以发现已经加了 aspack 壳,这种压缩壳也是可以用 esp 定律进行脱壳。

用以上同样的方式进行脱壳,脱压缩壳通用是完全没有问题的。
UPX变异壳

只要把 55 50 58 21 改为 2E 62 73 73 那么对应的 ASCII UPX! 变为 .bss, 再用 UPX -d 就无法进行脱壳,只要是名称都可以在里面抹除的,不会影响到程序正常运行。
评论 (0)