首页
社区
课程
招聘
[原创]脱壳小白之ASPack
发表于: 2020-3-22 17:31 25218

[原创]脱壳小白之ASPack

2020-3-22 17:31
25218

                                                                            一个能走多远,不是他多会跑,而是他能否站在巨人的肩膀上!

                                                                                                                                                                        ----题记

         首先声明,本人是小白,大牛勿喷!ASPack教程很多,本文只是糟糠之作,记录一次脱壳小白的经历。

         某天,一个同是游戏爱好者的哥们笑滋滋的发我某游戏的一辅助,说想改点东西。一时好奇(在天朝,也只能对这些灰色产业好奇),手一痒拖进了PeiD,一看ASPack 2.12的壳;于是就花了点时间,继而有了本文。

         说起ASPack,大家都知道,是脱壳入门级的小壳,也是WIN32效率较高的壳。对于大牛,那时信手沾来,而且前辈们也总结了大量经验。比较有名的脱壳方式有两种:ESP定律和配对法。

         啥为ESP定律?这个得从WIN平台的函数说起。大家都知道,函数都是都是通过栈运来运行的,而栈有个特点,就是没出函数调用退出需平衡,所谓的平衡就是进去啥样,出来还得是啥样;而能做到这平衡操作的,就得用上两个比较特殊的寄存器:EBP和ESP,EBP是记录栈底的寄存器,是不动的;而ESP是活动,能上下移动;当函数操作完成后,ESP和EBP是相等的,这就是平衡,这里借用MallocFree的周老师的一张图来说明:


而所谓的加壳,无非是压缩,加花生指令来迷惑我们的眼睛,即便是这样,它也得释放执行函数,既然要执行函数,那么就必须得栈平衡,于是万能的ESP定律就是由此而来。

         对于匹配法(或许不太标准,姑且这么叫吧),通俗点将就是配对,既有进有去;对于ASPack,入口都是PUSHAP,既然有PUSH(进),那么必然有POP(出),不然不符合程序的规矩;所以咱们可以再程序中,搜索POPAD,一个程序中POPAD肯定很多,那么如何判断是我们要找的POPAD?对于这个问题,前辈们已有所总结:POPAD下有JP和RET的,是跳到OEP的概率很多。有了这经验,那么范围缩小了很多。

         了解了ASPack的脱壳流程,那么便可以开始脱壳了。脱壳前按照规矩,得说下环境,所用工具,壳类型等:

          脱壳环境:windowxp(为啥用XP,后面说)

         脱壳工具:OD,peid,exeinfope,DIE,IMPORTrec

         用到的工具:WINHEX,010EDIT,SISU,DEPENDS

         壳类型:ASPack 2.12 -> Alexey Solodovnikov

脱壳选择的系统之所以是XP,以方面是体积小配置低运行方便,更多是由于在XP以上的系统,微软为了防范那些大牛,加了两个号称历史转折点的大亮点:PG和ASLR(这两个是啥,可以问问度娘和必应)。这两个鸡肋的加入,无疑将80%的小白拦截在了破解的门外。

        说了那么多废话,那么便开始小白的脱壳之路:

        1.查壳。拖入PEID,壳类型如下:


        2.脱入OD。由于是DLL,拖入后会调用OD的loaddll.EXE来加载,点击是,然后会弹出如下框:

点否就行,然后就自动断在入口点,如下图:

        3. 看到熟悉的PUSHAD,为了方便,我们直接用匹配法(ESP定律教程很多,在此就不赘叙了)。在OD中CTRL+L,输入POPAD,寻找有JP和RET的地方,多次CTRL+L后,我们来到了如下地方:

很像,于是F2断点,F9运行,然后F8,走到RET,出掉断点,再F8跳出后数据如下:

我们看到的一串变量,别急,做如下操作,点击红框的菜单,就能看到熟悉的指令了:

抓换后,看到是不是很熟悉?第一条是push ebp,这基本上就能确定是此程序的OEP了(程序的OEP,一般是以 push ebp 和mov ebp esp这两句开始,由于程序是过程的,所以要确保堆栈平衡,为了保持平衡,要保存ESP的值,如果有疑问,可以用不同编译器,编译不同的EXE反汇编总结经验),然后可以单步调试继续确认。

        4.确定了OEP,下一步就该是DUMP。由于是DLL,OD自带的dump插件(直接不修改会DUMP失败)对新手来说理解有点困难(看篇幅,后面说);引用看雪老大的原话:DLL必须被相应的EXE进程加载到内存,OD里就是用loaddll.exe这个进程加载的。你Dump时,这个DLL进程必须到loaddll.exe所涉及到的DLL文件里找。这里也推荐使用loadPE。直接上LOADPE,操作如下:

转存后,生成了dump.dll(注意,DUMP时,必须OP必须停在OEP处)

        5.做到这一步,如果认为完成了,那么你就是高兴太早;不信,继续拖PEID,结果如下:


怎么还是显示ASPACK?难道他有两层ASPack壳?有疑问就对了,有疑问就有解决的动力和方向了。比较脱壳前的PEID数据后脱壳后的PEID数据,不难发现它们除了File Offset

不同,其他的显示的都一样,最重要的是Entrypoint(俗称入口点)也都一样了,这就有点说不过去了,那么肯定的要修复。如何修复?新的入口点又是啥?带着疑问我们回归OD和loadPE的dump界面。在OD中OEP一行的地址为009EEF90,这是壳解压后的绝对地址,而入口函数是一个偏移地址(如果用觉得地址,会存在被占用的情况),这个偏移地址要减除程序运行的基地址,基地址是多少?其实4中的图已经告诉我们了:镜像基地址,看到此行为00910000,那么到底是不是00910000?我们可以再OD中查看。输入命令:dd 00910000,并在数据窗口右键,如下选择:


得到如下显示:


是不是看到了熟悉的味道?对PE结构,那么可以确定基地既是00910000。如是Entrypoint就出来了 Entrypoint = 009EEF90 – 00910000 = 00DEF90。拖入LordPE,修改如下,保存:


再次拖入PEID中,发现变了,变成了Nothing found,看到这个有人高兴有人心慌,高兴的是认为这个壳脱了,心慌的是可能PEID无法检测。换个工具试试?这里使用exeinfope,拖入之,结果显示Unknown DLL  - First section Delphi  NOT Packed,比PEID好点。至少显示了Delphi(PEID深度扫描也可显示),点击界面上的PE,可以看到Import还在.aspack段:


这个导入表肯定有问题,需要修复,如何修复,又的回到OD。


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

最后于 2020-3-22 17:32 被loveOpal编辑 ,原因:
收藏
免费 5
支持
分享
最新回复 (11)
雪    币: 29182
活跃值: (63656)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
2
鼓励一下!
Aspack壳运行时,当内存映像刚解压时Dump,此时内存映像是完整的PE文件,输入表等不需要修复,只需要改下OEP就可跑起来。
2020-3-22 18:10
1
雪    币: 1
活跃值: (1555)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
请上传文件以研究:mir3.dll. 谢谢啦
2020-3-22 18:55
0
雪    币: 222
活跃值: (185)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
4
没有实例啊
2020-3-23 00:01
0
雪    币: 83
活跃值: (1092)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
好不好啊 吼啊
2020-3-23 09:51
0
雪    币: 638
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
昨天刚好遇到分析的地方,一脸蒙逼,原来需要删除分析,初赞给你了
2020-3-23 11:10
0
雪    币: 16532
活跃值: (6579)
能力值: ( LV13,RANK:923 )
在线值:
发帖
回帖
粉丝
7
Editor 鼓励一下! Aspack壳运行时,当内存映像刚解压时Dump,此时内存映像是完整的PE文件,输入表等不需要修复,只需要改下OEP就可跑起来。
小编不是美女吗?怎么都会脱壳了?
2020-3-23 15:33
0
雪    币: 168
活跃值: (823)
能力值: ( LV10,RANK:173 )
在线值:
发帖
回帖
粉丝
8
即使是小白,也该换到win7下玩了
2020-3-23 17:00
0
雪    币: 7465
活跃值: (4196)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
不错不错,赞
2020-3-23 17:08
0
雪    币: 4669
活跃值: (4627)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
学习了,正有用
2020-5-7 13:40
0
雪    币: 164
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
感谢分享,赞
2020-9-3 10:17
0
雪    币: 2055
活跃值: (418)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
感谢分享
2020-10-14 20:25
0
游客
登录 | 注册 方可回帖
返回
//