ASPR1.2主程序简单分析
半年没玩破解了,手都生了,赶上经济危机正郁闷中。无聊啊,继续从从基础开始学~~ASPR 1.2的版本,大家都会脱,大概25次异常后,内存镜像F2下断,然后F9就到OEP ,然后就是转储修复IAT了,IAT有不少无效,等级1+插件搞定,有时候如果还有一个搞定不了就直接填GetProcAddress,最后修复的程序不能运行,对照原版跟一下,发现访问了壳中的地址,该处是一个ret指令,所以随便找个ret指令的地方将他写到对应的数据中,或者直接将那几个CALLNOP掉。比起来还是第一种简单些。
我等菜鸟只知道怎么去脱不去分析他怎么会进步呢?就试着用OD跟了下。下面是粗略分析
OD载入后一般是见CALL就进,F8就可能会跑飞到异常处。其实这时壳实际已经做了很多工作。
F7跟进,经过耐心的单步跟踪一会就到了IAT处理的部分。
00DD7488 8BB5 612A4400 mov esi, dword ptr
00DD748E 8B95 D8304400 mov edx, dword ptr
。。。中间部分就是IAT处理部分代码,在数据窗口中可以看到API的地址
00DD759D 83C6 14 add esi, 14
00DD75A0 8B95 D8304400 mov edx, dword ptr
00DD75A6^ E9 EBFEFFFF jmp 00DD7496
前面可以参考UnPacKcN 小娃崽的文章。
先弄一份IAT数据放这里备份。(这里解出来的API只有44个,很多没解出来)
不久就到了第一次异常。
看堆栈在SE句柄处下断后,忽略异常可以运行到那,然后SHE处理程序将EIP+2,再就是将调试寄存器清0。实际上EIP就成了下面的JMP的地址,所以在这里下断也可以断下来。
后面还有很多SHE,另外的没去仔细跟踪。继续跟踪,大概是跳过25异常后就到OEP了。这时候用ImportREC修复发现有很多无效。
从00466118开始很多无效(这里用等级可以修复)。可以下向该地址下内存写入断点,也可以对GetProcAddress下断,如果一开始程序载入的时候就下这个断是不行的。经过多次跟踪终于找到了大致位置。在第15次SHE处理程序里:
00DEF454的这个CALL就是关键点跟进去看看。
在内存中可以找到它留的很多记号,一般他读出来的结果就是5或1。如果 BL的值5就会加密,1不加密。后面的解释将API的字符串解到堆栈然后定位地址,再将字符串清0.
如果我们直接将jb让他跳下来不行的,他后面还要校验其他寄存器的值。我们这里可以把
00DEF4D5处的CALL NOP掉,然后F9 发现API地址全部就出来了,然后一路欢呼SHIFT+F9往下走。结果程序就挂了。程序有内存校验。想了下,把他NOP掉后,解出API后 到下一个异常前将这里NOP掉的CALL恢复。经过这样处理,程序正常到达OEP。
然后用ImportREC修复有一个无效,不需要用等级1修复。这个无效就是GetProcAddress.
这里解出来的API有357个,前面那些只有44个,我想应该有点问题哈。
简单的分析了下,水平有限,分析得不对的地方还希望高手多多指教。另外感谢hyperChem的指点和鼓励
[ 本帖最后由 hyperchem 于 2009-3-10 19:28 编辑 ] sf 啊/:good 学习一下。 学习一下。。。
页:
[1]