在坛子里面混了很久了,这里面90%都是破解,很少有加壳的文章.我自己对加壳很感兴趣,所以就自己动手做了个壳,当然这其中也得到了其他人的一定帮助,我想把我的经验分享一下.

1. 加壳语言.
现在的壳多数都是汇编的.但本人汇编水平一般,连olly都使不好,所以只能放弃汇编.我见过delphi和VB做的壳.VB做的那个真的不错,有机会上传到这里,让大家看看.

本人是C/C++的忠实用户,而且C和汇编很接近了,所以选择了C++做壳.

2. 加壳原理
加壳原理我想大家都很清楚,无非是wrap oep, remove reloc, 然后在最后价格stub.修改oep.

话说起来轻悄,就像造原子弹,中学生都知道e=m*c2就ok了,但我们都造不出来.我的观点是加壳就想造汽车,原来的程序就是发动机,而解密就是把汽车拆了,取出发动机.所以我们还是要仔细考虑如何加壳.

3. 具体的步骤
(1) 我是认真研究了bigboot的文章,参考了bambam才下的手.不过大家如果要学习bambam,就从找bambam的bug开始吧,他里面一共有4个重大bug,如果能找出来,你就可以自己做壳了.

(2) 先做个dll,做stub.为什么不用exe?bigboot说compiler crash,我说是exe自己就可能crash.这个exe不是正常加载的,release中又没有reloc,他不crash可能吗? 所以我们用dll做stub. stub的入口要指定,否则没法修改oep.stub就是你自己的程序,所以想干什么都可以,也就是说在程序启动时,天下是你的.

这里面要注意的是:
(a) 你stub加载的地址不是40000,也不是1000000,所以所有的恢复工作都有个便宜量,这个偏移量就是你的入口地址.
(b) stub中可以使用任何函数,如果要用其他的dll,最好使用隐形链接.因为后面要修改reloc.
(c) stub一定是release的,debug的话程序容易乱.
(d) 跳回是就是 push oep+dwOffSet, ret就ok了.唯一的汇编,呵呵.

(3) 给app加壳
这个需要个exe(手动加壳太土了吧,呵呵).他干的工作就是最糙的工作---变化指针. 加壳的过程就是指针不断变化,修改...

关于具体操作的过程bigboot说了很多,我就不多说了,说了也不如他的权威,但有几个问题需要大家主要.

(a) base reloc,看起来是在directory中,其实是reloc section中,对于stub的base reloc一定要都修改好,否则就乱了. 原程序的删除也可以,藏起来最好.

(b) iid,这个东西一定要处理.我的建议是,原来的iid可以藏起来,或者删了(exe). 而且要换成stub的iid. 换的过程中,不能copy,要加上一个offset.怎么算这个offset我就不多说了.

(c) iat,删!

(d) 对齐,这个问题看起来很容易,处理不好你就看见了"不是标准win32程序".我也很奇怪,很多exe自己不对齐的,我为什么要给他对齐呢?

(e)都ok了,就改oep吧,别忘了offset,负责就崩了.

4. 总结
(a) C是完全可以用来加壳的,汇编虽然底层,但c也不弱.对于复杂的应用,可以考虑c,因为汇编太繁琐了.

(b) bigboot的文章是经典,我读了10多边,才完全理解(是不是有点笨?)

(c) 调试壳是痛苦的,因为出了问题,多数是解释不清楚的.这点不想解密,至少保证程序没问题. olly很不错,但我断点都下不好. peview和petool都不错.建议使用.

(d) 世面上加密的书. 看雪的说很不错,写的很全面,尤其是iid写的很清楚.其实加壳对iid的处理比iat要复杂多. 飞天诚信的那本写的很仔细,但只能帮助大家理解pe格式,而不是加壳,因为他加壳的工作都是他们自己工具实现的,没法参考.

(e) anti-crack:我现在没使用任何anti技术,现在所谓anti就是anti-olly,呵呵.因为stub是自己的,所以可以综合使用anti技术了.

5. 展望
1.现在就能加win32的,那.net呢?
2.VM技术似乎很先进,能不能有人指点一下?

头一次发这么长的文章,给个设精吧?