验证注册码是保护软件产品产权的常用手段。一般过程如下,

1、  软件发行者收集用户特有的信息;

2、  根据用户特有的信息,使用注册机生成注册码并把注册码发给客户;

3、  向软件导入注册码,由软件自己验证注册码的正确性。

这个过程是如何实现的呢? 我写了一个简单的实现,供大家研究。因为是初次进入这个编程领域,希望高手们给我更多的指导。

第一步利用用户的机器名生成客户特有的认证码

代码如下:

1>> MD5CryptoServiceProvider provider1;

2>> byte[] array1;

3>> string text1;

4>> string text2;

5>> byte num1;

6>> byte[] array2;

7>> int num2;

8>> provider1 = new MD5CryptoServiceProvider();

9>> array1 = provider1.ComputeHash(Encoding.Default.GetBytes(Environment.MachineName));

10>> text1 ="ENTOPYMICROSYSTEMSDEVINIMMUHENDISLIK231456789ACD23456789AEFABGHJKLMNPRSTUVWYZXAHMETALIAKKASHAKANESKICI";

11>> text2 = string.Empty;

12>> array2 = array1;

13>> for (num2 = 0; (num2 < array2.Length); num2 = (num2 + 1))

14>> {

15>> num1 = array2[num2];

16>> text2 = string.Concat(text2, text1.Substring((num1 % text1.Length), 1));

17>> }

18>> this.txtMachineCode.Text = text2.Substring(0, 10);

首先,我们把用户机器上得到的机器名字串用MD5计算出一个哈希值,参见第9行。

比如,如果MachineName = “WORKGROUP”的话, 我们得到了一个16字节的整数数组:array1{61,2,205,140,186,38,191,108,238,218,125,4,55,81,100,215}。

然后,我们分别使用16个整数,到密码字典(第10行,text1就是一个密码字典)中找到对应的字符,然后把找到的这16字符连成字符串,就得到了认证码。

注意点:

1、  这里的密码字典的定义方法很容易被反编译,大家可以使用其它更隐蔽的方法;

2、  密码字典的长度有限,我这里使用了模除,参见第16行;

3、  本例中只使用了16位认证码的前10位“GTN1L1AMIT”,参见第18行;

最后,用户把他的10位认证码“GTN1L1AMIT”和其它的信息(用户ID:gujinsong, 用户名:gujinsong, 注册类型:0, 公司名: china, 生成时间: 2008/12/8 17:20:32)一起发给了软件发行者。

第二步,软件发行者在收到用户的信息后,按照下面的代码生成了注册码:

1>> stream1 = new MemoryStream();

2>> formatter1 = new BinaryFormatter();

3>> formatter1.Serialize(stream1, this.txtMachineCode.Text);

4>> formatter1.Serialize(stream1, this.txtUserId.Text);

5>> formatter1.Serialize(stream1, cboLicenseType.SelectedIndex);

6>> formatter1.Serialize(stream1, txtUserName.Text);

7>> formatter1.Serialize(stream1, txtCompany.Text);

8>> formatter1.Serialize(stream1, System.DateTime.Now);

9>> array1 = stream1.ToArray();

10>> provider1 = new RC2CryptoServiceProvider();

11>> provider1.KeySize = 128;

12>> provider1.GenerateKey();

13>> provider1.GenerateIV();

14>> array2 = provider1.IV;

15>> array3 = provider1.Key;

16>> transform1 = provider1.CreateEncryptor();

17>> stream1 = new MemoryStream();

18>> stream2 = new CryptoStream(stream1, transform1, System.Security.Cryptography.CryptoStreamMode.Write);

19>> try

20>> {

21>>      stream2.Write(array1, 0, array1.Length);

22>>      stream2.FlushFinalBlock();

23>>      array4 = stream1.ToArray();

24>> }

25>> finally

26>> {

27>>      stream1.Close();

28>>      stream2.Close();

29>> }

30>> stream1 = new MemoryStream();

30>> formatter1.Serialize(stream1, array4);

31>> formatter1.Serialize(stream1, array3);

32>> formatter1.Serialize(stream1, array2);

33>> this.txtLicenseCode.Text = Convert.ToBase64String(stream1.ToArray());

首先,把从用户处得到的信息按照一定的顺序串行到二进制流中,见代码行2~8。其中txtMachineCode.Text是用户的10位验证码“GTN1L1AMIT”。

然后,使用RC2加密算法加密这个二进制流。之所以要使用RC2,是因为加密后的密文需要解密,见代码行9~18。这里的密钥,是由RC2CryptoServiceProvider 随即生成的,见代码行11~15。这个密钥最终以明文的形式与秘文一起组成注册码,并发送给用户,见代码行30~32。本例中我们得到的注册码如下:

>> AAEAAAD/////AQAAAAAAAAAPAQAAAAgBAAACKXfIynazb8FfhVCcacGIX3xxY9X7gis1H48K+WXLzX3erjqisWuGa21BbiMX

>> G7PWGAGBke91WzmAYwqK/vtDbAt25rXNIqhIr5dVamAG/JOelvekZGyORjHjghQ9hnefxKyISKxdFtpA+nlLtAM4CX4AJv6L0Yu

>> khiiRx4ritOrrZ+8WVLV+HSmyOImOgyAHCY6FCkbsmiYyYLEvzVttMO+8p23AMY+Vg9ZrpDzMHIC9dbxIcxLfWFuII6e8OG1z0IF

>> Utf/8uNkT9v/1Uf5q1v0BxVYMIdAdAUszpAqSYr2DecAgotLom2oFGifZLpc4NbWhazNff8ZxGwYrgp8iD4QjSUi2pTXrCwABAA

>> AA/////wEAAAAAAAAADwEAAAAQAAAAAkwbbXFGqXhtB67KVQTACxwLAAEAAAD/////AQAAAAAAAAAPAQAAAAgAAAACs

>> p9HYZ0Bl6oL

注意点:

1、  因为软件还需要用密钥来解密密文,所以密钥必须明文传递,我还没有想到更好的方法;

2、  我们可以混淆密钥在注册码中的位置,加大破解的难度;

3、  生成的注册码中没有换行符。

第三步,导入注册码。

用户输入注册码时,软件需要验证注册码的真伪。基本上有两种方法:

1、  用密钥解密密文,从而验证用户的注册信息;

这种方法只需要在软件中加入解密代码就可以了,但是他的弊端很多。破解者只要能伪装解密后的信息就可以了。

2、使用密钥,重复生成注册码的过程,后与软件发行者提供的注册码比较,就可以了。这里就不再提供重复的代码了

用C#.NET编写软件注册机的更多相关文章

  1. 【转】破解Source Insight 3.5.0072过程 附:安装软件+注册机

    转载地址:http://blog.csdn.net/qs_hud/article/details/8884867 注册机及软件下载地址:http://download.csdn.net/detail/ ...

  2. 菜鸟 学注册机编写之 Android app

    0x00前言 环境及工具: 手机    Nexus 4(己root) 系统版本    Android 5.01 工具    AndroidKiller_V1.2 关于Android平台app注册机的编 ...

  3. 菜鸟 学注册机编写之 “RSA”

    测试环境  系统: xp sp3 调试器 :od 1.10 RSA简单介绍 选取两个别人不知道的大素数p, q. 公共模n = p*q 欧拉值φ(n) = (p-1)(q-1) 选取公匙(加密匙) e ...

  4. C#:注册机的实现【提供源代码下载】

    代码下载 C#软件注册机 软件运行结果 参考文章 http://www.cnblogs.com/hanzhaoxin/archive/2013/01/04/2844191.html

  5. 010 Editor 8.0.1 之 逆向分析及注册机编写

    前言一.工具及软件介绍二.逆向分析2.1.找到提示错误注册弹窗2.2.分析跳转处代码2.3.=2D 函数分析2.3.1.获取注册码处分析2.3.2.3处分支分析2.3.2.1.9C情况2.3.2.2. ...

  6. 菜鸟 学注册机编写之 “MD5”

    测试环境  系统: xp sp3 调试器 :od 1.10 sc_office_2003_pro 高手不要见笑,仅供小菜玩乐,有不对或不足的地方还请多多指教,不胜感激! 一:定位关键CALL 1. 因 ...

  7. 转:Autodesk 2017软件下载+注册机+破解方法(持续更新)

    转载自http://blog.sina.com.cn/s/blog_710225790102w03e.html Autodesk 2017安装步骤: 安装Autodesk 2017相关软件 使用序列号 ...

  8. C#软件授权、注册、加密、解密模块源码解析并制作注册机生成license

    最近做了一个绿色免安装软件,领导临时要求加个注册机制,不能让现场工程师随意复制.事出突然,只能在现场开发(离开现场软件就不受我们控了).花了不到两个小时实现了简单的注册机制,稍作整理.        ...

  9. OD 实验(十八) - 简单注册机的编写

    程序: 运行 这是一个注册机 随便输入点内容,点击 Check 弹出错误的对话框 逆向: 用 OD 载入程序 在文本框处下断点 按 Alt+B 查看断点 这个断点在动态链接库那里 跑一下程序,输入内容 ...

随机推荐

  1. Permissions 0664 for '/home/root/.ssh/id_rsa' are too open.

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY @ @@@ ...

  2. python+selenium实现跨浏览器兼容性测试

    python https://www.python.org/ python是一种脚本语言, 易学易用,可以助你快速实现业务逻辑,高效集成系统. ----- http://zh.wikipedia.or ...

  3. weblogic对jms实现的QueueConnection实现与TopicConnection实现问题

    今天看了一段之前同事写jms的代码,觉得好像不对,但是不可能,生产上用的代码.刚开始想了下,脑子没转过弯来,后来一想是个简单的问题 代码如下: topicConnection = (TopicConn ...

  4. M面经Prepare: Find integer Average of 2 integers.

    The definition of integer average is the highest smaller integer if average is floating point number ...

  5. __int64和long long输入输出

    __int64 num; scanf("%I64d", &num); printf("%I64d\n", num); long long num; sc ...

  6. oracle 内外连接,左连接,右连接 区别

    首先讲解一下 on 与where后面接的条件的区别 on和where条件的区别如下:1. on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录.2.where条件是在 ...

  7. HDU 5002 Tree(动态树LCT)(2014 ACM/ICPC Asia Regional Anshan Online)

    Problem Description You are given a tree with N nodes which are numbered by integers 1..N. Each node ...

  8. java数组转化成集合

    package com.shb.web; import java.util.Arrays;import java.util.List; import com.sun.xml.internal.ws.u ...

  9. 南阳oj27题

    水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上 ...

  10. 关于wxwidgets图形界面的关闭窗口的按钮无效的解决办法

    这是使用wxsmith设计界面时的情况,如果用纯代码写的界面,关闭按钮就很奇怪地有效 道听途说,窗口的关闭是由一个方法控制着.大概是这样的: void PlainFrame::OnClose(wxCl ...