程序去自校验方法

什么是自校验:

意思是这些程序会检查自己有没有被修改,如果发现被修改的话,便会离开或进行其它动作。基本的校检方法包括 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 不等于时转移
在这里插入图片描述
保存后,运行程序,显示正常运行,去除自校验成功。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43916678/article/details/95938115
今日推荐