软件防破解的一些方法和思路总结
最近需要这方面的东西,然后自己在网上找,顺便记录一下,以下内容有来自其他前辈的,也有我自己的心得。
吾爱破解挖到2条有用的。
1、试用版就是试用版
软件发布的时候,放出的是试用版,客户付款后,才会发正式版,这样会很大程度上减少破解。如果有人花钱买你的正式版去破解软件,那就认了。所谓的试用版,即功能不完整,例如数据采集软件,试用版就不要写导出数据的代码,这个导出代码只有在正式版里有。或者试用版只能采集100条,只有100次循环。
2、暗桩
你可能用来以防止破解的算法比较简单,但这并意味着你就不能有效的阻止破解,我们照样可以用简单的算法把破解者弄奔溃掉,我的软件用了5种破解算法,每种算法都不是很复杂,估计单个破的话也就10来分钟的事情,但我的做法是没有将所有算法全部用于同一时间同一处进行注册码的验证,而是分散到软件的不同功能,不同时间来验证,有的是软件启动,有的是点某个按钮的时候,有的是当时间达到某个条件的时候,破解者往往是把软件启动时候的验证给破掉,但是他在使用过程中[url=]3[/url]又会经常随机的遇到很多验证失败的提示,而且这些过程随机,可能除了作者,没人知道这背后有多少处验证,这些验证又是什么时候触发,所以这种做法能让破解者抓狂的说。另外很多破解者仅仅是为了破解而破解,自己本身又不用被破解的软件,往往是启动阶段的验证一破解掉,就认为大功告成的开始发布“成功”破解版。
知乎精彩回答
链接:https://www.zhihu.com/question/29372527/answer/44133481
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
因此,cracker总是乐此不疲的破软件,一个个软件接连被破,开发者看在眼里,疼在心里。
当开发者知道了这一切的来龙去脉之后,开发者就会想办法去阻止破解的行为,阻止的方法无非就是给破解的过程增加难度和干扰。
于是,壳诞生了。
壳可以将一个程序给套在里面,可以非常直观的理解为一个程序的外壳。开发者加的外壳,一般都是一些保护壳,到目前为止还没有发现为了防破解而给自己的软件加单纯的压缩壳的。
保护壳的保护机理一般都是反调试器、反虚拟机、垃圾指令、代码虚拟化(或者混淆)等,程序运行起来是没有什么太大问题的,但是让一个cracker的逆向过程变得异常艰辛。
但是加壳有了,相对应的脱壳也就会出现。由于壳的滥用,这引起了一些cracker大牛的注意。cracker大牛通过分析壳的运作机理,模拟壳的环境,通过隐藏调试器等方式躲过壳的反调试功能。毕竟能运行的东西总是理论可修改的,在大牛们的研究下,一个个脱壳机或者脱壳教程就这么出现了。直到现在,加壳和脱壳之间的较量,仍然是那么激烈……
既然壳被脱了,开发者还是不甘心。于是想到了暗桩。
暗桩代码,一般正常使用情况下是不会触发的。它到底是什么呢?它有可能是一小段自校验代码,在你修改了他的程序之后,程序发现自己被修改而自动退出。也可能是一小段警告代码,给你来个小的框框,提示“XXX你个逗13别修改我的程序!”这类的东西。心怀恶意的开发者则是喜欢使用威力更大的东西,比如给你来个蓝屏,格式化你的硬盘,给你加硬盘锁(江民硬盘锁是典型的例子),或者是潜伏一段时间,当你的程序使用一段时间后突然清空程序中的全部数据,让你损失惨重。
暗桩无疑是cracker们最头疼的问题,当然有了暗桩,就有相应的去暗桩手段。cracker为了防止这类代码的破坏,总是喜欢在虚拟机内搞这些东西,即便是不幸中招,也可以利用虚拟机的快照来实现时光倒流。而去暗桩的手段无非两种,第一是摸清楚所有的暗桩,尽量不去触发它;第二是和破解软件一样,硬性修改这些代码。
就这样,本地验证逐渐的没落了……
云的时代正在崛起。
有一些软件,本身代码是不全的,比如软件下载下来就是一个试用版,相应的功能根本就没有,当你购买了这个软件之后会给你一个完整版的软件。
这下可好,除非cracker去入侵开发者的服务器,或者是共享自己的已付费版,否则是没法破解这个软件的。
同样的道理,有些软件代码也是不全的,但是和上面的方式有点不同——它依赖于网络来工作。一些数据的处理和计算,是在服务器上进行的。比如图片云识别,当你购买了这个服务之后,你就可以在软件上登录你的账号,然后将一张图片通过这个软件发到服务器上去,服务器验证了你的授权信息有效之后进行识别,并将识别结果返还给你。而整个核心的过程没有在你的软件上实现,又谈何破解?
破解的方法一样,除非cracker去入侵服务器,否则没有办法破解的。
但是,你会发现,无论是什么样的软件,都是理论可破解的。即便是云计算,cracker还有最后一招,入侵服务器。
也就是说,破解软件不是不可能,而是一个时间问题和价值问题。假设一个付费软件做的非常赞,破解它要花费一年多的时间,而作者的定价仅仅是1元就可以终身免费,那么谁还会花那么多时间去破解这个软件呢?
所以说,话归到底,每个软件都是理论可破解的,破解它只是一个时间和价值问题。看雪论坛的
1、检测调试寄存器
(1)检测 softice 等系统级调试器
检测softice的方法有很多.检测主要在驱动里中实现。
(2)监测用户级调试器用户级调试器具有一下几个特征:
用户级调试器是采用microsoft提供的dbghelp.dll库来实现对软件跟踪调试的。
被调试的软件其父进程为调试器。
所以可以采用如下的方法来检测:
a.调用api函数isdebuggerpresent()(或是直接采用isdebuggerpresent的反汇编代码,以防破解者拦截对该函数的调用)来检测是否有用户级调试器存在。
b.监测调试寄存器的方法。
c.采用tlb的方法,检查父进程的方法. 在winnt下,可以采用进程注入的技术来检测软件的父进程是否正确的方法。
d.设置seh进行反跟踪。
由于破解者者可以拦截软件对调试器的检测操作,所以将保护判断加在驱动程序中。因为驱动程序在访问系统资源时受到的限制比普通应用程序少得多,这也给了破解者增加了破解的难度。
2、crc检校
增加对软件自身的完整性检查。这包括对磁盘文件和内存映像的检查,以防止破解者未经允许修改程序以达到破解的目的。dll和exe之间可以互相检查完整性。
为了防止破解者采用替代word,以及edocguard的dll,通过计算dll的crc值来验证。
3、运行时库的重新编写
破解者往往是在hmemcpy,strcpy等运行时库函数上下断点,通过分析其中的字符串来窥视程序的内部运行。对于edocguard,虽然不是密码的处理,但是内存解密的部分就是使用的memcpy,所以需要重新编写这些运行时库,这个可以从vc或其他编译器的运行时库中的代码改写获得。
需要修改的是vc6_encry_lib,clinetfile里面,hook dll里面的readfile,驱动里的解密。
4、花指令的添加
用花指令来对付静态汇编是很有效的,这会使解密者无法一眼看到全部指令,杜绝了先把程序打印下来再慢慢分析的做法。
一条指令的长度是不等长的,假使有一条指令为 3 字节长,从它的第二个字节开始反汇编,会看到一条面目全非的指令,‘花指令’就是在指令流中插入很多‘垃圾’,使静态反汇编无法进行。
5、干扰代码的添加
在关键部位添加jmp nop cmp 等跳转指令,比较指令以及一些没返回的循环等。插入这些大量无用的运算以误导解密者,防止静态反汇编,增加破解者动态汇编时难度。
到处贴条件转移
没有循环,只是跳转,作为有条件的路障,这样,没有简单的反向操作可以执行。
6、api函数的不规则调用
在软件中对于api的调用不采用直接调用api的方法,因为这样破解者很容易了解到软件所调用的api,进而了解到软件的工作流程。可以采用由dll的输出表来定位api的函数地址的方法。
对于调试器来说,在对api设置断点时,是在api函数地址上添加一个int 3指令。所以在调用api时,把api的前几个代码指令复制到调用处,执行前几个代码指令,然后跳转到api函数中。
这样调试器对于api断点的监视是无效的。
7、接口与字符串
dll,com不使用有意义的函数接口.不采用一目了然的名字来命名函数和文件,如openfile( )、setpermisson等。
所有可能被破解者利用的字符串都不以明文形式直接存放在可执行文件中,采用加密的形式,在需要时进行解密。
尽可能少地给用户提示信息以防解密者直接了解软件的流程。比如,当检测到破解企图之后,不要立即给用户提示信息,而是在系统的某个地方做一个记号,随机地过一段时间后使软件停止工作,或者装作正常工作但实际上却在所处理的数据中加入了一些垃圾。
8、输入表输出表拦截的检测
定时检测软件各个模块的输入输出表是否一致,输入表、输出表中的函数地址是否处于对应模块的内存区域中,防止破解者采用hook api 的方法对软件进程破解操作。
9、加壳
软件最终发行之前将可执行程序进行加壳/压缩,使得解密者无法直接修改程序。如果采用现成的加壳工具,最好不选择流行的工具,因为这些工具已被广泛深入地加以研究,有了通用的脱壳/解压办法。另外,采用两种以上的不同的工具来对程序进行加壳/压缩,并尽可能地利用这些工具提供的反跟踪特性。
10、有条件允许使用加密狗,加密狗尽量选最新的,因为许多解密者对于新狗是没有研究的,即使他本人精通加密狗,也需要花费一段时间才能弄懂,这就为你的软件在第一时间销售争取到足够的时间。
11、发布功能不全的软件提供免费试用,正版则要花钱购买。这样即使解密者破解了软件但因为功能不全,他一样相当于什么也没得到,而只有汇款给你的人才能得到功能齐全的版本。
12、推出无需注册的免费软件,这个不是一般人能承受的起的,但是已经有许多人在做了,试想如果你的软件根本不用注册就能使用,那解密的人就会没有软件可破而下岗。同时你的软件也会在使用者中留下良好的口碑。大家都用你的软件,你就会逐渐成为市场的主流,而你的同行恐怕就会慢慢退出市场了。
13、在软件中加入一些程序,使软件在运行一段时间后自动丢失信息或自动销毁或突然死机。如财务管理软件,这样一来使用者会担心自己因为使用破解版本造成巨大损失,而不得不主动购买你的正版软件。
14、
15、上面没有写是想给你们留下广阔的空间,我相信每一位聪明人看了这13条之后都能独立想出一个行之有效的办法来保护你的软件。那这一条就教由你自己来完成了。
最后一条就是联合起来,搞破解的人可以联合,所以他们破一个软件会很容易,因为那不是某个人的智慧而是多个人的智慧,反过来,搞软件研发的人也应该联合起来,这样你们的保护才能不断的完善。采用高难度算法,如果想在算法上更胜一筹就得换成不可逆算法,让破解者找不到头绪。如同走迷宫,我介绍一种方法,不是CRC,因为我是应试教育的受害者,本人数学只会解方程。如果把方程应用到算法中会很有效。比如
设注册码为:X,Y两部分,
x,y的运算过程是:x,y是方程组:
2 3
X Y - X -331 Y =19 编程后为:X*X*Y- X*X*X-331*Y=19
2 2
X Y -X -1312 Y =38
的两根,把你的注册码两部分经过代入方程组中检验,这样破解者推出方程,根本解不出来。
他累死也不会想到 X=26 Y=51,其它值均错误。既你的注册码前一部分是26,后一部分是
51,这样看起来好象并没有多大作用,但是x,y并不完全是固定的数字,可以是你的注册码每一位字母或数字的ascii码相加之和,经过四则运算,再减去一个数的结果。最后x,y的值可以不超过百位数,x,y也就可以按你的需要赋值了。像这样的方程我这里要多少有多少,保证X,Y解全都不一样,当然只是举一个很简单的例子,
真正要去编写是不会写这样简单的流程,我愿意无偿为你提供
多种方程组均带唯一解X,Y值。(本人qq389004625)鲁迅先生说过:世上本没有路,走的人多了也便成了
路,软件本没有算法,研究的人多了,也便成了算法。
或者换个思路,使用指纹或"DNA"识别系统,笔记本电脑很多采用了开机指纹识别,所以小偷盗走,因为没有指纹
密码等于得到一盒废铁。银行的保险柜,有一部分也是采用指纹的,即使有匪徒进入,得不到指纹对应,也会一无所获,软件中也应该加入这样的信息,你的软件只能用特定的指纹
识别,并且指纹随机产生,可以设想,安装上会麻烦一些,第一次运行程序提示你扫描指纹。使用者要有扫描仪,指纹在软件内部随机产生,第一次使用软件,提示注册用的指纹都不一样,而这个指纹的计算规律作者知道,作者计算出指纹,从指纹库中复制一个发送给需要者,软件每次重新安装都会提示输入不同的指纹,并且软件绑定计算机的硬件。软件中加入类似CIH的破坏"基因",三次扫描指纹错误,软件自动重启电脑并直接破坏硬盘引导分区,改写分区表,破坏零磁道,改写G-list,向firmware全部模块中写入错误信息。这样硬盘数据全部丢失,或被完全破坏,在BIOS中显示为0.只有找你才能解决,本人是搞数据恢复的,经常做破坏和修复硬盘的测试,对破坏硬盘数据比较在行。就像你把手机重重扔在地上让它碎了很容易,再想修好它太不容易了。这也是没有办法,只能用对付强盗的办法,免得破解者拿了你的软件翻来覆去地研究。如果遇到这方面的故障我可以帮你们恢复数据,之前我都已测试过,有恢复成功的可能。视恢复程度收取费用了。
如果以上几种方法都做了,所有能想到的办法都用了,仍然没有办法阻止自己的软件被破解,那只好
使用“绝招”了,改行,另谋高就。现在竞争很激烈,利润空间降到了最低点。只靠一种行业养活自己是不行的,破产了,倒闭了之类的事情也都看到过发生过。所以软件同行们,你们也得抓紧时间多学习些其它的技能,或者像我
一样把软件当兼职来做,要不然哪一天你自己的共享软件到了你无力支撑下去的时候,你会选择什么呢?
(大家应该懂什么叫思路吧,思路不是指具体的做法。)