吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 2657|回复: 12

[转载技术] 第三十一章-脱壳简介

[复制链接]
Shark恒 发表于 2015-1-20 17:01 | 显示全部楼层 |阅读模式

                             第三十一章-脱壳简介
原定本章是要介绍P-CODE的Part3,然后再介绍脱壳的。但是很多朋友跟我说P-CODE,WKT的教程有很多,并且现在P-CODE的应用程序已经很少了,没有必要过多的介绍P-CODE,希望我能够多讲讲壳,提高大家脱壳的能力。所以说本章我们开始讨论壳,首先要给大家明确一点,壳的种类繁多(PS:这里说种类繁多,并不准确,种类也就那么几种,压缩壳,加密壳,虚拟机壳,所以说应该是数量多,之前发过一篇帖子收集了T4社区的各种脱壳脚本,充斥着各种各样的壳,大家可以看看),所以接下来的章节,我不会介绍所有的壳,只会给大家介绍壳的基本概念以及原理,还有几个具体壳的实例,大家不要指望看完本教程将能搞定所有壳,本教程的目的在于帮助大家理解壳的原理,锻炼大家解决未知壳的能力,大家要学会举一反三,触类旁通。
本章我们将介绍壳的基本概念,这对我们后面脱壳是大有裨益的,大家不要因为简单,就忽视它,后面章节,我们会介绍一些手工脱壳的实例。
首先大家可能会问为什么要给程序加壳?(PS:其实地球人都知道,嘿嘿)
我们知道一个未加壳或者脱过壳的程序修改起来很方便,但是如果一个加过壳或者自修改的程序,要想修改它就比较困难了,我们在入口点(PS:这里指的入口点是壳的入口点)处修改程序是不起作用的,只有当壳把原程序区段解密完成后修改才能起作用。
加过壳的程序,原程序代码段通常是被加密过的,我们想修改它就不那么容易了。
加壳程序给目标程序加壳的原理通常是加密/压缩原程序各个区段,并且给目标程序添加一个或者多个区段作为原程序的引导代码(壳代码),然后将原程序入口点修改为外壳程序的入口点。
如果我们将加过壳的程序用OllyDbg加载的话,OllyDbg会停在壳的解密例程的入口点处,由此开始执行。
壳的解密例程(外壳程序)首先会定位加密/压缩过的原程序的各个区段,将其解密/解压,然后跳转至OEP(程序未加壳时的入口点)处开始执行。
现在我们来看一个最简单的壳,UPX壳,大家可以去下面网址中下载一个GUI版,名称为GUiPeX_Setup。
http://www.blueorbsoft.com/guipex/
image002.jpg
安装好以后运行起来。
image004.jpg
我们加壳的对象就选择大家熟悉的CrueHead的CrackMe,首先我们不加壳将其加载到OllyDbg中。
image006.jpg
我们可以看到其入口点是401000,也就是说,运行它,将从401000地址处开始执行。
现在我们用GUiPeX将其加壳,解密其区段,并且将入口点修改为解密例程(外壳程序)的起始地址。
当我们运行加壳后的CrackMe,首先会从解密例程开始执行,解密例程会解密原程序各个区段,然后定位到位于原程序代码段中的入口点,也就是大家常说的OEP(OrigianlEntry Point),即401000,接着跳往OEP处开始执行原程序代码。
下面我们就来讨论CrueHead这个被加过壳的CrackMe,该CrackMe的OEP位于何处我们已经清楚了。
我们将该CrackMe保存一份备份并将其放到一个安全的地方,比如说桌面,因为接下来我们需要将加过壳的CrackMe与原始的CrackMe进行对比。
打开GUiPeX。
image008.jpg
我们将CrackMe拖拽到上面那个窗口中。
image010.jpg
我们可以看到上面窗口中显示出了带加壳的CrackMe的完整路径。后边的Commands(命令)选项我们选择Compress(压缩)。
通过这个工具我们可以给目标程序压缩或者解压缩。
然后我们按Run按钮就开始给该CrackMe加壳了。
image012.jpg
我们可以看到UPX Output窗口中显示该CrackMe加壳成功了。
我们将加壳后的CrackMe重命名为CRACKMEUPX.EXE。
image014.jpg
我们会发现加壳后要比原来的小很多,加壳程序给原程序添加了额外的代码来保护原程序,体积反而变小了,嘿嘿。
image016.jpg
我们将加壳后的CrackMe运行起来,可以看到跟原CrackMe运行效果一样。
现在我们用两个OllyDbg分别加载CRACKMEUPX.EXE和CRACKME.EXE,比较一下两者有什么不同。
CRACKME.EXE的入口点
image018.jpg
CRACKME UPX.EXE的入口点
image020.jpg
正如大家所看到的,CRACKME UPX的入口点变成了409BF0,将从这里开始执行解密例程,如果我们定位401000地址处,会发现找不到原程序的代码任何踪迹。
image022.jpg
正如大家所看到的原程序的代码段是空的,即加壳程序将原程序代码段加密/压缩后保存到其他地方,并且将原程序代码段清空了。
通常情况下,大部分加壳程序会在待加壳程序中创建自己的区段,从自己的区段开始执行解压/解密程序,解压/解密程序会将对原程序各个区段进行解压/解密。
下面我们一起来看看解压/解密的例程,不运行,直接往下拉。
image024.jpg
继续往下,直到你看到:
image026.jpg
我们可以看到从解压例程开始执行,解压例程执行完毕以后就会跳往OEP处,没有做任何的隐藏工作,是不是很有喜感,不难吧,我们继续。
我们给JMP OEP这条指令处设置一个断点。
image028.jpg
运行起来。
image030.jpg
我们可以看到断下来了,这个时候原程序代码段已经解压修复完毕,我们按F7键跳转到OEP处(原程序代码段的第一行)。
image032.jpg
这里我们可以看到到了OEP处,跟原CrackMe的入口点处代码一样。至此,解压例程就完成了其全部任务,整个过程是首先解压恢复了原程序的各个区段,原程序代码段恢复完毕以后,接着跳转到OEP处开始执行原程序代码,大家应该还记得刚加载的时候,401000处是空的吧。
以下是加过壳的程序执行的整个流程(PS:现在的一些强壳的执行流程已经不能简单的这么概括了,以后再讨论):
1.执行解压/解密例程
2.解压/解密原程序的各个区段的数据
3.跳往OEP处
4.执行原程序代码
经过了这么多年的洗礼,加密解密技术水平的提高,壳的作者们也在使用各种奇技淫巧来扩充这个流程,他们会想尽各种办法来隐藏OEP,并且还有加入各种各样的反调试保护手段,但是不管怎么变,加过壳的程序执行的常规流程就是上面说的几点(PS:如今的强壳以上几点不足以概括了,按kanxue老大的话来说就是”壳里有肉,肉里有壳”,以后我们再讨论)。
我们继续来讨论CRACKME UPX。
很明显,原代码段是空的,在合适的时间,解压/解密程序会将解压/解密后的代码段数据重新写到这里,所以我们可以对这里设置内存访问断点,当解压/解密例程向这里写入数据的时候就会断下来。
我们一起来看看。
image034.jpg
image036.jpg
我们将CRACKME UPX的区段与CRACKME的区段对比一下就会发现,原先的代码段变大了。
image038.jpg
原程序的代码段起始地址为401000,大小占1000字节,而CRACKME UPX的代码段起始地址变为了409000。
这里,我们直接给原程序代码段设置内存访问断点,接着运行起来。
image040.jpg
image042.jpg
断了下来,我们可以看到401000开始处的内存单元的第一个字节将被赋值为AL的值,此时AL值为6A,我们再来看看原程序401000处的第一个字节是什么。
image044.jpg
这里我们可以看到原程序入口点401000处的第一个字节也是6A,如果我们按F9键,会看到接下来一个字节被填入了00。
image046.jpg
如果我们逐字节的跟踪,可以看到解密/解压例程将原程序代码恢复的整个过程。但是并不是所有的壳都是按照这个顺序来解密/解压原程序区段的,这里我们所看到的是最常规的情况。
如果大家仔细跟踪这个流程的话,就会发现这是一个循环,逐字节读取加密过的字节,接着进行数学运算(例如说:加法,乘法,等等)来解密,运算完毕得到原始字节值,然后将其恢复到原处。
接下来,我们清除掉前面设置的内存访问断点,单击菜单项中Animate into(自动步入)选项,将能看到原程序代码段被逐字节还原的动画过程,原程序各个区段被还原后,就会断在我们前面设置的JMP OEP处的断点处。
image048.jpg
image050.jpg
这里我们可以看到解压例程解压原程序代码段的动画过程。
image052.jpg
当执行到这里的时候,我们可以看到解压例程在循环读取加密后的原程序区段数据,对其进行解密运算,然后填充到原程序区段所在的原始位置,原程序所有区段被解密还原后就断在了JMP OEP处。
这里我们按F7键跳转到OEP处。
image054.jpg
这里我们就到达了OEP处,我们之前说过加壳后的程序使用OllyDbg修改代码是不能直接保存到文件的,下面我们一起来看一看。
例如:我们想将前两个字节6A00修改为90 90,然后尝试保存到文件,OllyDbg会报错:
image056.jpg
这里OD提示在可执行文件中定位不到该数据。
如果你执意要修改的话,可以使用十六进制编辑器将401000对应的数据修改为90 90,然后用OllyDbg加载该修改过的程序,接着来到401000处,可以看到是90 90开头,然后紧接着全是00,当解密例程开始解密时,会将解密后的原始的6A 00再次填充到401000处,当解密区段完成并跳往OEP后,依然执行的是6A 00而不是90 90,也就是说我们所做的修改将被解密例程覆盖掉了。
也就是说,如果你想修改这些字节的话,你需要定位到读取加密后字节的地方,在其解密出原始字节时,将其修改掉,这样才能成功修改这些字节,但是如果这样弄的话,需要做的工作太多了,得不偿失,大家把这个过程理解为文件补丁,如果待打补丁的程序被加壳,压缩或者有自校验,则补丁就不会被顺利利用。正因为有了如此不便之处,所以,在文件补丁技术以外,还需要一种更加高阶,隐蔽的方法,也就是内存补丁。
内存补丁的总体思想就是在某个时刻(解压,校验或某种情况发生以后),在目标程序的地址空间中修改数据,因此也被称为Loader,每次使用时都需要调用程序运行。当然这就不是本教程所要讨论的话题了(PS:如果大家想了解内存补丁的话,可以参考加密解密3)。
好了,本章就到这里,下一章节我们将讨论该CrackMe的脱壳。

本系列文章汉化版转载看雪论坛

感谢原作者:RicardoNarvaja(西班牙人)
原作者个人主页:http://www.ricardonarvaja.info/

感谢热心翻译的朋友:
1~3章译者:BGCoder
4~58章译者:安于此生

全集配套程序下载地址:
链接: http://pan.baidu.com/s/1eQzTWfo 密码: vytv



评分

参与人数 12HB +5 THX +8 收起 理由
儿戏 + 1
游侠啊 + 1
Jawon + 1
Soul1999 + 1
zxjzzh + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
消逝的过去 + 1
temp + 1
l278785481 + 1
蛋蛋蛋 + 1
jaunic + 1
hnymsh + 2
lies + 1

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
hackysh 发表于 2022-2-20 00:10 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
头像被屏蔽
别管我了行 发表于 2022-3-2 03:46 | 显示全部楼层

提示: 作者被禁止或删除 内容自动屏蔽
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
yexing 发表于 2022-9-27 22:35 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
莫欺少年穷 发表于 2022-9-27 23:38 | 显示全部楼层

支持恒大   
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
曾经沧海 发表于 2022-11-19 17:40 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
一生逍遥 发表于 2022-12-4 10:43 | 显示全部楼层

好东西,备用
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
曾经沧海 发表于 2023-4-4 11:08 | 显示全部楼层

牛啊!爱了爱了!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
一生逍遥 发表于 2023-4-20 14:45 | 显示全部楼层

感谢好兄弟分享!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
一生逍遥 发表于 2023-4-20 14:49 | 显示全部楼层

太棒了,感谢!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

1层
2层
3层
4层
5层
6层
7层
8层
9层
10层

免责声明

吾爱汇编(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编不承担任何因为技术滥用所产生的连带责任。吾爱汇编内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长QQ:1140549900


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

Powered by Discuz!

吾爱汇编 www.52hb.com

快速回复 返回顶部 返回列表