注册 登录
编程论坛 VC++/MFC

软件防破解的一种思路(暗桩的一种)

wsg1212 发布于 2015-05-06 17:42, 13854 次点击
软件防破解的一种思路(暗桩的一种)

我的一个软件(518抽奖软件),开发的时候,怕用户盗版,还怕用户用了盗版出了问题还怨我们软件不好。 要找到一种识别盗版的好方法、方法要准确。

所以想到盗版软件都修改软件的菜单、窗口里面的文字,去掉购买菜单等。所以软件就检查自己的菜单、窗口是否被修改过,如果修改就是盗版,然后在合适的机会让软件罢工,逼迫用户购买 :)

当然了,如果遇到高手还是会破解,但是一般小白破解的可以防止了。

大家一起交流,这是我的网站:http://www.
10 回复
#2
贸易飞飞2015-05-11 09:25
其实,使用数字签名技术更好,如果程序被人重新编译过,就能被程序在自检时立马发现,然后,就……………………
#3
诸葛欧阳2015-05-11 09:32
现在破解的软件很多,而且功能还是挺稳定的。遇到高手很难防得住啊
#4
贸易飞飞2015-05-11 11:08
以下是引用诸葛欧阳在2015-5-11 09:32:56的发言:

现在破解的软件很多,而且功能还是挺稳定的。遇到高手很难防得住啊



从理论上讲,数据加密容易解密难,但软件却相反,软件破解容易加密难。
所以,天下没有破解不了的软件,甚至没有很难破解的软件,只是看有没有人、值不值得有人去破解。
顺便说点题外话,一个软件真的有人很想去破解,大家千方百计要去破了它,那作者肯定发达啦。破解的越多,作者收钱也越多,呵呵。

理论上,软件加密,无非就是逼迫用户注册。
用户注册,无非就是输入用户名+序列号、机器码+注册码等。

用户名+序列号是最原始的,最容易对付的,也是好的软件最通用的(破解越多,作者收钱越多),大家共用用户名与注册码即可,我想,我们很少有人没干过这事吧。

机器码,其实也很好办,交钱买个注册码,然后,在新机器上,当程序去读机器码时,进行拦截,把合法注册的那台机器的机器码输入给它,然后让他再去读原来机器对应的注册码,OK,蒙混过去啦。

关于软件防修改,进行自身的MD5自检,也是一种办法,可以检查一下程序是否被人擅自修改过。
破解方法也同机器码,在自检时进行拦截,输入原来正常的MD5,从而蒙混过去。

戏法人人会变,巧妙各有不同。
原理虽然很简单,但作者仍然有一定的技巧来对付破解者,至少使得对方不能那么轻易地得手。
本来这个周末就想写点这方面的,但发帖后看大家兴致不高,故扔下了,有空再接着讲。
#5
qq12066951902015-05-11 11:14
#6
AleTiff2015-05-11 13:09
不错,不错,很感兴趣的,能不能详细讲讲?比如:

为什么说:
从理论上讲,数据加密容易解密难,但软件却相反,软件破解容易加密难


文中提到的用 MD5 校验,是指加载后校验还是磁盘文件校验?假如不是指磁盘文件校验的话,能不能也大致介绍一下?

另外还特别感兴趣拦截方面都有哪些方法,一般都是使用什么样的工具的。
#7
贸易飞飞2015-05-11 18:54
为什么讲数据的加密容易而解密难,是因为数据加密时,加密算法是经过选择的,算法利用密钥去加密(含知道密钥的人,去合法地解密),他就是一种普通的数学计算,不管算法有多么复杂,但总是可以在有限的步骤里计算出结果来的,而对破解都来讲,算法本身的要求就是————如果不知道密钥,无法从数学的角度,通过有限的步骤来反向计算,只能一个数一个数地试。
    如RSA算法,知道密钥(用私钥签名解密,或者知道公钥来验证签名),进行相应的计算,都是比较容易的,而如果不知道密钥,现在的办法,除了一个数一个数地去试,就只能分解一个很大的数,而这是很难的。
    如果你不了解RSA,我换个表达方式,可能不太贴切,但也能说明这个问题:你用MD5工具,去计算一个文件(如A.txt)的MD5值,这是很容易的,计算后,现在你知道了A.txt的MD5是多少(假设是XXX),但你不告诉别人A.txt这个文件,只是告诉别人,有一个文件,它的MD5是XXX,让别人来猜,这个XXX对应是文件是什么,那别人是很难办得到的。

    数据加密算法的原理,分两类,对称密钥与不对称密钥,原理上有很大的差异,很难在本文当中展开,但总体而言:对合法用户(知道密钥的人),计算是简单的、有限步骤的,而对非法破解者,是很难倒过来推演,从加密结果,反过来计算出原来的明文数据的。




    程序的MD5自检,是指程序启动后,对磁盘当中的程序文件求MD5,然后再与事先知道的正确的MD5进行比较。
    比如,你的程序文件名为“518抽奖.exe”,那么,程序启动后,找到磁盘当中的这个文件,计算一下他的MD5。当然,这个MD5值不可能事前就写入程序当中,因为源码没有编译前,你也不知道最后程序的MD5是多少。这个MD5可以与到另外一个文件当中,如“518抽奖.ini”,然后对这个ini文件进行数字签名。程序启动后,计算出来了程序文件本身的MD5,再读取ini数据,进行数字签名比对(数字签名是无法伪造的)。
    如果别人修改了程序,则“518抽奖.exe”的MD5必然发生变化,与“518抽奖.ini”当中的数字签名无法匹配。而“518抽奖.ini”使用了数字签名,别人又是无法自行修改伪造的。

    我不懂VC,但略懂点加密算法与VB,在VB版前几天发了一个源码示例《一个关于要求用户注册(保护程序版权)的VB6示例》https://bbs.bccn.net/thread-444829-1-1.html,本来打算第二讲就是要讲如何进行通过自检MD5,防止程序被修改的。这是第一部分,讲如何把程序与硬件(示例是硬盘,当然也可以是主板、网卡等)锁定的,就是通常讲的机器码注册。

    关于拦截,是这样的,“难都不会,会者不难”,有许多办法,也有许多工具,我不搞这块,我知道原理,但具体操作不清楚,应该能在网上比较容易地找到资料与工具。
    戏法人人会变,巧妙各有不同,就在这儿啦。
    如果别人知道你利用了什么(比如我的那个示例,知道你利用硬盘的序列号),则可以针对性的,监控到程序去读硬盘序列号的动作,从而进行拦截,输入一个别的机器上已经注册的公用序列号。而对于程序作者而言,就是要摆迷魂阵,不让别人知道你利用了什么数据,不知道该去拦截那个数据。
#8
AleTiff2015-05-12 10:54
嗯,原来是这样,谢谢,明白了。我最初以为之所以数据本身不好解,程序本身容易解的原因,是因为程序本身无非就是个PE结构,不仅有标准格式,还最终要加载到内存让CPU执行,所以结构上已经是没有秘密可言。而且很多时候,程序代码就算使用了复杂的加密运算,最终还是要在加载的时候自己帮它解开。嗯,这个我了解了。

程序自身对自身的磁盘文件做数字指纹的方案我觉得不太好,因为可以简单地修改程序,然后把修改后的新程序的校验值放入 ini 文件里,这样,当程序去读取校验值的时候,它会读到被修改后的校验值,而这个校验值与被修改过的程序文件产生的校验值是吻合的,于是程序还是无法知道自己已经被修改。这还是复杂的,简单一点,可以直接利用 FileMon 定位到 ini 读取的代码,然后插入一些代码,禁止程序原来的流程去读取 ini 做数字校验,代之以直接返回数值校验正常的信息。

不过,很多时候都不用去修改原始程序,程序总是要执行,要么正常执行,要么异常执行,执行的过程会留下很多痕迹,比如读了什么文件、打开了几个句柄、启动了几个线程、有没有陷入异常处理、有没有弹出对话框...

总的来说,这是个很大的话题,但还是感谢你的回答。
#9
贸易飞飞2015-05-12 14:53
可以简单地修改程序,然后把修改后的新程序的校验值放入 ini 文件里,这样,当程序去读取校验值的时候,它会读到被修改后的校验值,而这个校验值与被修改过的程序文件产生的校验值是吻合的

    是的,这就是我前边讲的,与机器码相同的原理,破解者拦截输入。你的这个思路,其实都不用拦截了,直接把修改后的校验值(放置在INI文件里)改写掉,更省事。
    所以,通常的应对,就是我说的,要用到数字签名技术。INI文件当中不是直接放置的校验值原文,而是放置的校验值的数字签名,而数字签名,是别人无法伪造的,除非他窃取了你的密钥。

    当然,说到这儿,话题又要拉开了,那验证数字签名的公钥放哪里?
    放外边(如INI文件中),又可以被别人直接给修改了,固定在程序里边,虽然难点,但别人还是能改呀。
    呵呵,矛与盾,就是这样,一攻一守。
#10
a13369838712018-05-09 02:52
我有一种非常有效的反破解方法: 将重要指令不要在客户端直接传送,直是通过服务器网关中断,具体见链接。


 参考: https://user.qzone.
#11
a13369838712018-05-09 02:53
(1)    明白一件事,破解者能做什么?不能做什么?

我的理解:破解者能编辑修改可执行文件的极少部分内容,如去除一段判断条件,修改一个控制符、将变量变为常量。

他们不能做什么?他们并不能在exe中添加复杂的业务逻辑。

有了这个思路就好办了。我把部分逻辑放到服务器上。这样不就行了。

 

(2)你的程序一定不要搞完全的单机版本。一定要和服务器做某做耦合。

(3)客户端与服务器通信HTTP协议一定不要用明文,要进行加密后进行传输。要弄得神仙都认不得。否则Fiddler得容易被侦测到。(我自己的方式是:对base64加密,然后再执行自己写一个二次加密算法,进行错综移位。且根据随机状态位的不同,移位方式不一样。一共设置100套移位方法)。

(4)一定要对客端端环境建立监控,且软件在运行过程中最好也做检测。而不是打开软件或登录时检测一次。(记录好客户IP、地市、MAC地址、碰盘ID、CPU、操作系统类型与版本、软件安装目录、是否为虚拟机等等。还有很多可以收录:如碰盘分区模式、磁盘大小)。

没有这些信息,即使用破解者你也是瞎子,都不知道你的软件已经被破发。

而有了这些信息,软件被破你可以在第一时间知道。可以进一步在服务器进行拉黑处理。

 

(5)关键行为网关。之里之所以称为“网关”,寓意对界面操作行为的控件(另一方面可能也因自己在电信行业工作几年,长时间接触电信协议有关)。不要让上一步操作直传到下一步操作。而是通过服务器绕一下,并在服务器做一下转换。如在发送方数据装为A, 在服务器转换为B格式,而“下一步”操作直接处理B格式。

这就像七巧板一样,软件被破了,可发现脱离了服务器犹如七巧板少了一块,无论怎么破都没办法的。

 

(6)事件请求与事件处理必须分隔在线程或进程中执行。不要直接(特别是用C#、.net的程序员要注意:可能习惯了双击UI, 编程软件自动创建一个处理函数)。  ===》必须做到UI与处理分离,请求与响应分离。

 

 

(7)做好版本协商,且软件开启的第一时间做版本协商。

 

(8)自定义协议方面,大家有兴趣可以参考《中国电信业务网络设备技术规范-移动增值业务信令监测系统接口规范(V0.5.0)》,百度上搜索可下载。

 
具体参考: 参考: https://user.qzone.

 
1