当我们谈“软件保护”时,我们在谈什么?

393 阅读6分钟

说起软件保护,我们会想到一大堆的夹杂着技术和产品的名词:加壳、加密狗、许可证、授权、虚拟机、混淆、反调试、反逆向等等。那么抛开技术不谈,我们做“软件保护”到底是要干什么呢?我总结了以下三点:

第一:防盗版

这是最为基本的出发点,我辛苦开发的软件,你要给钱才能使用,你买了一年就不能用一年半,你买了能三台机器上用就不能用在四台上,你买了十个并发就不能用十一个,你买了五个模块就不能用六个……也就是说,这里的软件保护,根本上说就是一种软件产品买卖的契约。

这个契约有的叫加密狗,有的叫许可证,有的叫授权,原理上就是在某一个载体(加密狗或许可证或服务器等)上存了一个对软件来说有意义的“数”,可能代表使用的年限,也可能代表绑定的设备信息等,总之软件自己知道,然后软件运行时会检查这个“数”和真实情况是否匹配,然后决定是运行还是不运行。

如果大家都是谦谦君子,这事到此也就结束了,但是现实是残酷的,只要能占便宜,就有人会去想办法获利。买了一年的,我给你改成永远不过期;买了十个节点,我给你改成无限节点;买的需要插入加密狗才能运行,我给你改成随便使用……简单说,就是有“坏人”通过一些技术手段,绕过了你软件中上述对于那个“数”(或者说许可信息)的检查,然后就可以随心所欲地使用软件了。

这里有人会说,我的代码都是编译成了二进制程序呀,看不懂啊!这里我用十数年的经验告诉大家:你原始的二进制程序,在破解者面前,和源代码没有区别、没有区别、没有区别!所以我经常说,不讲加密只谈许可都是耍流氓!

那么怎么防止这些坏人呢?首先软件内部不让人看,就是使用一些让你的软件不能被调试的技术,一调试软件就崩溃,这是第一道门槛,这会挡住一大部分低阶破解者。但总有高手存在,可以绕过上面这一步,所以我们还要让人看不懂。就是对软件进行加壳、对代码进行加密、混淆,总之就是把可执行程序“搞乱”但是功能还不受影响,让人很难看懂,这样找那个检查许可信息的点就变得困难。

这样原来破解只需要一个小时,现在可以要一周、一个月或更多,具体取决于你选择的加密技术手段如何,也取决于你的“检查点”有多少。注意我这里没有说“永远无法破解”,只是无限增加破解的代价,如果有人和你说他的安全方案无法被破解,你可以直接把他当骗子扔出去。

总结一下,防盗版,就是我们和客户之间有一个软件去检查的“契约”,然后用各种手段保护这个契约能顺序执行,不会被绕过。

第二:核心逻辑保护

有时候,我们要的不仅是防盗版这么简单,比如你有一个潜心研究了几年的算法,让你的软件在同类中有巨大的优势;也可能算法本身不重要,但是你有自己下功夫训练的结果,让你的软件更智能;也可能是你的软件里有大价钱买来的图片、视频资源,让你的软件体验更上成……这些东西你都不想被人盗用,拿去买或拿去做竞品对你来说都是巨大的损失。

关于逻辑保护可以举一个例子:游戏机的“赔率”算法很关键,既要让游戏厅能赚到钱,又要让玩家在输赢上觉得刺激,这就是核心竞争力,你的算法好,产品就卖的好,但是一旦算法被抄袭,竞争对手可以分分钟做出同质的产品。

这里的核心的问题就是防止逆向,也就是说使用各种加密和混淆手段让你需要保护的算法、资源,使破解者无法通过对二进制的逆向分析获得原始的逻辑或数据,从而无法抄袭。这里也是一个程度的问题:世上没有无法破解的保护,但是当破解的成本高于收益时,我们就认为这是有效的保护。

第三:防篡改

最后一点就是防篡改,这和防止盗版、保护算法不同,举几个例子:

游戏里通过篡改一些参数,获得超出正常的游戏体验,这一点相信大家都清楚得很,如果是网络游戏,你超过正常的游戏体验必然会损伤其它玩家的体验,最终的损失还是要开发商买单; 物流行业通过破解终端的扫码等设备,篡改数据,刷单获利,近些年随着网购和物流行业的火箭式发展,这种情况越来越多; 你的软件(或移动应用)流行之后,在你的软件中插入恶意代码或广告代码再发布获利,被盗版的同时还要损失信誉。 这里用的保护手段和上面其实本质是一样的,除了动态不让看,静态让人看不懂,还需要对文件、内存的各种校验,让人改不了。

现在回到标题:当我们谈“软件保护”时,我们在谈什么?上述前两点都可以归结为对知识产权(IP)的保护,后一点是防篡改。在这里加密是一个核心问题,不然软件随便存个配置文件、取个系统时间判断一下就了事了,就不会存在“软件保护”这个行业了。因为有巨大利益诱惑,破解者会不遗余力,我们做保护的和破解者是真刀真枪的比拼,我们做的就是不断提高解决的代价。

当然加密做好了,就是许可的易用性和灵活性,这一点也非常重要,不过是另一个话题了。