给自己的软件制作注册码

血色战车 原文 给自己的软件制作注册码

 前言

  从今天起, 您开发的的任何软件如果您愿意都可以为之加密 --为您的软件制作一款注册机!

  当您看完这篇文章时, 您就可以理直气壮的告诉您的用户 : "喂, 想用我的软件是吧 ? 掏钱!".

  呵呵, 这当然只是给自己壮胆的话, 现在连万能注册机都有了, 人家还怕啥 ? 不过只要您想想微软, 人家再牛B的加密技术都会被国人"鄙视"? 但人家不也在中国大把大把的捞钱吗? OK, 不扯了, 我们进入正题.

  同一般的软件注册一样, 我们这里的注册是这样进行的:

  

  1. 首先根据用户的硬件信息生成24位的机器码  
      -- 相当于种子,用于生成随机数
2. 采用注册机根据特征数字生成一个24位注册码
      -- 相当于伪随机数生成器, 输出长度自己定, 最后用一个格式化函数,将随机数映射到ASCII字符集合
3. 用户输入注册码注册成功

  

假设客户很喜欢您的软件, 也假设他没有破解, 他需要通过以下方式向您取得注册码:

(1).如果他能上网, 他需要把机器码用Email发给您;

(2).如果他不能上网, 他可以把机器码用手机短信的方式发给您.

(3).如果他没有手机, 他可以带着机器码然后坐火车到您的办公室想您要一个注册码.

--第3条只是为了让您看帖子的时候别太枯燥了, 抱歉.

 

现在, 您拿到了客户的机器码后, 如果您同时也收到了他汇的钱,  呵呵, 好像给软件加密就是为了要钱吧? 那么您就可以用客户的机器码生成一个唯一的注册码再用同样的方式给用户, 最后, 用户输入注册码即可!

需要强调的是客户机器的硬件信息获取方式是有很多种选择的. 这里我们选择最放心的两个硬件: CUP的序列号和硬盘的卷标号. 好了, 下面您就可以一步一步制作一款软件注册机了. 

 

实现步骤

步骤一: 获得CUP序列号和硬盘序列号的实现代码如下:

获得CPU的序列号

复制代码
publicstring getCpu()  
{  
    string strCpu =null;  
    ManagementClass myCpu =new ManagementClass("win32_Processor");  
    ManagementObjectCollection myCpuConnection = myCpu.GetInstances();  
    foreach( ManagementObject myObject in myCpuConnection)  
    {  
        strCpu = myObject.Properties["Processorid"].Value.ToString();  
        break;  
    }  
    return strCpu;  
}  
复制代码

 

取得设备硬盘的卷标号

复制代码
publicstring GetDiskVolumeSerialNumber()  
{  
    ManagementClass mc =new ManagementClass("Win32_NetworkAdapterConfiguration");  
    ManagementObject disk =new ManagementObject("win32_logicaldisk.deviceid=/"d:/"");  
    disk.Get();  
    return disk.GetPropertyValue("VolumeSerialNumber").ToString();  
}
复制代码

 

步骤二: 收集硬件信息生成机器码, 代码如下:

生成机器码

复制代码
privatevoid button1_Click(object sender, EventArgs e)  
{  
    label2.Text = getCpu() + GetDiskVolumeSerialNumber();//获得24位Cpu和硬盘序列号  
    string[] strid =newstring[24];//  
    for (int i =0; i <24; i++)//把字符赋给数组  
    {  
        strid[i] = label2.Text.Substring(i, 1);  
    }  
    label2.Text ="";  
    Random rdid =new Random();  
    for (int i =0; i <24; i++)//从数组随机抽取24个字符组成新的字符生成机器三  
    {  
        label2.Text += strid[rdid.Next(0, 24)];  
    }  
}  
复制代码

 

步骤三: 使用机器码生成软件注册码, 代码如下:

 

复制代码
publicint[] intCode =newint[127];//用于存密钥  
publicvoid setIntCode()//给数组赋值个小于10的随机数  
{  
  Random ra =new Random();  
  for (int i =1; i < intCode.Length;i++ )  
  {  
  intCode[i] = ra.Next(0, 9);  
  }  
}  
publicint[] intNumber =newint[25];//用于存机器码的Ascii值  
publicchar[] Charcode =newchar[25];//存储机器码字  
  
//生成注册码  
privatevoid button2_Click(object sender, EventArgs e)  
{  
  if (label2.Text !="")  
  {  
  //把机器码存入数组中  
  setIntCode();//初始化127位数组  
  for (int i =1; i < Charcode.Length; i++)//把机器码存入数组中  
  {  
  Charcode[i] = Convert.ToChar(label2.Text.Substring(i -1, 1));  
  }//  
  for (int j =1; j < intNumber.Length; j++)//把字符的ASCII值存入一个整数组中。  
  {  
  intNumber[j] = intCode[Convert.ToInt32(Charcode[j])] + Convert.ToInt32(Charcode[j]);  
  
  }  
  string strAsciiName =null;//用于存储机器码  
  for (int j =1; j < intNumber.Length; j++)  
  {  
  //MessageBox.Show((Convert.ToChar(intNumber[j])).ToString());  
  if (intNumber[j] >=48&& intNumber[j] <=57)//判断字符ASCII值是否0-9之间  
  {  
  strAsciiName += Convert.ToChar(intNumber[j]).ToString();  
  }  
  elseif (intNumber[j] >=65&& intNumber[j] <=90)//判断字符ASCII值是否A-Z之间  
  {  
  strAsciiName += Convert.ToChar(intNumber[j]).ToString();  
  }  
  elseif (intNumber[j] >=97&& intNumber[j] <=122)//判断字符ASCII值是否a-z之间  
  {  
  strAsciiName += Convert.ToChar(intNumber[j]).ToString();  
  }  
  else//判断字符ASCII值不在以上范围内  
  {  
  if (intNumber[j] >122)//判断字符ASCII值是否大于z  
  { strAsciiName += Convert.ToChar(intNumber[j] -10).ToString(); }  
  else  
  {  
  strAsciiName += Convert.ToChar(intNumber[j] -9).ToString();  
  }  
  
  }  
  label3.Text = strAsciiName;//得到注册码  
  
}  
}  
else  
{ 
MessageBox.Show(
"请选生成机器码","注册提示"); } }
复制代码

 

步骤四: 用户输入注册码注册软件, 演示代码如下:

 

复制代码
privatevoid btnRegist_Click(object sender, EventArgs e)  
{  
    if (label3.Text !="")  
    {  
        if (textBox1.Text.TrimEnd().Equals(label3.Text.TrimEnd()))  
        {  
      
        Microsoft.Win32.RegistryKey retkey = Microsoft.Win32.Registry.CurrentUser.  
        OpenSubKey("software", true).CreateSubKey("ZHY").CreateSubKey("ZHY.INI").  
        CreateSubKey(textBox1.Text.TrimEnd());  
        retkey.SetValue("UserName", "MySoft");  
        MessageBox.Show("注册成功");  
        }  
        else  
        {  
        MessageBox.Show("注册码输入错误");  
          
        }  
      
    }  
    else { MessageBox.Show("请生成注册码","注册提示"); }  
   
}  
复制代码

 

我平时整理的一个生成机器码的类,大伙看看.

 

复制代码
using System;   
using System.Management;   
using System.IO;   
using System.Runtime.InteropServices;   
using System.Security.Cryptography;   
using System.Text;   
using Microsoft.Win32;   
  
namespace YiSheng   
{   
/// <summary>   
/// register 的摘要说明。   
/// 注册软件所用到的类   
/// </summary>   
  
public class SoftKey   
{   
#region 获取cpu序列号 硬盘ID 网卡硬地址   
/// <summary>   
/// 获取cpu序列号   
/// </summary>   
/// <returns>string </returns>   
public static string GetCpuInfo()   
{   
  string cpuInfo = "";   
  ManagementClass cimobject = new ManagementClass("Win32_Processor");   
  ManagementObjectCollection moc = cimobject.GetInstances();   
  foreach (ManagementObject mo in moc)   
   {   
    cpuInfo = mo.Properties["ProcessorId"].Value.ToString();   
   }   
   return cpuInfo.ToString();   
}   
  
/// <summary>   
/// 获取硬盘ID   
/// </summary>   
/// <returns>string </returns>   
public static string GetHDid()   
{   
   string HDid = "";   
   ManagementClass cimobject1 = new ManagementClass("Win32_DiskDrive");   
   ManagementObjectCollection moc1 = cimobject1.GetInstances();   
   foreach (ManagementObject mo in moc1)   
   {   
    HDid = (string)mo.Properties["Model"].Value;   
   }   
  return HDid.ToString();   
}   
复制代码

 

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。


    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/6017237.html ,如需转载请自行联系原作者




  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值