对Asprotect v1.1的手动脱壳的一点分析
【声明】
我写文章以交流为主,希望大家在转载时能保持文章的完整性。
【前言】
由于r!sc已经写出了脱壳机rAD.exe,所以写此文实在没有多大意思。看此文说实话还不如去看rAD.exe的源代码更有意义。
样例文件: Asprotect.exe (Asprotect v1.1的主程序)
加壳方式: Asprotect v1.1
目标: 手动脱壳
作者: ljttt
写作日期: 2000-10-13
1、首先,启动PEEditor,打开Asprotect.exe文件,得到对我们有用的信息。
Image Base : 400000
Size of Image : 9E000
2、Ctrl-D进入SoftICE,下断点
bpint 3
3、单击break'n'enter,单击Run,将中断在第一条指令处,此时我们按照提示输入如下指令
eb eip 60
这样,就修改了入口的代码由 CC 改为 60。这样屏幕显示如下:
015F:0048F001 60
PUSHAD
<--第一条指令处
015F:0048F002 E9D9040000 JMP
0048F4E0
015F:0048F007 2BD4
SUB EDX,ESP
015F:0048F009 ED
IN EAX,DX
015F:0048F00A AC
LODSB
4、跟踪一段,我们可以到达如下地方:
015F:0048F58A 81EE02000000 SUB
ESI,00000002
015F:0048F590 81DB91D657C9 SBB
EBX,C957D691
015F:0048F596 0FBFEB MOVSX
EBP,BX
015F:0048F599 81FFE6C50868 CMP
EDI,6808C5E6
015F:0048F59F 0F8588FFFFFF JNZ
0048F52D
015F:0048F5A5 BA4166DFBC MOV
EDX,BCDF6641
015F:0048F5AA E928FFFFFF JMP
0048F4D7
<--此处将跳走
从跟踪的情况来看,我觉得这里应该说用到了"花指令"和"变形引擎"两种技术。原来我设想的"变形引擎"会出现在加壳软件中,看来现在"如愿"了。这也说明加壳软件在不断地提高反跟踪的技术。看来我也得多下苦功了。不然,以后只有用用别人写的脱壳机的份了。
5、继续跟踪到如下一段时:
015F:00C260DD 8BC8
MOV ECX,EAX
015F:00C260DF 8DBD452A4400 LEA
EDI,[EBP+00442A45]
015F:00C260E5 8BB575294400 MOV
ESI,[EBP+00442975]
015F:00C260EB F3A4
REPZ MOVSB
<--此处是SMC技术的运用。将修改后面的代码。
015F:00C260ED 8B8575294400 MOV
EAX,[EBP+00442975] <--这里的代码将被修改
015F:00C260F3 6800800000 PUSH
00008000
015F:00C260F8 6A00
PUSH 00
015F:00C260FA 50
PUSH EAX
015F:00C260FB FF957D294400 CALL
[EBP+0044297D]
015F:00C26101 8D0E
LEA ECX,[ESI]
015F:00C26103 85512C TEST
[ECX+2C],EDX
015F:00C26106 44
INC ESP
015F:00C26107 07
POP ES
015F:00C26108 50
PUSH EAX
015F:00C26109 C3
RET
这是执行REPZ MOVSB指令以后的代码
015F:00C260E5 8BB575294400 MOV
ESI,[EBP+00442975]
015F:00C260EB F3A4
REPZ MOVSB
015F:00C260ED 8B8575294400 MOV
EAX,[EBP+00442975] <--这是修改后的代码
015F:00C260F3 6800800000 PUSH
00008000
015F:00C260F8 6A00
PUSH 00
015F:00C260FA 50
PUSH EAX
015F:00C260FB FF957D294400 CALL
[EBP+0044297D]
015F:00C26101 8D85512C4400 LEA
EAX,[EBP+00442C51]
015F:00C26107 50
PUSH EAX
015F:00C26108 C3
RET
6、继续跟踪到如下:
015F:00C265B8 5B
POP EBX
015F:00C265B9 0BDB
OR EBX,EBX
015F:00C265BB 8985112F4400 MOV
[EBP+00442F11],EAX
015F:00C265C1 61
POPAD
015F:00C265C2 7508
JNZ 00C265CC
015F:00C265C4 B801000000 MOV
EAX,00000001
015F:00C265C9 C20C00 RET
000C
015F:00C265CC 689C0EC200 PUSH
00C20E9C
<--这个00C20E9C的地址也是程序用SMC的方式得到的
015F:00C265D1 C3
RET
<--我们将到此处
7、在 RET 指令后将到如下一段代码处:
015F:00C20E9C 55
PUSH EBP
015F:00C20E9D 8BEC
MOV EBP,ESP
015F:00C20E9F 83C4F4 ADD
ESP,-0C
015F:00C20EA2 E88922FFFF CALL
00C13130
015F:00C20EA7 0F855F2FFFFF JNZ
00C13E0C
015F:00C20EAD E81634FFFF CALL
00C142C8
015F:00C20EB2 E8917BFFFF CALL
00C18A48
015F:00C20EB7 E86489FFFF CALL
00C19820
015F:00C20EBC E8BFACFFFF CALL
00C1BB80
015F:00C20EC1 E8462FFFFF CALL
00C13E0C
<--在这里,我们要按F8进入,否则程序将执行完毕
015F:00C20EC6 8BE5
MOV ESP,EBP
015F:00C20EC8 5D
POP EBP
015F:00C20EC9 C20C00 RET
000C
8、在 CALL 00C13E0C 处我们按 F8 键进入,此时我们不需要再继续直线跟踪下去了。因为如果你看了rAD.exe的源代码说明就知道,这不过是在DLL中的程序段中,由于DLL的入口函数部分没有什么实际意义。所以继续直线跟踪下去,只会花费我们大把大把的时间,这是有几种方法继续跟踪,看过rAD.exe的源代码后,就可以知道我们可以如下方式设断点。首先搜索特征代码,然后在特征代码处设断点继续跟踪。
第一种:
s eip l ffffffff 51,89,14,24,8B,F8,B2,01
如果搜索到的地址为 <Address>,则可以设断点
bpx <Address>-4
第二种:
s eip l ffffffff 81,C4,04,F0,FF,FF,50,81
如果搜索到的地址为 <Address>,则可以设断点
bpx <Address>
第三种:
s eip l ffffffff 55,8B,EC,83,C4,F8,53,56,57,8B,F9,89
如果搜索到的地址为 <Address>,则可以设断点
bpx <Address>
我一般设第二种方式的断点,以后的跟踪注意一旦出现 RET 指令时,首先查看一下堆栈中的内容,如果是将跳转到 FindClose 中时,则向下翻页找到 RET
语句处设断点,然后按F5键继续,(不要直接按F7,这样无效)。直到如下代码:
015F:00C205B3 E860CEFFFF CALL
00C1D418 <--此处可以按F10带过
015F:00C205B8 E801000000 CALL
00C205BE <--此处只是一个跳转指令的作用,必须按F8键,否则程序将直接执行
015F:00C205BD 8183C404310424E80100ADD DWORD PTR [EBX+043104C4],0001E824
015F:00C205C7 0000
ADD [EAX],AL
015F:00C205C9 6883C4048B PUSH
8B04C483
015F:00C205CE 051420C200 ADD
EAX,00C22014
015F:00C205D3 E802000000 CALL
00C205DA <--同理
015F:00C205D8 E86883C404 CALL
05868945 <--同理
015F:00C205DD 010424 ADD
[ESP],EAX
015F:00C205E0 C3
RET
9、当我们在 RET 指令执行后,(此时将看到两个CALL调用,在第二个处要按F8进入)将离最后的目标不远了,所以可以小心地按F8继续。
015F:00C1F845 5D
POP EBP
015F:00C1F846 8B65FC MOV
ESP,[EBP-04]
015F:00C1F849 8B45F8 MOV
EAX,[EBP-08]
015F:00C1F84C 8944241C MOV
[ESP+1C],EAX
015F:00C1F850 61
POPAD
015F:00C1F851 50
PUSH EAX
015F:00C1F852 6863F8C100 PUSH
00C1F863
015F:00C1F857 687BF8C100 PUSH
00C1F87B
015F:00C1F85C E8F7FEFFFF CALL
00C1F758
015F:00C1F861 50
PUSH EAX
015F:00C1F862 C3
RET
<--此处,我跟踪的情况,将跳转到00C1F878处
015F:00C1F863 5B
POP EBX
015F:00C1F864 6A10
PUSH 10
015F:00C1F866 E8DDFEFFFF CALL
00C1F748
015F:00C1F86B 50
PUSH EAX
015F:00C1F86C E8CFFEFFFF CALL
00C1F740
015F:00C1F871 50
PUSH EAX
015F:00C1F872 6A00
PUSH 00
015F:00C1F874 E8D7FEFFFF CALL
00C1F750
015F:00C1F879 53
PUSH EBX
015F:00C1F87A 50
PUSH EAX
015F:00C1F87B C3
RET
<--这是我们要跟踪的最后的一条指令了,Yeah![ESP]=OEP=4574F4。
015F:00C1F87C 90
NOP
015F:00C1F87D 6845F8C100 PUSH
00C1F845
015F:00C1F882 C3
RET
<--此处,将向上跳转到00C1F845处
10、在 00C1F87B 处我们下指令,保存内存映象
/dump 400000 9E000 c:\temp\dump.exe
11、现在开始修补工作,用 PEEditor 打开dump.exe文件,选择dumpfixer,即修改RS=VS等等。
12、运行我写的小工具ITOOLS。先选择"修补文件头"和"写入进程空间"两项,然后打开Asprotect.exe文件,ITOOLS将创建进程,此时直到进程运行出现在任务栏中时(最好再等一会儿),单击确定按钮,ITOOLS将开始修补PE头和转换ThunkData,然后弹出对话框警告,此时如果转换正确,(即没有出现Error字眼)选择确定,最后你还需要单击一下Asprotect进程中的打开菜单一下,如果没有出现错误,则你可以启动Imp_List进行Import
Table的Rebuild工作。此时我们可以得到完整的Import Table文件Import0.bin。
13、用Hex WorkShop打开dump.exe和Import0.bin,将Import0.bin中内容替换到dump.exe中的 5F000 处。(这个值可以由Address.txt得知)然后保存。
14、用 PEEditor 修改Export Table的RVA=0,Size=0,Import Table的RVA=5F000,Size=(大于0即可)。Basereloce的RVA=0,Size=0,Tls
Table的RVA=63000(此值也可以不改),Size不变。保存。
15、运行程序,发现出现错误提示在地址C1C4A8,通过查找dump.exe文件,可以知道其在5D5BC和5D5A0两处有此值,看来还有问题,重新运行Asprotect。如果我们前面所设的断点没有下
bd * 禁止的话,又一次将依次中断在这些断点上,我们下指令
d C1C4A8
可以看到显示的内容为 408DC3。0K!得到了我们想要的值。回到Windows中,修改其中两处的值为 408DC3。重新运行,依然出错。这次地址很奇怪。看了半天,我终于想明白
5D5BC 和 5D5A0 保存的内容应该是指向内容为 408DC3 的指针。这好办。我把 5D5BC 和 5D5A0 两处的值修改为 5D5A4 ,把
5D5A4 的内容修改为 408DC3。再次运行。OK!终于成功。好辛苦。还是rAD.exe好!到底是大师的作品。呵呵!
【后记】
这里写得一点新意都没有。浪费了时间!再也不写这种没什么意思的文章了。仅有的一点作用可能就是在rAD.exe不起作用的时候,而且你有大把大把的时间脱壳的时候............这是什么逻辑!......:-&
(口吐白沫,晕倒在地)
- 标 题:流放一文。 对Asprotect v1.1的手动脱壳的一点分析 (9千字)
- 作 者:ljttt
- 时 间:2000-10-27 0:41:32
- 链 接:http://bbs.pediy.com