mayl8822 发表于 2008-9-25 18:29

手工脱ASPR壳的一点思路

我就简单的把脱壳的思路讲一下吧!
一,经过ASPR加壳的程序采用了以下几种反脱壳的手法:
1,破坏引入表。
2,把程序中的一部分代码移到壳的空间中。这个空间在WIN98上的地址在:80000000以上。在WINXP上的地址为:00F00000~01XXXXXX处。
3,花指令加异常等ANTIDEBUG手法,让跟踪的难度加大。
4,用注册码来解码,解码的数据在程序运行中要用到。没有正确的注册码就不可能解出正解的程序代码来。
二,对付上面几种反脱壳的方法:
1,修复引入表。
如果一个程序未被加壳的话,它的API函数调用一般是这样子的:
CALL 00412345
在00412345处的代码如下:
00412345JMP 这个004XXXXX处保存的数据就是函数的地址。(一般是WINXP:FFXXXXXXXX,WIN98;BFXXXXXXXX),但是在被加壳的程序中这个数却不是API函数的地址,而是在壳的空间中。我们所要做的就是把004XXXXX中的数据还原。
在加壳的程序中,它自己会模拟操作系统来重定位API函数的地址。一般来说要用到GETPROCADDRESSA这个函数来获得API函数的地址。在得到 了API函数的地址后,它并没有把函数地址填入到004XXXXX中去,而是把它保存到壳的空间中,并且把这个函数在壳中的地址填入到004XXXXX中去。我们要想知道API函数的正确名字就要拦截在程序调用GETPROCADDRESSA的地方。这个地方也就是在程序写引入表数据的地方。如何才能找到程序写引入表数据的地方呢?
我们先在程序运行出现窗口后DUMP出主程序。反编译这个DUMP程序。找到JMP
JMP
JMP
JMP
。。。。。。。。,这样子的地方很好找的,一长串的JMP连着的就是了。我们记下004XXXXX中的值。回到OLLYDBG中载入加壳的程序,下断点
BPM 004X0000,接下来不停的按SHIFT+F9,
当我们停在MOV ,EAX这样的指令处,看EDX中的值为004XXXXX。这个地方就是程序写引入表的地方了。这个时候EBP-101处就是函数名,
EBP+C处就是DLL名,我们可以用SMC的技术自己编一个程序来把函数名和DLL名保存下来,得到一个正确的引入表。(这个程序我已写好了。大家只要输入MOV ,EAX处指令地址就可以得到正确的引入表。)原理就是这样子的。没有例子,如果大家对引入表有了解的话,应该容易理解。

二,对于程序代码在壳中的解决。
我推荐大家用WINXP,正如前面所说的壳的空间在WINXP上在00FFXXXX处,在WIN98上在80000000处。我们可以把这部分的代码用LORDPE来DUMP出来,并把它贴到DUMP主程序中去,并把这并且部分代码的RVA改成00FFXXXX-400000。如果你是WIN98这样做就会程序非法,因为程序映射的空间太大。所以我推荐大家用WINXP或WIN2000。
页: [1]
查看完整版本: 手工脱ASPR壳的一点思路