今天我们就掌握一下怎么去除自校验,软件是一个网吧注册工具,看了下只要修改一处自校验就可以让程序正常运行,所以拿出来做实例,有些厉害的自校验强度又大而且有多重不同自校验,以前有个一个crackme,居然有10处自校验,够变态的。
一: 实例问题解决之去除自校验(文件大小自校验)(实现未实现的跳)
看操作吧。
当然进行下面的而操作前提是你的先脱壳并修复,运行后没反应。
1. 对比法。
①:源程序和脱后的进行跟踪比较,找到不同的条件跳。原程序调试到OEP,和脱壳后的程序载入OD,然后慢慢向下跟踪调试,检查条件跳转是否跳转(如:cmp eax,1117004 语句)。其中eax中存放的是程序自身的大小,eax小于1117004则跳。那么我们可以查看脱后文件的大小(以字节为单位),将1117004该为脱后大小+N(以满足条件跳,小于则跳),注意修改前后要保持位数一致,多的去掉后面的。汇编后保存即可。
②:可以手动实现为实现的跳,及该条件跳转为无条件跳CMP
如:
该CMP 下的jle为JMP 保存即可
2. 找ExitProcess函数
F9运行程序,让程序跑飞。在堆栈窗口到到ExitProcess得下面第一个返回,右键在反汇编窗口中跟随,这样就直接来到了要修改大小的下面附近,然后用方法一改大小即可。用这种方法的好处就在于不用对比得到校验大小的地方,但此法仅限于文件大小自校验。
原理分析:
1: 005E5D4D . E8 663DF5FF call Unpack_.00539AB8
2: 005E5D52 . 3D 00171100 cmp eax,111700
3: 005E5D57 . 7E 05 jle short Unpack_.005E5D5E
4: 005E5D59 . E8 52F3E1FF call Unpack_.004050B0
5: 005E5D5E > 8D55 E4 lea edx,dword ptr ss:[ebp-1C]
6: 005E5D61 . A1 00F75E00 mov eax,dword ptr ds:[5EF700]
F9运行后跑飞后会运行到程序设计的如果校验失败则调用的函数中(call Unpack_.004050B0),一般在该函数中会调用ExitProces函数退出程序。