综合

img WizzMan

如何保护自己开发的软件

发表于2004/10/11 12:19:00  2219人阅读

    大家都知道,现在开发出一个软件产品相对来说容易得多,但是想要受到应有的效益,那就太难了。不是没有人用你开发的软件,主要是没有人用正版,因为盗版太便宜了也太容易获得了。这里最核心的问题是,你保护不住自己开发的软件,上市两天就有盗版了。你的软件也不可能像金山词霸那样不怕盗版,因为你卖不了多少套。要想收回成本,就必须加密好,必须不能很快被解密。
       但是如何才能加密好呢?说实在的话,特别难!加密软件不像用密码加密文本,想猜出密码十分困难,加密软件的特点是加密难而解密容易。因为你的软件毕竟需要完整地运行,即使用了什么密码学的什么东西,可你的密码一定会在软件里出现,不存在猜密码的问题。另外,想要加密的好,恐怕需要懂如何解密,或者说知道一般解密者是如何破解软件的,这就需要普通软件开发以外的知识和实践了,一般人没有这个时间和精力。即使你懂得了一些解密的知识,甚至还小试牛刀一把,但加解密这个行业,水平的差异特别明显。可能一个人自认为想出了特别好的主意来加密,可是在高手眼里,很可能几分钟就搞定,高手可以马上看出漏洞。为什么国外有个组织叫0days,意思就是在一天内就把你的加密软件搞定。看看0days上的软件吧,不乏下了很多功夫在加密上的,但命运是一样的,一天内被破解。这个问题特别严重,很多公司都犯这个错误。就像寻找堆栈溢出漏洞一样,需要特别研究溢出机制才行,加密已经发展成了一个特别的领域,需要深入的研究才行。
      于是出现了不少加密公司,可以说,采用加密公司的加密锁是多数软件公司保护软件的方案。但是,结果如何呢?一样在几天内被破解。就本人的经验来说,没有多少人可以把加密做的很好,因为懂加密的人必须懂解密,而且水平还需要特别高才行。但解密高手本来就不多,现在还又让他搞加密,那这样的人就更少了。个人看法,不代表大众意见,本人认为包括加密公司的开发人员,也没有几个是真懂加密的。这不是我猜的,我和他们打过交道。我用过几乎所有的我见过的加密锁,国内国外,知名不知名的,结果发现,加密公司的技术人员,我几乎没有办法和他们讨论真真的加密问题,没办法,我已经久病自成医了,而且还成了主任、专家,哈哈,个人认为。
         很多加密公司说他们的产品如何好,说的你不由得不信。我想那大多是理论上的事情。看看用他们的加密锁加密的软件是如何被破解的,就知道实际上的情况是如何的了。好像还没有听说一直没被破解的软件,如果有的话,加密公司一定早作宣传了。还有一个特别容易产生误区的地方,就是用加密锁加密的话,似乎就加密的好了。个人经验,这是大错特错的认识,也是绝大多说开发经理、产品经理的认识。这和加密公司的宣传有一定的关系,因为他们要卖加密锁。事实上针对机器特征的license加密法一点也不比加密锁差。只是针对用户机器的license会给用户造成一定的不方便。你想一想,解密者修改你的读取加密锁的代码和修改你的读取机器特征的代码有什么不同吗?请注意,绝大多数解密者是软解密,修改代码而已。所以,加密的好不好,取决于你如何调用加密模块,如何把加密模块和你的程序有效地融合在一起。恐怕没有几个解密者会分析加密库的内部情况,他只要了解接口就行了。

        由于芯片价格的下降,目前的加密锁采用了用于智能卡的芯片。从理论上来说,这种加密锁可以搞得不可解密。但这是从理论上说,实际上没有什么人可以把加密锁用到这种地步。还是上面的问题,你必须把接口混淆到解密者无法理解的程度才行。你总需要判断接口调用返回的数据吧!想一想,像acdsee这样难做的注册机都有人不辞辛苦地分析出来,一般人做的加密锁判别,解密者手中,用ida分析后,几乎是一目了然了。不清楚的地方再用od动态跟踪一下就基本上搞定了。特别是,加密锁公司的模块,多半没有什么反跟踪功能,即使用他们的exe pack压缩一下,也是很容易脱壳的,几乎无法防止ida分析和od跟踪。

       说了半天,结论在几千年前就有了。就是大家都知道的普遍真理,矛盾是普遍存在的,需要努力斗争才能克服矛盾。也就是说,克服被解密的矛盾需要你花大功夫。没有什么好的办法让你轻松地解决这个问题,请大家牢记这个真理。

        我只能给大家两条建议:

        1.  自己好好研究一下解密,自学成才成为加密高手
        2. 请教加密高手,让他们帮你加密

        至于具体加密的时候有什么技巧呢,下面几条比较重要
 
   1. 像vb vf pb 这样的script语言比较难解密,可能的话采用一下
   2. 对于编译型语言,一定要把判据弄得多一些,分散一些,代码乱一些。这和软件工程的思想正好相反。乱到你自己都看不懂了,别人反编译以后就更难看懂了。
   3. 如果用c c++的话,用局部的函数指针来调用加密函数。多用全局变量,最好用结构里的某一位作判据,而不是单一的int。

   4. 加一些垃圾代码混淆视听
   5. 让你的加密算法在不同的机器上有不同的表现,这样在某一机器上解密的东西,就很难在其他机器上使用。比如根据机器的特征生成一些数据,然后再使用这些数据。
   6. 给自己的程序加一个壳。建议使用aspr2.0,使用里面的sdk和壳通信,采用所有的选项加密。
   7. 十分渴望不被解密而又不怕兼容性不好的话,采用xprotect.

   技巧 很多,也不容易很条理地说全。我想即使说全了,大家没有实际体会也不容易弄明白。而且,说得容易做起来难。最后再重复一下,没有什么好的办法让你轻松地解决这个问题。

    

阅读全文
0 0

相关文章推荐

img
取 消
img