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

假设客户很喜欢您的软件, 也假设他没有破解, 他需要通过以下方式向您取得注册码:
(1).如果他能上网, 他需要把机器码用Email发给您;
(2).如果他不能上网, 他可以把机器码用手机短信的方式发给您.
(3).如果他没有手机, 他可以带着机器码然后坐火车到您的办公室想您要一个注册码.
  --3条只是为了让您看帖子的时候别太枯燥了, 抱歉.
现在, 您拿到了客户的机器码后, 如果您同时也收到了他汇的钱, 呵呵, 好像给软件加密就是为了要钱吧? 那么您就可以用客户的机器
码生成一个唯一的注册码再用同样的方式给用户, 最后, 用户输入注册码即可!
需要强调的是客户机器的硬件信息获取方式是有很多种选择的. 这里我们选择最放心的两个硬件: CUP的序列号和硬盘的卷标号. 好了,
下面您就可以一步一步制作一款软件注册机了.
步骤一: 获得CUP序列号和硬盘序列号的实现代码如下:
Java代码
#region 获取cpu的序列号 
public string 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;         

#endregion
#region 获取cpu的序列号
public string 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;       
}
#endregion
Java代码
#region 获取设备硬盘的卷标号 
public string GetDiskVolumeSerialNumber()         
{             
      ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");             
      ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid=\
"d:\"");     
      disk.Get();             
      return disk.GetPropertyValue("VolumeSerialNumber").ToString();         

#endregion
#region 获取设备硬盘的卷标号
public string GetDiskVolumeSerialNumber()       
{           
      ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");         
      ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid=\"d:\""); 
      disk.Get();           
      return disk.GetPropertyValue("VolumeSerialNumber").ToString();       
}
#endregion
步骤二: 收集硬件信息生成机器码, 代码如下:
Java代码
private void button1_Click(object sender, EventArgs e)        {             
      label2.Text = getCpu() + GetDiskVolumeSerialNumber();//获得24Cpu和硬盘序列号             
      string[] strid = new string[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)];             
      }         
}
private void button1_Click(object sender, EventArgs e)        {           
      label2.Text = getCpu() + GetDiskVolumeSerialNumber();//获得24Cpu和硬盘序列号           
      string[] strid = new string[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)];           
      }       
}
步骤三: 使用机器码生成软件注册码, 代码如下:
Java代码
public int[] intCode = new int[127];//用于存密钥         
public void setIntCode()//给数组赋值个小于10的随机数         
{             
    Random ra = new Random();             
    for (int i = 1; i < intCode.Length;i++ )           
    {                 
        intCode[i] = ra.Next(0, 9);             
    }         
}         
public int[] intNumber = new int[25];//用于存机器码的Ascii 
public char[] Charcode = new char[25];//存储机器码字             
//生成注册码         
private void 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值是否09之间                     
              {                         
                strAsciiName += Convert.ToChar(intNumber[j]).ToString();                     
            }                     
            else if (intNumber[j] >= 65 && intNumber[j] <= 90)//判断字符ASCII值是否AZ之间     
              {                         
                strAsciiName += Convert.ToChar(intNumber[j]).ToString();                     
            }                     
            else if (intNumber[j] >= 97 && intNumber[j] <= 122)//判断字符ASCII值是否az之间                     
              {                         
                  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("请选生成机器码","注册提示"); }         
}
public int[] intCode = new int[127];//用于存密钥       
public void setIntCode()//给数组赋值个小于10的随机数       
{           
    Random ra = new Random();         
    for (int i = 1; i < intCode.Length;i++ )       
    {               
        intCode[i] = ra.Next(0, 9);           
    }       
}     
public int[] intNumber = new int[25];//用于存机器码的Ascii
public char[] Charcode = new char[25];//存储机器码字         
//生成注册码       
private void 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值存入一个整数组中。             
keygen注册机是什么
          {                 
            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值是否09之间                   
              {                     
                strAsciiName += Convert.ToChar(intNumber[j]).ToString();                   
            }                   
            else if (intNumber[j] >= 65 && intNumber[j] <= 90)//判断字符ASCII值是否AZ之间 
              {                       
                strAsciiName += Convert.ToChar(intNumber[j]).ToString();                   
            }                 
            else if (intNumber[j] >= 97 && intNumber[j] <= 122)//判断字符ASCII值是否az之间                   
              {                       
                  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("请选生成机器码","注册提示"); }       
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。