首页
社区
课程
招聘
[原创]aspack手动脱壳教程
发表于: 2014-7-12 00:38 12683

[原创]aspack手动脱壳教程

2014-7-12 00:38
12683
标题:【原创】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 出来的程序。运行成功。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 16420
活跃值: (1675)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
模仿人家的视频 做个10遍 就能找到感觉了。
2014-7-13 08:22
0
雪    币: 195
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢啊,
2014-9-6 08:24
0
雪    币: 1559
活跃值: (1795)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wbs
4
还好有电脑陪伴!
2014-9-6 09:55
0
雪    币: 1555
活跃值: (3103)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
5
好久没脱壳啦 ! 前几天 脱了次,怎么修都弄不好,不知道是系统环境的事情 还是弄错啦 ! 这次要学会呀
2014-9-6 10:03
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
aspack壳毕竟是压缩壳,用ESP脱更快。楼主用的区段解壳法慢了些
2014-9-7 09:08
0
雪    币: 459
活跃值: (398)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
7
ESP 脱更迅速,学习的话,楼主努力了,欠缺细节
2014-9-7 09:58
0
游客
登录 | 注册 方可回帖
返回
//