`
javasee
  • 浏览: 961532 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

给软件添加注册码

 
阅读更多

本文宗旨在于提出一种给软件添加注册码的方法。至于所提出的方法是否有效,是否能够经得起一些逆向高手的破解,还得经过验证。我只是提出我个人的看法

一、目标。
    目标很明确,就是根据需要注册软件的个人信息,产生注册码。并且软件本身必须可以校验该注册码是否有效。并且能够防止别人逆向算出校验算法,产生注册机;能够防止别人用暴力破解方法,直接修改软件执行代码,绕过注册。
   
二、方法论述
    要做到以上的目标,有两个方面特别重要。一是,注册码产生算法的选择;二是,要使软件具有自身校验机制,防止可执行程序别篡改。下面我们分别论述这两点。

1. 注册码产生算法的选择
   现在很多软件都存在注册机,很大原因是因为软件本身的注册码产生算法太过于简单。破解人员很容易从反汇编代码中抠出注册算法,并且能够很容易的还原成C代码。这些搞破解的算不上大师,但也可以算得上牛人了。我也曾经了解过相关的知识,看懂反汇编的代码不难,难的是在大量的汇编代码中找到彼此的调用关系,并且能够逆向的写出对应的代码;当然有些懒人直接抠出其中的汇编代码,不用理解详细的执行过程就能达到破解的目的。
   言归正传,不管别人多么NB,他至少要反汇编,至少看的是汇编代码。而如果我们的算法足够强大,他们也就玩完了。纵观如今标准的加密算法,无非就是对称加密和非对称加密。我们也不用去自创算法了,别做些吃力不讨好的事,自己设计的算法,安全性远远比不上现在常用的算法。我先简单列举出常用的算法,并说明为什么要选择我们所要的算法。
   a. 对称加密算法现在流行的有DES,AES两种,DES算法广泛的用在银行行业,AES出现的比较晚,但是安全性比DES好。所谓的对称就是只有一个密钥,加密和解密使用同一个密码,所以称为对称加密。如果我们用它在产生注册码,那么我们的软件中必须保存这个密钥。不管密钥在哪里,总是要存在在一个地方,而我们又没有办法去保证这个密钥的安全性。原因很简单,破解者只要跟下代码,就知道我们从哪里读出来这个密钥。
   b. 非对称加密有RSA,和椭圆曲线等,最流行的是RSA。虽然椭圆曲线效率和安全性比RSA好,但比较复杂,我至今没看明白原理,呵呵。所谓的非对称,是因为它有两个密钥,一个称为公钥,一个称为私钥。公钥是可以对外发布的,而私钥是自己保存的。用公钥加密,必须用私钥解密,反之,用私钥加密必须用公钥解密。所以,我们知道,我们可以在软件中保存公钥的内容,这个是可以公开的(当然,把它隐藏在软件内部是必要的,总之可以造成破解的难度的事情我们都可以去尝试)。然后,私钥我们可以自己留着。别人拿不到私钥,根本计算不出注册码来。
  
2. 至此,我们知道我们可以使用RSA算法了,而且可以保证软件的安全。至少无法产生注册机,因为别人没有私钥。但是具体怎么做,我们可以按照下面的流程。

   a. 注册码产生过程:
      注册信息(包括用户名等信息)---> RSA私钥加密 ---> 注册码。
     
   b. 软件验证注册码过程:
      注册码 ---> RSA公钥解密 ---> 注册信息。
  
3. 解决了第一个目标,我们还是很难防止别人直接篡改2进制的可执行文件,从而绕过注册码的校验。但是,方法总是有的。为了解决这个问题,我想到了一个方法:软件的自我校验。具体的做法是这样的:
   a. 我们为自身的软件产生校验值,这里要使用摘要算法。最常用的摘要算法是MD5,相信大家都听过,这里也就不再详述,我们仅仅需要在软件的执行时,读取可执行程序(在Windows下,自身的执行文件是可读的,但是如果自己要改写自己,那就没办法了)并计算校验值。
   b. 接着,我们可以判断校验值是否正确,如果不正确,我们软件可以直接自杀。
  
   但是这里有个问题,我们怎么在软件中保存正确的校验值呢?不可能保存在文件或者注册表中,这样早晚会被知道的。别人可以直接修改该校验值使之与错误的校验值相同,从而骗过软件的校验。这里有个方法:回归到(第1、2点)中描述的方法。如何回归?我们接着说。

4. 保存软件的校验值:让校验值融入注册码。我们修改(第2点)的过程如下:

   a. 注册码产生过程:
      注册信息(包括用户名等信息)+ 软件校验值 ---> RSA私钥加密 ---> 注册码。
  
   b. 软件验证注册码过程:
      注册码 ---> RSA公钥解密 ---> 注册信息 + 软件校验值。

   这样子,我们就可以这样判断软件是否已经成功注册。首先根据上面步骤,算出注册信息和软件校验值,然后把这两者和当前的用户信息,和计算出的校验值做比较,如果都匹配,说明软件已经被成功的注册。
  
5. 尝试破解。
   如果你知道了详细的过程,如何破解该软件?首先我们知道,已经无法写出注册机来了。唯一的办法是暴利破解,但是暴利破解,软件又加了自我校验。但是,百密总有一疏,暴利破解还是可以达到的。我们先回顾一下,如果我们按照上述的办法添加了注册码校验。那么我们的代码差不多是这么写的:
  
   int RSA_Check( char * sn ){
       该函数计算软件的校验值,根据注册码sn解密出校验值和用户信息,然后比较,返回是否校验通过。
   }
   ....
   在软件的启动时,我们调用上述的函数。
   if( RSA_Check( sn ) ){     <--------------------------①
       在这里,如果校验失败,那就直接exit(0)吧,呵呵~
   }
  
   但是致命弱点就在上述的①位置。因为①位置的汇编差不多是这样的:
   je xxxxx    
   ....
   ....
  
   仅仅是一条跳转语句,那么,破解人员直接将其改成jne或者别的jmp指令就完事了,我们的努力就全废了。既然如此,我们代码绝不能写成这样,或者我们的方法不该如此简单。至少,我们可以这么做:
   1. 不要把校验算法写成一个统一的接口。
   2. 不要仅仅在一个地方做判断。这点其实很简单也很有效,如果你愿意,你可以在软件中对效率要求不高的地方多加几个判断,这对破解人来说是相当痛苦的,至少他无法同时查找到所有的关键位置。只要有一个地方没改成功,那么我们的自我校验就起作用,那么我们就有权利执行后续的动作了。比如,直接删掉本身的程序(当然,这里必须关闭自己,然后调用另一个进程来删除软件)等等。
   3. 更“贱”的方法是,起一个附加的进程,和主进程互相监视,互相校验。如果校验到对方注册异常了,那就杀掉对方,干掉对方的可执行程序。听起来很贱,但是不是有用,俺也不知道。
   4. 如果要防止一个注册码到处使用的情况(中国人都是互帮互助的,呵呵),可以在注册信息中添加目标机器的信息,加入到注册信息中。
   4. 等等的这些方法,就很多了,大家可以自由发挥。
  
三. 总结
   经过上述的论述,我觉得没有绝对的安全,有时如果你的软件不想被破解,那么您就只能诅咒那些不道德的人了。但是我们可以让他们更加痛苦,至少菜鸟是无法随随便便搞破坏的。在中国,写个软就开源,免费吧,别指望拿它来养家糊口了。

0
3
分享到:
评论

相关推荐

    给软件加注册码的工具

    给自己的软件加上注册码,很简单,以后可以用这个限制软件的使用了,呵呵,下载用吧.

    c# wpf实现的软件注册码生成程序

    c# wpf实现的软件注册码生成程序,根据输入的40个字符的机器码生成相应的注册码

    shine注册码 shine注册码 shine注册码

    根据提供的信息,我们可以了解到这篇文档主要讨论的是与“Shine”相关的软件注册码。下面将对这些注册码进行详细的解析。 ### Shine 软件概述 首先,“Shine”很可能是一款图形或视频编辑软件中的插件,特别是考虑...

    一个在网上免费找注册码的好方法

    3. **添加特殊字符**:在软件名称和版本号之后,可以尝试添加一些特殊字符,比如括号、特定的注册码关键词(如94fbr、Serial Number等)或是“激活码”、“keygen”等词组,这样可以进一步缩小搜索范围,提高找到...

    给Exe文件添加注册功能的软件

    这个软件的作用是给一个可以运行的Exe文件添加一个用户注册的窗口,用户运行时会弹出这个注册窗口,并显示用户的机器码,然后根据这个机器码用注册机算出注册码,用户使用注册码注册后,再次运行就不会出现注册窗口...

    PDF软件 附注册码

    在这个描述中提到的“附注册码”,意味着该软件可能不是免费的,但提供了一个注册码供用户激活软件的全部功能。注册码通常由一系列字母和数字组成,输入后可以使试用版软件转变为完整版,或者解锁特定的高级特性,如...

    C#注册码生成

    - **加盐**:为了增强安全性,可以在哈希前添加一个私有“盐”值,使得即使相同的硬件信息也会产生不同的注册码。 - **混淆和位操作**:可以对哈希后的结果进行位操作,如位移、异或等,进一步增加破解难度。 3. ...

    c# 添加注册码试用次数

    在C#编程中,添加注册码试用次数是软件授权管理的一个重要环节,它涉及到软件安全性和用户体验。本文将详细探讨如何实现这一功能,包括获取机器码、加密算法(如DES和MD5)的应用以及注册表操作。 首先,**获取机器...

    Snagit注册码 9.0可用的注册码,已经验证过

    ### Snagit 9.0 注册码解析及软件概述 #### Snagit 9.0 注册码 在提供的信息中,“Snagit注册码 9.0可用的注册码,已经验证过”这一标题明确指出了文章的核心内容是关于Snagit 9.0版本的有效注册码。Snagit是一款...

    镜像文件制作软件uiso9_cn(注册码)

    5. 注册码激活:为了获得软件的完整功能,用户需要通过提供的注册码进行激活。在UISO9_CN压缩包中,包含了“uiso9_cn(注册码).txt”文件,内含激活码,按照提示步骤输入即可。 二、UISO9_CN注册码使用教程 1. ...

    MP3转换器5.2注册码

    2. **授权经销商**:部分软件除了官网外,还会授权给第三方销售平台或实体店铺进行分销,用户可以在这些渠道购买到正版软件及其注册码。 3. **促销活动**:有时,软件开发商会举办各种促销活动,如限时免费赠送注册...

    e2esoft VCam最新可用的注册码

    对于大多数软件而言,注册码是一种授权方式,用来验证用户是否拥有合法使用该软件的权利。对于e2esoft VCam这样的软件来说,注册码是解锁其全部功能的关键。通常情况下,免费版的VCam可能只提供有限的功能,而购买了...

    沙盘软件+注册码下载

    Sandboxie(又叫沙箱、沙盘)允许你在沙盘环境中运行浏览器或其他程序,因此运行所产生的变化可以随后删除。可用来消除上网、运行程序的痕迹,也可用来... 默认只能添加一个沙盘,使用压缩包内的注册码就可创建无限个了

    《家财通》家庭理财软件专业版3.1最新注册码

    《家财通》家庭理财软件专业版3.1的注册码文本文件(《家财通》家庭理财软件专业版3.1最新注册码.txt)很可能是包含序列号和注册码信息的文档。用户在安装软件后,需要找到这个文件,按照提示输入正确的注册码,才能...

    foxit pdf editor注册码.txt

    在探讨“foxit pdf editor注册码.txt”这一主题时,我们深入分析了Foxit PDF Editor软件的注册机制、注册码的组成以及其在文档编辑领域的重要性。以下是对该主题的详细解析。 ### Foxit PDF Editor简介 Foxit PDF ...

    nero刻录软件带注册码

    "nero刻录软件带注册码"的标题意味着这个压缩包可能包含了Nero的安装程序以及能够激活软件的注册码,使得用户可以完整地使用其全部功能,而无需购买官方授权。 Nero的核心功能包括: 1. **数据刻录**:用户可以...

    Ultralso+注册码

    - **合法性**:使用注册码意味着用户尊重并支持软件开发者的工作,确保软件的合法使用,享受官方提供的更新和技术支持。 2. **注册过程** - **安装软件**:首先,从官方网站或可信赖的源下载并安装UltraISO程序。...

    舞蝶飞创意照片制作软件V3.60 注册码

    从给定的信息来看,主要涉及的是“舞蝶飞创意照片制作软件V3.60”的注册码信息。本文将围绕这一主题展开详细说明,包括软件的功能特性、注册码的重要性及如何正确使用等内容。 ### 舞蝶飞创意照片制作软件简介 ...

    舞蝶飞创意照片制作软件注册码

    根据所提供的文件信息,我们可以从以下几个方面来探讨与“舞蝶飞创意照片制作软件注册码”相关的知识点: ### 一、软件介绍 舞蝶飞创意照片制作软件是一款专门为那些不熟悉或不会使用专业图像处理软件(如Photo...

Global site tag (gtag.js) - Google Analytics