当我们脱完壳后发现,程序提示被非法修改,我们知道它是有自校验的。在平时工作中,我们脱完壳修复完毕而且如果有附加数据加上附加数据之后,如果还是没法将程序跑起来,那么我们在保证没有找错OEP的前提下,就需要考虑程序设置了自校验。对于程序存在的自校验,我们可以打开我们脱壳后的程序和未脱壳的程序进行对比,先将未脱壳的程序操作找到真正的OEP,然后开始同步F8对比,看它们的跳转是怎么进行的。
下面是一个程序的自校验分析:
对于这次的自校验,我们通过观看教学,知道需要在CreateFileA下断点,然后进行运行对比分析。那么我们在自己做的时候,并没有使用这个函数而是单步比对,然后发现他们前期步骤都一样,只是在经过一些运算之后,ESI 和 EDI的值不太一样,而且再运行几行以后,发现寄存器中的值大多都不一样了,但是,要注意的是,即使我们发现寄存器的值不一样,但是我们的运行代码和跳转与否是一致的,那么,我们发现在经过一个call之后,程序就会跑飞,那么,在这个call中肯定暗藏玄机,我们就需要进到这个call中去看一下,进去以后,我们发现,他是有一段代码,里面有着运行正常和非法修改的提示,然后我们单步跟,发现在一个call之后,出现了一个test eax,eax ,然后程序会在后面的一个跳转发生变化,根据我们的查看可以发现,这里eax需要为1,那么,我们对这个call可以直接非法修改掉,比如说直接改为mov eax,1,经过保存,我们发现可以正常执行。
MD5自校验 :
将程序的一部分代码或者全部代码进行MD5计算,得出MD5的值,然后再在程序中进行比对,达到保护效果。
大小自校验 :
这个应该是应用于程序加壳之后的自校验,因为现在的壳一般是压缩和加密两个功能兼备,这就导致加密壳破解掉以后程序的大小也会发生相应的变化,那么通过比对自身的文件大小,就可以判断程序是否被破解。
那么,我们可以将未脱壳程序的空字节代码进行一点点的修改,然后再次运行程序,发现无法运行,那么,它就是程序的MD5自校验了。