-
-
[旧帖]
[原创]写外壳加密总结及要注意的问题,希望对以后的人有帮助
0.00雪花
-
发表于:
2012-5-14 10:21
2682
-
[旧帖] [原创]写外壳加密总结及要注意的问题,希望对以后的人有帮助
0.00雪花
本段文字只是对前一段时间编写外壳加密的一些总结,里边不会出现任何代码,只是一些思路以及注意事项,希望这段文字对你会有一些帮助。
加壳软件编写的步骤:
对于我来说,以前没有写过外壳之类的软件,所以一下要对PE文件进行很多处理是很痛苦的,所以一开始我是这样做的:
1. 了解PE文件结构
2. 尝试为PE文件增加一个区段(只是简单的显示一个MESSAGEBOX)
3. 尝试增加对PE文件的处理,比如,压缩等等......
4. 在外壳代码中增加一些自己需要的功能
写壳过程中遇到的问题:
1. 如何处理输入表
将输入表复制到外壳中,并修正文件头。然后自己修复原来的输入表。如果你没有对PE文件进行压缩或者加密处理,就不必这么麻烦,你所做的只需要为PE增加一个区段而已。
2. 对TLS的处理
这对DELPHI程序比较重要,我的程序也没有对含有TLS_CALLBACK函数的进行处理,只是简单的修正了一些TLS,没有管TLS_CALLBACK函数(你可以自己处理)。在处理TLS段的时候我发现无论我如何处理它,运行起来都是错误的,后来才发现,在我的PE是压缩过程的,所以TLS指向的数据都是压缩后的数据,并不是原始的数据,所以,如果你使用了压缩PE文件的功能,一定要注意保存正确的数据,这样你才能对TLS进行处理。
3. 对DLL的处理
我的程序没有对DLL进行压缩,所以,没有处理重定位数据。一定要注意堆栈平衡。如果你的外壳程序调用了msvcrt.dll中的函数(比如: memcpy, strcmp......),请注意,一定要在call 之后恢复堆栈,我的做法是传出了几个参数,我就POP几次,比如:
push eax
push ebx
call memcpyAddr
pop edx
pop edx
这样做是因为我发现调用这一类函数时,我的外壳程序会有问题,但是当POP之后,程序就正常了,后来查了一些资料,原来你调用标准的API之后,它会自动处理对准,但是调用msvcrt.dll里边的函数则不会。
4. 参考资料,这个比较重要,呵呵呵...... 我是看看雪的 软件加密技术内幕,上边有加壳软件的实例代码,看过之后才了解其中的原理,虽然书中的代码对一些PE不能正确处理,但是对学习它的基本原理还有很好的,我也是参考书中的程序并做了一些修改。
5. 我的程序也只是实现了基本的一些功能而已,没有都那么高深,能写出一个可以运行的加壳程序对于一个初学者是一个莫大的鼓舞,无论这个功能是多么简单,千万不要一开始就看很复杂的东西,这样会对自己打击很大(当然,如果你很聪明,那就除外了,呵呵......)。写一个基本的外壳加密程序所需要的东西,基本上在书中和论坛中都能找的到。
以上只是个人写壳的一些感悟,如果有不正确的地方,还望指出,如果这篇文件能对你有一点点的启发,那也是我莫大的欣慰......
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!