标题:【原创】aspack手动脱壳教程
作者:yxhbboy
时间:2014-7-11 23:44
链接:http://bbs.pediy.com/newthread.php?do=newthread&f=45
今天星期五,办公室空荡荡的,大家都去约会了,只有我这等屌丝不知道该干什么!其实很想去约会,可惜没目标对象,只能干瞪眼。
,想起了前几天有一哥们发了一个木马程序给我。今天刚好闲下来,也罢,既然没对象约会,再寂寞也是没办法的,就这苦逼的命。看看这个传说中的木马,打发下时间也无妨。用OD打开,发现加壳了,用detect it easy工具检测,发现时aspack壳,其实我也不会,第一次接触壳,我想着,壳和病毒差不多,就顺着这个做了下去,其实我算是幸运,刚好给弄出来了,顺便整理成了文档,菜鸟级的教程,高手就别笑话了。给这个程序脱壳步骤如下:
1, 用ollydbg打开某程序,出现一个警告对话框(看附件文档里有图)
2,点击"否"按钮,运行程序进入到壳的模块:
0058F000 90 NOP
0058F001 <模块入口点> 60 PUSHAD //程序暂停在这里,很显然,这里是
//壳的入口点
0058F002 E8 03000000 CALL XXXX.0058F00A
0058F007 - E9 EB045D45 JMP 45B5F4F7
0058F00C 55 PUSH EBP
0058F00D C3 RETN
0058F00E E8 01000000 CALL XXXX.0058F014
0058F013 EB 5D JMP SHORT XXXX.0058F072
0058F015 BB EDFFFFFF MOV EBX,-13
0058F01A 03DD ADD EBX,EBP
0058F01C 81EB 00F01800 SUB EBX,18F000
0058F022 83BD 22040000 00 CMP DWORD PTR SS:[EBP+422],0
0058F029 899D 22040000 MOV DWORD PTR SS:[EBP+422],EBX
0058F02F 0F85 65030000 JNZ XXXX.0058F39A
0058F035 8D85 2E040000 LEA EAX,DWORD PTR SS:[EBP+42E]
0058F03B 50 PUSH EAX
0058F03C FF95 4D0F0000 CALL DWORD PTR SS:[EBP+F4D]
0058F042 8985 26040000 MOV DWORD PTR SS:[EBP+426],EAX
0058F048 8BF8 MOV EDI,EAX
0058F04A 8D5D 5E LEA EBX,DWORD PTR SS:[EBP+5E]
0058F04D 53 PUSH EBX
0058F04E 50 PUSH EAX
0058F04F FF95 490F0000 CALL DWORD PTR SS:[EBP+F49]
0058F055 8985 4D050000 MOV DWORD PTR SS:[EBP+54D],EAX
0058F05B 8D5D 6B LEA EBX,DWORD PTR SS:[EBP+6B]
0058F05E 53 PUSH EBX
0058F05F 57 PUSH EDI
0058F060 FF95 490F0000 CALL DWORD PTR SS:[EBP+F49]
0058F066 8985 51050000 MOV DWORD PTR SS:[EBP+551],EAX
0058F06C 8D45 77 LEA EAX,DWORD PTR SS:[EBP+77]
0058F06F FFE0 JMP EAX
0058F071 56 PUSH ESI
0058F072 6972 74 75616C41 IMUL ESI,DWORD PTR DS:[EDX+74],416C6175
3,打开M内存映射窗口,找到.rsrc段,按F2下断点,然后按Ctrl+F9运行程序,程序暂停在0058F75F地址处:
0058F757 53 PUSH EBX
0058F758 BE F8FFFFFF MOV ESI,-8
0058F75D 8B02 MOV EAX,DWORD PTR DS:[EDX]
0058F75F 8A18 MOV BL,BYTE PTR DS:[EAX] //程序暂停在这里
0058F761 40 INC EAX
0058F762 885C24 0C MOV BYTE PTR SS:[ESP+C],BL
0058F766 8902 MOV DWORD PTR DS:[EDX],EAX
0058F768 8B42 08 MOV EAX,DWORD PTR DS:[EDX+8]
4,继续打开M内存映射窗口,找到该程序的.text段,按F2下个断点,然后继续按Ctrl+F9运行程序,程序神奇般的暂停了,但你不知道暂停在了哪里!这个时候,不要分析后面的代码里发生了什么,直接:右键->查找->所有命令,在命令行里输入:
popad查找即可,pushad ......popad这一对夫妻你懂的。
搜索到了这么多的popad,看来pushad的情人不止一个,MD,太他妈生气了,NZ今天还TM一个人呢!直接给每个上断点,找到那个原配夫人。然后按F9运行,运行到了这里:
0058F39F 50 PUSH EAX
0058F3A0 0385 22040000 ADD EAX,DWORD PTR SS:[EBP+422]
0058F3A6 59 POP ECX
0058F3A7 0BC9 OR ECX,ECX
0058F3A9 8985 A8030000 MOV DWORD PTR SS:[EBP+3A8],EAX
0058F3AF 61 POPAD
; 恢复栈,这里离OEP不远了
0058F3B0 75 08 JNZ SHORT XXXX.0058F3BA
0058F3B2 B8 01000000 MOV EAX,1
0058F3B7 C2 0C00 RETN 0C
0058F3BA 68 2C314000 PUSH XXXX.0040312C ; ASCII "hD4@"
0058F3BF C3 RETN
0058F3C0 8B85 26040000 MOV EAX,DWORD PTR SS:[EBP+426]
0058F3C6 8D8D 3B040000 LEA ECX,DWORD PTR SS:[EBP+43B]
看到那个popad了,在往后分析,单步运行,75跳转到0058F3BA的地址处,看看这条指令:
68 2C314000, 68是指令操作码,2C314000是需要操作的值,我们反了它:就是0040312C.
这个值正好和PUSH XXXX.0040312C相等,该值是一个经过加载器重定位的值,或为函数地址,或为变量的地址,或为其他,这里不知道,反正就是个地址就够了,这里不能果断的判断该地址就是入口OEP.我们知道,PE文件为EXE时,默认加载地址是:0x00400000,可以判断,该值已经是源程序里的地址了,再往下跟,紧接着是retn指令,这个指令的意思就是先pop XXXX,然后jmp XXXX。
这里就是:
push 0040312C
pop 0040312C
jmp 0040312C,
这样栈也平衡了。
单步跟进去到0040312C:
0040310C FF25 C0114000 JMP DWORD PTR DS:[4011C0] ; msvbvm60.Zombie_GetTypeInfoCount
00403112 FF25 9C104000 JMP DWORD PTR DS:[40109C] ; msvbvm60.Zombie_GetTypeInfo
00403118 FF25 00104000 JMP DWORD PTR DS:[401000] ; msvbvm60.EVENT_SINK_GetIDsOfNames
0040311E FF25 44104000 JMP DWORD PTR DS:[401044] ; msvbvm60.EVENT_SINK_Invoke
00403124 FF25 AC124000 JMP DWORD PTR DS:[4012AC] ; msvbvm60.ThunRTMain
0040312C 68 44344000 PUSH XXXXXX.00403444 ; ASCII "VB5!6&vb6chs.dll"
00403131 E8 EEFFFFFF CALL XXXXXX.00403124 ; JMP 到 msvbvm60.ThunRTMain
00403136 0000 ADD BYTE PTR DS:[EAX],AL
00403138 0000 ADD BYTE PTR DS:[EAX],AL
0040313A 0000 ADD BYTE PTR DS:[EAX],AL
0040313C 3000 XOR BYTE PTR DS:[EAX],AL
0040313E 0000 ADD BYTE PTR DS:[EAX],AL
00403140 40 INC EAX
00403141 0000 ADD BYTE PTR DS:[EAX],AL
00403143 0000 ADD BYTE PTR DS:[EAX],AL
00403145 0000 ADD BYTE PTR DS:[EAX],AL
00403147 008D ABB4E5E4 ADD BYTE PTR SS:[EBP+E4E5B4AB],CL
0040314D E4 30 IN AL,30 ; I/O 命令
0040314F 45 INC EBP
00403150 B4 7F MOV AH,7F
00403152 ^ 75 94 JNZ SHORT XXXXXX.004030E8 ; JMP 到 msvbvm60.PutMem2
00403154 06 PUSH ES
看看绿色标记的代码:
0040312C 68 44344000 PUSH XXXXXX.00403444 ; ASCII "VB5!6&vb6chs.dll"
00403131 E8 EEFFFFFF CALL XXXXXX.00403124
到这里,基本确定了0040312C就是源程序的入口地址.
鼠标选中该条指令:
然后右键选择菜单中的“ollyDump脱壳调试进程”
修正入口地址的值为:312c,至于为什么是321c,而不是0x0040312c,这个已经非常清楚,因为你dump出来的exe最终是保存在磁盘上的exe文件,文件的开始地址是从0算起的,而不是从0x00400000的内存基地址算起的。
然后点击脱壳按钮,保存程序。
最后测试程序,点击dump 出来的程序。运行成功。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!