壳的自述:我是如何保护应用软件的。

我的自述

壳——也许我生来就是为了保护你,我的公主(程序)。

:就像花生种子被外壳包裹,蜗牛用壳保护自己,而我则是为了保护软件程序不受伤害(不被非法修改或被反编译),我像一个专属骑士,出生就是为了保护我的公主——“软件程序”。我一直站在公主的前面(加壳),为了保护她,发生任何事情的时候,我会将公主的行动权控制,而我会先于公主尝试,为她抵御伤害,在我进行完之后,我会放开对公主的保护(脱壳),把行动权还给她,她可以做自己想做的,当然这其中的过程很复杂。

我们壳主要分为俩大家族,有压缩壳家族和加密壳家族,我们虽然都是保护公主,但是执行功能却有所不同。

压缩壳家族的职责就是,去压缩公主占用的范围,减少开销(可能因为大家都比较穷)。
在没有运行的时候进行压缩,这样可以减少了内存开销,也更加难以被发现(反编译起来也麻烦);当公主要进行活动的时候,进行解压缩,不会很影响速度。
压缩壳家族中人员兴盛,有UPX、ASPack等。等我介绍完我自己之后,在最后放出他们的资料。

加密壳家族,现在比起压缩壳家族更加的强盛,不但人员更多,而且实现的功能也更多,可以说是十八般武艺,可以更好地保护公主。当然他们不同的人之间,侧重点也不同,有的知识保护公主,有的还可以提供一些其他的服务,例如注册机制、使用次数、使用时间等。
常见的加密壳骑士有ASProtect、Armadillo、EXECryptor、Themida、VMProtect。

介绍完我们的俩大家族之后,我想说,其实我们壳并不是都是为了保护软件不受保护,其实我们当中也有一些效力不同的阵营,像是一些恶意软件、病毒等,他们干的是坏事,但是我们也会保护他们的公主,可是我们做的事情不分好坏,都只是在保护而已。

下面我想说说我们究竟是怎么进行保护的。(壳的加载过程
我们的核心就是行动要先于公主,并且为了这个目的要对公主进行一些“限制”和“打扮”,当然是先这些比较专业,下面我将用专业术语来介绍。

1)保存入口参数
加壳程序初始化时保存各个寄存器的值,外壳程序执行完毕,再恢复各个寄存器的值,通常用pushad/popad,pushfd/popfd指令来对保护与恢复现场环境

2)获取壳所需要使用的API地址   如果用PE编辑工具查看加壳后的文件,会发现未加壳的文件和加壳后的文件的输入表不一样,加壳后的输入表一般所引入的DLL和API函数很少,甚至只有Kernel32.dll以及GetProcAddress这个API函数。
  壳实际上还需要其他的API函数来完成它的工作,为了隐藏这些API,它一般只在壳的代码中用显式链接方式动态加载这些API函数.   
3)解密原程序的各个区块(Section)的数据   壳出于保护原程序代码和数据的目的,一般都会加密原程序文件的各个区块。在程序执行时外壳将会对这些区块数据解密,以让程序能正常运行。

壳一般是按区块加密的,那么在解密时也按区块解密,并且把解密的区块数据按照区块的定义放在合适的内存位置。

如果加壳时用到了压缩技术,那么在解密之前还有一道工序,就是解压缩。这也是一些壳的特色之一,比如说原来的程序文件未加壳时1~2M大小,加壳后反而只有几百K。

4)重定位   文件执行时将被映像到指定内存地址中,这个初始内存地址称为基地址(ImageBase)。
  对于EXE的程序文件来说,Windows系统会尽量满足。例如某EXE文件的基地址为0x400000,而运行时Windows系统提供给程序的基地址也同样是0x400000。在这种情况下就不需要进行地址“重定位”了。由于不需要对EXE文件进行“重定位”,所以加壳软件把原程序文件中用于保存重定位信息的区块干脆也删除了,这样使得加壳后的文件更加小巧。有些工具提供“Wipe
Reloc”的功能,其实就是这个作用。
  不过对于DLL的动态链接库文件来说,Windows系统没有办法保证每一次DLL运行时都提供相同的基地址。这样“重定位”就很重要了,此时壳中也需要提供进行“重定位”的代码,否则原程序中的代码是无法正常运行起来的。从这点来说,加壳的DLL比加壳的EXE更难修正。

5)HOOK-API
  程序文件中的输入表的作用是让Windows系统在程序运行时提供API的实际地址给程序使用。在程序的第一行代码执行之前,Windows系统就完成了这个工作。
  壳一般都修改了原程序文件的输入表,然后自己模仿Windows系统的工作来填充输入表中相关的数据。在填充过程中,外壳就可填充HOOK-API代码的地址,这样就可间接地获得程序的控制权.

6)跳转到程序原入口点(OEP)   从这个时候起壳就把控制权交还给原程序了,一般的壳在这里会有明显的一个“分界线”。但现在的猛壳己没这界限了,壳里有肉,肉里有壳。

以上就是我如何保护我的公主(程序)的了,还有我们其他的介绍,我的自述也要到这里了。

常见壳介绍:

压缩壳
UPX:
UPX是一个以命令行方式操作的可执行文件经典免费压缩程序,压缩算法自己实现,速度极快。
ASPack:
AsPack是高效的Win32可执行程序压缩工具,能对程序员开发的32位Windows可执行程序进行压缩,使最终文件减小达70%!目前针对ASPACk所开发的脱壳工具软件也有许多,包括ASPACK ATRIPPER 、ASPACKDIE 、ASPROTECT等 .

加密壳:
ASProtect
ASProtect 是功能非常完善的加壳、加密保护工具。能够在对软件加壳的同时进行各种保护。如:反调试跟踪、自校验及用密钥加密保护等;还有多种限制使用措施,如:使用天数限制、次数限制及对应的注册提醒信息等。另外,该软件还具有密钥生成功能。

Armadillo:(穿山甲)Armadillo 是一套强大的软件保护系统,可以为您的程序添加装甲般的外壳。通过艺术性的加密、数据压缩和其它安全特性保护您的程序不被盗版和破解。Armadillo 可以让您在5分钟内为您的程序设计并添加一套完全的软件保护和注册系统,并且不需要您修改任何程序代码!Armadillo 支持所有语言编写的32位 Windows EXE 文件。有个c++线性代数库也叫armadillo。

EXECryptor:EXECryptor 是创新性的软件保护系统,可以有效保护您的应用程序免遭逆向工程分析、修改或破解。它使用大量新颖的保护技术,可以显著增加软件开发商的投资回报

Themida

Themida是一个强劲的保护系统, 专为了那些想保护自己的程式不被先进的反向工程和黑客软件破解的软件开发者而开发的。开发者不需要更改任何的原代码,和不需要程式编制的经验使用WinLicense。

Themida使用SecureEngine®的保护技术。它能够以最高的优先等级运行,这些保护技巧是从来都没在电脑防御技术领域出现过,使它最大程度地保护任何程式 。

VMProtect
(业界公认的难壳)VMProtect 是新一代的软件保护系统,将保护后的代码放到虚拟机中运行,这将使分析反编译后的代码和破解变得极为困难。使用 MAP 文件或内建的反编译引擎,您可以快速选择需要保护的代码。

发布了25 篇原创文章 · 获赞 28 · 访问量 1755

猜你喜欢

转载自blog.csdn.net/weixin_43742894/article/details/105294250