如何防止软件被破解?
到底是魔高一丈?还是道高一丈?破解与防破解之间就像矛与盾一样,自第一个软件上线那天起,这就是个永恒的话题。
在牛的团体也无法避免自己软件被破解,这点不是技术问题,而是信息化的时代的产物,软件基于二进制存储在系统中,要运行就要系统平台支持,而系统平台又依赖硬件(CPU、内存等),一些动态调试工具(例如OD)通过截取、读取、修改软件在硬件中的运行轨迹,来绕过一些验证函数,达到破解某项功能的意图。
100%防破解可信吗?新手开发者一直有这个疑问,这么说吧,除非你不发布。完全自用,可以100%防破解以外,只要你发布,那就永远达不到100%防破解。这点可以参照微软官方。微软哪个软件没有破解版呢。甚至,有可能你正在浏览此文章的微软操作系统都是破解的。
那么,网络验证系统如何防止软件不被破解呢?既然无法100%防破解,那么只能从侧面尽可能防止软件被破解。
1、常量保护(基本),软件中的字符串常量,提前经过转化存储,避免明文存放,任何一款调试工具均可以在任何时候读取软件中的常量数据,将字符串通过简单加密后存储即可,分析一个加密过程也是比较耗时的。如果加密成byte(字节集)形式,将更加难以分析。
2、数据加密传输(基本),完全避免明文传输数据,加密强度要够高、加密算法要够安全,密文与明文不可逆加密,例如RSA算法,明文为:123,加密后:MIIBCgKCAQEA0tqKai/==,但RSA算法是无法逆向的,也就是说,即使你知道加密秘钥,也无法从密文逆向到明文。
3、核心数据分开存储,避免数据和软件放在一起,只有正常登录用户才返回,那么退一步说,即使软件被暴力手段进入到主界面,没有核心数据,软件也是无法运行的。因为客户端只是一个空壳,数据全部存放在服务器中,例如QQ,很简单能爆破到好友列表界面,但里面是空的,数据都在QQ服务器存放呢。
4、各种暗装,暗装是网络验证系统必不可少的一环,在恰当的时机进行验证,如果数据被篡改,立即终止运行,还可附加一些惩罚手段,蓝屏、格盘等等,惩罚手段不要太过,人都是有脾气的,你把破解者玩的一溜够,反而会燃烧起某些人的“斗志”,已经不是时间成本和金钱的问题了,问题就是一定要破解你。
5、加强程序强度,各种防破手段几十余种,运用得当,可抵千军,破解的重要手段就是调试程序,如果程序无法被调试,软件几乎不会被破解,那么如何防止调试,也是考验网络验证或作者软件的重要手段之一,护卫盾网络验证采用近20种防调试手段,协作串行验证,最大限度保证软件不被非法调试。
6、加壳,选择一款强力壳无非是给软件穿上一层保护战甲,壳越强力,被破解几率越低,目前强壳有VMP、SE等,当然不是网上流传那些所谓免费版、破解版的壳。那些你能下载到的,其他人也能下载到,早被分析烂了。如果不舍得花钱,还要强力保护,我只想说,3万块钱只能买个奥拓,买不到奔驰。
7、增加破解成本,如上所述,假如你的软件售价100元,综合以上技术手段,让不法分子要付出一万元的直接、间接成本进行破解,那么还有人会来破解你的软件吗。你可能会说人家就是想突破技术呢?那么网上软件何止千万,怎么就能轮到你呢。
8、向法律靠拢,为破解者施压,如果你的软件是正规软件,可以通过申请著作权等方式,拿到属于自己的法律权利,同时向外界声明非法调试软件的严重法律后果,在一定程度上给与不法分子心里震慑。
9、自己破解自己(1),软件将一些暗装写在程序内,在一些大的平台,自己发布“破解版”供用户下载,满足一定条件触发暗装限制功能,例如“易之表”,一款数据管理软件,被破解后没有明显特征,软件照常使用,各种用户下载破解版,但当满足一定条件时(数据量超过多少条),锁死数据库,只能购买正版解锁。常说数据无价,你是想花个百十块钱享受正版服务,还是以牺牲数据为代价接受使用盗版的惩罚呢。
10、自己破解自己(2),自己发布空壳程序或未破解正版程序到各大下载站,大的下载站转发量是非常恐怖的,短短一两天,甚至当天,搜索引擎首页已经充斥你软件的各种“破解版”,用户的意志力是有限制的,例如我搜某一款软件的破解版,在10个平台下载10款破解版,都是假的,那么我是没有意志再去搜索的下载测试了。事实证明,我的意志力远达不到10次这么多,通常要搜一款软件的破解版,尝试个四五次没有结果,就放弃了。
11、由于Bin文件被反汇编之后成为汇编代码,如果只直接寻址(例如寻址到UID密文0X11111111地址上的数据)那么被寻址的地址是直接在汇编代码上可以看到的,直接通过查找功能就可以锁定读取密文的位置,所以一定要用间接寻址,例如我们要寻址0x11111111,可以制定一个32位数据指针,先让其等于0x11110000,再加上0x00001111,最后等于0x11111111再进行寻址,这样的方法不法分子只能在仿真时严格跟踪R0-R3寄存器,才能发现在哪读取了密文,增加其破解时间成本和难度。
12、大量使用内联暗装,暗装是用来检测本系统是否被修改、破解的功能函数,例如校验MD5,在此特别说明一定要用内联函数 inline,普通函数作为一个反复调用的模块,编译时被存储在bin文件的固定地点,每次调用时会跳转到这个地点运行,如果暗装使用普通函数,那么不法分子只用搞定存储验证函数在软件的这个区域就万事大吉了,那么如果此处被攻破,系统中所有暗装都被破解了,而内联函数在系统编译时会将函数复制在调用的部分成为一个分身,是一块独立部分,如果系统在不同的地方调用了10次内联函数,那么就有10个功能相同的函数在bin内,互不影响,这样可以有效的增加破解的时间成本,狡兔尚有三窟。
13、延迟处决,程序中发现被破解或者动过手脚不要立即惩罚,或者不要有任何实时的处决动作,而是尽可能的延后处决,这个很重要,因为在不法分子自认为破解成功后,会自行测试软件是否能够正常运行,如果此时执行惩罚代码,那么就是告诉不法分子还有地方没有破解完成,需要继续,这个时候需要作者做的就是设置一个延迟处决的代码,当发现软件被动过手脚,先要按兵不动,程序能够正常运行,当系统重新启动N次或者通电时间超过N分钟或其他暗装,在执行惩罚代码段,增加足够的测试周期,极大地延缓测试频率,拖慢脚步,如果此时被误认为已经破解成功。
基于以上,如果你的软件还会被破解,那么创意已经胜过软件本身,这将不是破解与防破的问题了,你防破解做的再好,也无法避免各种仿制。