脱壳入门基础
本帖最后由 chess 于 2011-7-10 15:21 编辑吾爱这里高手太多,以致我们这些刚入门的初学者来讲,好多看不明白他们讲的东西,
很想建议论坛管理员分两大区,一个是初学者区,另一个高手区,这样也不至于初学者番了几页也找不到看得明白的贴子。
偶也是一个刚入门不久的人,特写一点东西献给比我跑慢一步的刚进门的朋友,高手老鸟请漂过呵。。。。。
本贴是原创,用我自己的语言来通俗的描述,绝不摘抄其它任何难懂的教程。
1,基础知识
讲壳之前,先简单说几个基础概念:
PE文件:其实大多数EXE文件,都是一个PE格式的文件,这个格式会规定好哪些数据存放在哪个位置的,也因为多数的EXE文件存放数据有规则的,
所以给操作系统带好许多方便,也给破解者和加密者带来许多惊喜和烦恼。这个PE文件格式我在这里不讲了,对初学者来说,知道有这个东西,
有这么一个规律就行了。
OEP入口点:操作系统运行一个EXE时,第一步是把PE格式的文件,按一定的规律找到每部分数据,然后复制到内存里,其实有一部分叫代码段。
全部复制完后,就开始这个EXE,这时,控制权就交给代码段第一行。可别小看这个入口点,这是兵家必争之地啊,因为这入口点指向谁,谁就第一个获取
最先的控制权,所以说,对于加壳的EXE来说,这个入口点并不是程序本身的代码段,而是壳的汇编代码。
2,什么叫壳
通俗一点讲,其实就是给你的EXE文件,添加一段特殊的汇编代码,我们叫壳代码吧。这段壳代码抢了执行优先权,也就是OEP指向这段代码第一行,这样子,
EXE运行时,就先运行壳的代码,然后再跑回来运行原程序的代码段,如此,这段优先于原程序代码段执行的程序,就叫壳了。
3,壳是如何加密的
有人会问,壳就是这么简单吗,只改了OEP而已吗?呵呵,肯定不只这些,下面给大家说说加壳时都做了些什么,每种壳不一样,
a)有的把PE文件里的代码和数据转换格式,俗称压缩,破解者来说,这样一压缩就很难一下子轻易猜到是怎么转换更不知怎么还原了,
而且压缩后可能原EXE文件大小变小几倍了,是个不错的思路;
b) 还有可能是修改了输入表,这个内容如果展开来讲,可能几千字也说不完,这里我用简单的描述给大家有个概念先:因为每个程序都会调用windows的API,
而调用哪个API呢,API地址是什么呢,这些都写在PE文件里一个叫输入表的数组里,如此,加壳器去修改这个输入表的数据,那么破解者如果不还原这个输入表,
EXE文件肯定运行不成功,如此,又给脱壳解密者带来更大的困难了;
c)还有可能把原PE文件里一些代码搬到壳代码里面,这样的话,如果脱壳者破生生把脱的代码删除,EXE也会运行失败,等于破解失败。
以上说了三种比较常见的方式让大家有个初步理解后,终于明白什么是壳了吧,接下来,就有问题了:
4,加密后的PE文件如何让windows运行的
先想象你自己就是一个加密者,也就是一个加壳的人,你按前面的方式给EXE加壳加密了,可是,PE文件被你这么一改,windows肯定认不出来了,直接拿去给操作系统运行,一定失败,因为操作系统只能运行那一份没有被你改过的PE文件。那怎么办呢?加壳者思路来了:还记得前面说过有一段壳代码,抢了OEP,抢了运行的优先权吗,嗯,没错,这段代码就是还原给操作系统运行机制的。当壳代码拿到运行优先权后,接下来把之前加密的信息还原到内存里,然后再把控制权交给原来的EXE程序,如此就神不知鬼不觉了。
有人可能会问,干嘛又加密又解密的,这样不是白搭了吗?呵呵,肯定不是了,你要知道,这时候,保存在硬盘里的是加壳后的加密PE文件,而运行后,再悄悄地还原到内存里给操作系统,这样的话,大大增加了破解者的难度了,很好地保护了你的软件。
有人更可能问,难道加壳就只做这些,那别人到内存里把解密后的数据保存到文件里,不就得到原来没加壳的EXE了吗,理论上是这样,早期的壳就是这么简单的,但是这个问题连你这些初学者想得到,加密和解密的高手们更想得到了,既然加壳的代码拿到运行的优先权,就可以为所欲为了,大家会各出奇谋,让你取不到内存的数据,或者取到内存的数据是错的。,,,至少有什么奇谋,等偶成为真正的高手后,回头给大家连载几篇文章共享经验给大家。
5,壳是如何解密的
到这里,我们对壳的理解是,加壳后的程序,PE文件内容是乱的,只有加壳者才看得明白,但是加壳者留下一段代码在OEP处,解密告诉操作系统。
如此,我们这些要脱壳的人,就牢牢抓住解密者留下那段OEP处的代码,跟踪它,你可能会得到全部的解密脱壳过程。
没错,这是个好办法,也是一个通用的办法,我想将来我成为高手了,我也会这么做。
但是这个办法是不是太累了呢,看这些OEP处的壳代码,是汇编代码啊,能不看尽量不看,好累人的。于是,前人留给我们一些快捷的经验:
1,先找真正的OEP点:壳代码不会一直抢着控制权,它解密完后,会把控制权交给原程序的第一代码行,这就是OEP,当运行到真正的OEP时,
说明内存里已经全部还原为加壳前的EXE文件内容了,这里,把内存里所有数据保存为PE文件,一般能拿到脱壳后的原EXE文件内容。
(把内存数据保存为文件,OD能做到,其它一些PE工具也行,大家网上找找)
2,修复输入表:有时找真正OEP点保存后的PE文件,运行出错,是因为输入表被加壳者修改了,这时也要用一些工具帮你修复。
简单的脱壳,上面两点就够了,这里是给大家一些概念和思路,但是一些猛壳,可能做的事情不只这些,比如还有资源表要修复,等等。
论坛里好多高手也因此在各出奇谋,怎么对付各种加密壳,这是一个非常艰苦的过程,偶目前只能带大家走到这里,接下来,大家多努力和高手们学习,
相信你们会有更好的解密方法的。
6,怎么知道程序加了壳
加壳前和加壳后,都是一个PE文件,一样能运行,我们是怎么知道一个EXE被加壳呢,这是我学加壳后的第一个问题,相信也是许多人想问的:
一般来说,加壳后的文件有以下特征:
1,用PEiD这个工具一般能直接查到是否加了什么壳。
2,有些壳做了驱动保护用OD加载失败,程序退出
3,有些壳让某些原程序的汇编代码出现许多混乱,让你读起来困难重重,可是不影响操作系统运行。
4,加壳后用静态反编译后,你会得到一份不知所云的汇编代码。
等等,当然特征许多了,所以说,你想破解一个程序,最好先用PEiD来查查它是什么语言开发的,加了什么壳。
菜鸟,从头学起。谢谢。 叉烧,看完整片。谢谢楼住分享。有了很多想法。 我是菜鸟一名,来學習學習,感谢楼主教導。 感谢LZ分享,已收藏! 嗯 大家一起学习 菜鸟学习下 我也是新手,謝謝樓主 感谢楼主 希望多发点!!