什么是自校验:
意思是这些程序会检查自己有没有被修改,如果发现被修改的话,便会离开或进行其它动作。基本的校检方法包括 checksum, 检查大小, 检查跳转代码,等等。
什么情况下考虑自校验:
当一个程序脱壳前可以正常运行,脱壳以后不能运行,修复以后也不行,程序不能运行或者闪退、弹窗提示错误等,我们就要考虑是不是因为程序有自校验了。
自校验破解思路:
将脱壳前和脱壳后的程序分别单步运行,对比找出关键跳转。
实验步骤:
首先尝试运行程序,显示“正常运行”窗口。
PEiD查壳,发现被加了ASPack壳。
放进OD里,用ESP定律法脱壳,单步,数据窗口跟随当前ESP值,设置硬件访问断点,运行到断点处,单步运行到程序OEP,脱壳、保存。
脱壳后,放进PEiD,显示无壳
运行程序,显示被非法修改
这时就要考虑自校验,把脱壳后的程序发送到OD,原始程序脱壳完停留在OEP的界面不要关,我们来对比原始程序和脱壳完成的程序。
在命令输入 bp CreateFileA,定位到kernel32的CreateFileA函数
CreateFileA是一个多功能的函数,可打开或创建以下对象,并返回可访问的句柄:控制台,通信资源,目录(只读打开),磁盘驱动器,文件,邮槽,管道。
两边都对这个函数下断点,然后运行到断点处,再执行到用户代码。
接下来单步运行,对比脱壳前后两个程序的跳转。
在0040120C处出现不同的跳转情况。
脱壳前(源程序找到OEP):
脱壳后:
修改方法有很多种:
1、nop替换:
2、修改汇编语言:
若当前eax的值与ss:[ebp-0x8]相等,跳转实现
JE/JZ 等于转移
JNE/JNZ 不等于时转移
保存后,运行程序,显示正常运行,去除自校验成功。