学无止境

-------至弱即为至强!

导航

新版aspr脱壳方法

Posted on 2005-11-16 13:58  赵国亮  阅读(391)  评论(0编辑  收藏  举报

新版ASPR的加壳方法有了一些变化,用工具是脱不了了,所以写了这个,给大家一个简单的解决方案.
用OD载入,BP IsDebuggerPresent,F9,停了下来:
77E52740 > 64:A1 18000000 MOV   EAX, DWORD PTR FS:[18]
77E52746   8B40 30     MOV   EAX, DWORD PTR DS:[EAX+30]
77E52749   0FB640 02     MOVZX EAX, BYTE PTR DS:[EAX+2]
77E5274D   C3         RETN

F8,到RETN之前这一行,看看[EAX+2],我是7FFDF002=01,
重新载入,把7FFDF002值改为0(这样可跳过ASPR对程序级调试的检查),F9,这时有异常会停下来,这时就用SHIFT+F9过,大约30次左右,你可看到这样的代码
00C23D5F   3100         XOR   DWORD PTR DS:[EAX], EAX
00C23D61   64:8F05 0000000>POP   DWORD PTR FS:[0]
00C23D68   58         POP   EAX
00C23D69   833D BC7EC200 0>CMP   DWORD PTR DS:[C27EBC], 0
00C23D70   74 14       JE     SHORT 00C23D86
00C23D72   6A 0C       PUSH   0C
00C23D74   B9 BC7EC200   MOV   ECX, 0C27EBC
00C23D79   8D45 F8     LEA   EAX, DWORD PTR SS:[EBP-8]
00C23D7C   BA 04000000   MOV   EDX, 4
00C23D81   E8 8ED2FFFF   CALL   00C21014
00C23D86   FF75 FC     PUSH   DWORD PTR SS:[EBP-4]
00C23D89   FF75 F8     PUSH   DWORD PTR SS:[EBP-8]
00C23D8C   8B45 F4     MOV   EAX, DWORD PTR SS:[EBP-C]
00C23D8F   8338 00     CMP   DWORD PTR DS:[EAX], 0
00C23D92   74 02       JE     SHORT 00C23D96
00C23D94   FF30         PUSH   DWORD PTR DS:[EAX]
00C23D96   FF75 F0     PUSH   DWORD PTR SS:[EBP-10]
00C23D99   FF75 EC     PUSH   DWORD PTR SS:[EBP-14]
00C23D9C   C3         RETN
这是典型的ASPR的最后一个异常。(两个JE加个RETN),这时不要SHIFT+F9了,不然程序会运行的。要用SHIFT+F7进入。这时会停在系统空间。用ALT+M打开MEMORY MAP,找到SYSTEM CLEAN所在的位置,第一个SECTION如下.
Address   size       section     contains
00401000 00161000             code
在上面这个地方“右键—>set memory breakpoint on access"下个内存断点.然后F9运行,呵,你可发现,我们已经从壳的迷宫走出来了,(这个方法,再也不用象以前那样小心翼翼的F8F7了.)程序停在这:
00407278 - FF25 2CF35600 JMP   DWORD PTR DS:[56F32C]
0040727E   8BC0         MOV   EAX, EAX
00407280 - FF25 28F35600 JMP   DWORD PTR DS:[56F328]
00407286   8BC0         MOV   EAX, EAX
00407288 - FF25 24F35600 JMP   DWORD PTR DS:[56F324]
0040728E   8BC0         MOV   EAX, EAX
00407290 - FF25 20F35600 JMP   DWORD PTR DS:[56F320]
00407296   8BC0         MOV   EAX, EAX
00407298   50         PUSH   EAX
00407299   6A 40       PUSH   40
0040729B   E8 E0FFFFFF   CALL   SystemCl.00407280
004072A0   C3         RETN
这并不是程序的真正入口(入口位还远呢,这是ASPR的新特点),但是它给我们提供了一个很有用的信息,那就是IAT的位置(新版SAPR无法用importREC自动搜索IAT了),所以我们可以先 D 56F32C,让内存区定位在这里,去掉内存断点,F8,又回到壳中,不过没关系再按几下F8就又可从壳中回来的,回来后我们来到这:
0040734D   A3 68B65600   MOV   DWORD PTR DS:[56B668], EAX     ; SystemCl.00400000
00407352   A1 68B65600   MOV   EAX, DWORD PTR DS:[56B668]
00407357   A3 D8205600   MOV   DWORD PTR DS:[5620D8], EAX
0040735C   33C0         XOR   EAX, EAX
0040735E   A3 DC205600   MOV   DWORD PTR DS:[5620DC], EAX
00407363   33C0         XOR   EAX, EAX
00407365   A3 E0205600   MOV   DWORD PTR DS:[5620E0], EAX
0040736A   E8 C1FFFFFF   CALL   SystemCl.00407330
0040736F   BA D4205600   MOV   EDX, SystemCl.005620D4
00407374   8BC3         MOV   EAX, EBX
00407376   E8 75D8FFFF   CALL   SystemCl.00404BF0
0040737B   5B         POP   EBX
0040737C   C3         RETN
到这里我们要做3件事:
1.拿出LOADPE,把这个东东从内存DUMP出来DUMPED.EXE.
2,记下EBX的值560d08.
3,先修复好引入表,修复方法如下:
看看内存区在56f32c一块(别不记得为什么在这里了,上下找找,很快就可发现IAT的位置:56F21C--->56FBA4,大小为56FBA4-56F21C=988,
打开importREC,选中程序IAT的RVA填入16F21C,size:988,按下"获得输入信息",这时可找到一些指针,但还用很多无效,按"显示无效--->追踪层次1(分解),可修复大部分指针,还有一些得手动了,不过我发现用新版的ASPR插件竞可以全部修复(试了几个都可以,所以也就偷懒了,用ASPR插件修复,还有几个无效的指针其实是垃圾把它们CUT了(看看它们的值就知道是不是垃圾了).然后FIX DUMPED.EXE为DUMPED_.EXE.
下面就是修复入口处了.

回到原程序.按几下F8,过了RETN我们就来到程序入口了.
005613DF   0000         ADD   BYTE PTR DS:[EAX], AL
005613E1   0000         ADD   BYTE PTR DS:[EAX], AL
005613E3   0000         ADD   BYTE PTR DS:[EAX], AL
005613E5   0000         ADD   BYTE PTR DS:[EAX], AL
005613E7   0000         ADD   BYTE PTR DS:[EAX], AL
005613E9   0000         ADD   BYTE PTR DS:[EAX], AL
005613EB   E8 4C5FEAFF   CALL   SystemCl.0040733C
005613F0   FF15 84A15600 CALL   DWORD PTR DS:[56A184]         ; SystemCl.005608F0
005613F6   E8 BD39EAFF   CALL   SystemCl.00404DB8
005613FB   90         NOP
程序是停在5613F0,可以断定前面的CALL已运行过了.而且入口处和以前一样被
改成了0,我们要把它补回,但是新版入口的代码似乎不好找(如果谁发现更好的方法告诉我一声:-),不过看这个特点
是用D7写的,D7的代码特征是
PUSH EBP
MOV EBP,ESP
ADD ESP -10(也可能是ADD ESP -0C)
MOV EAX,******
所以只要找出最后这一句MOV,EAX,******,中的*****值就可以补回去了,还记得开始要大家记做的EBX的值560D08吗,它就是这里的值.这样我们就可以打开DUMP出并已经修复引入表的程序DUMPED_.EXE,把这一段代码补回去了,补完后是这样
005613E0 > $Content$nbsp; 55         PUSH   EBP
005613E1 . 8BEC       MOV   EBP, ESP
005613E3 . 83C4 F0     ADD   ESP, -10
005613E6 . B8 080D5600 MOV   EAX, jjjj_.00560D08
005613EB . E8 4C5FEAFF CALL   jjjj_.0040733C
005613F0 . FF15 84A15600 CALL   DWORD PTR DS:[56A184]         ; jjjj_.005608F0
005613F6 . E8 BD39EAFF CALL   jjjj_.00404DB8
保存后用LOADPE把入口点改成1613e0,OK,程序可以运行了.脱壳完成