用PEID查壳为未知壳,如图。
用ESP定律尝试,可直接到OEP,用loadpe先完整转存,再用ImportREC修复IAT,在修复过程中发现最后一行invalid,直接先删除掉。
打开修复后的文件,弹出错误对话框,如图:
1,初步考虑为刚刚删除掉的无效IAT有问题,初步跟踪,没有发现特别之处。
2,对出错点下断点,发现出错的原因为该内存块没有被分配导致(由OD的MODULE块可看出无该内存块)。 结合之前的无效IAT分析,推论出该壳在启动后在解压代码后还hook了部分原有软件代码,并且分配了几块内存区块供其使用。 为什么不是在hook代码中再分配或更改内存块呢,因为解压后的代码我已经完整转存,如果是hook的代码中分配或更改就不会有该错误了。
3,用loadpe把该内存块部分转存到硬盘中,然后再在PE编辑器中把该内存块导入段中,注意把该段的虚拟地址编辑成与原有内存块的虚拟地址一致。
4,再次打开,可以成功打开。 查壳为VC++6.0。
脱完壳后对程序进行跟踪并尝试patch,大略流程如下:
1,0065886A 此处为第一次获得机器码(根据硬盘和网卡ID等) ,可直接断在0065886F,然后更改返回值为要patch的机器码。
2, 006588EB 此处位获得激活码位置,可直接断在006588F0 ,然后更改读回的激活码。
3,进行完第一轮验证后,系统在打开时会再次验证。007F3B41 此处为再次获取机器码可直接断在007F3B47 ,然后把返回值更改为需要patch的机器码。
patch后,程序正常进入欢迎界面。
对无壳文件直接PATCH,用对加壳文件进行loader patch,这些体力活就不说了。