0%

前几天在博客园里面看到有个人分享了一篇注册码的代码,密密麻麻的还不可以运行,于是自己根据他的思路,把这个工作完成了。这里也是抱着分享的态度和大家交流一下。希望各位高手手下留情。

首先我们需要引入一下using System.Management;这个类库。

然后我们定义一下字段并设置其属性为只读。

具体代码如下:

复制代码

private string _CPU; // CPU
private string _DiskVolumeSerialNumber; // DiskVolumeSerialNumber
private string _MachineNum; // MachineNum
private string _RegNum; // RegNum
private int[] intCode = new int[127]; // 存储密钥
private int[] intNumber = new int[25]; // 存机器码的Ascii值
private char[] Charcode = new char[25]; // 存储机器码字
private int _Times; // 设置软件使用的次数
private string _regKey; // 设置注册表的Key值
private bool _isRegNum; // 判断是否需要注册

复制代码

复制代码

    /// <summary>
    /// CPU 字符串 /// </summary>
    public string CPU
    { get { return \_CPU; }
    } public string DiskVolumeSerialNumber
    { get { return \_DiskVolumeSerialNumber; }
    } public string MachineNum
    { get { return \_MachineNum; }
    } public string RegNum
    { get { return \_RegNum; }
    } public int Times
    { get { return \_Times; }
    } public string RegKey
    { set { \_regKey = value; }
    } public bool IsRegNum
    { get { return \_isRegNum; } set { \_isRegNum = value; }
    } 

复制代码

这里我们可以通过两个构造函数去声明来构造我们的对象。其中一个是带参数的,另一个是不带参数的。其中不带参数的需要在创建完对象之后再去设置其属性。

#region 构造函数

public RegClass()

{

this``._CPU = getCPU();

this``._DiskVolumeSerialNumber = GetDiskVolumeSerialNumber();

this``._MachineNum = getMNum();

this``._RegNum = getRNum();

}

public RegClass(``int times,``string regKey) {

this``._Times = times;

this``._regKey = regKey;

this``._CPU = getCPU();

this``._DiskVolumeSerialNumber = GetDiskVolumeSerialNumber();

this``._MachineNum = getMNum();

this``._RegNum = getRNum();

}

#endregion

  最后我们需要一步一步的写其中每一个方法。具体还是看代码吧:

复制代码

#region 函数
///


/// 获取CPU ///

/// 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;
} ///
/// 获取卷轴字符串 ///

/// 卷轴字符串
public string GetDiskVolumeSerialNumber()
{
ManagementClass mc = new ManagementClass(“Win32_NetworkAdapterConfiguration”);
ManagementObject disk = new ManagementObject(“win32_logicaldisk.deviceid=\“d:\“”);
disk.Get(); return disk.GetPropertyValue(“VolumeSerialNumber”).ToString();
} ///
/// 得到机器码 ///

/// 机器码
public string getMNum()
{ string strNum = getCPU() + GetDiskVolumeSerialNumber(); //获得24位Cpu和硬盘序列号
string strMNum = strNum.Substring(0, 24); //从生成的字符串中取出前24个字符做为机器码
return strMNum;
} ///
/// 给数组赋值小于10的数 ///

public void setIntCode()
{ for (int i = 1; i < intCode.Length; i++)
{
intCode[i] = i % 9;
}
} ///
/// 获得注册码 ///

/// 注册码字符串
public string getRNum()
{
setIntCode();//初始化127位数组
for (int i = 1; i < Charcode.Length; i++)//把机器码存入数组中
{
Charcode[i] = Convert.ToChar(getMNum().Substring(i - 1, 1));
} for (int j = 1; j < intNumber.Length; j++)//把字符的ASCII值存入一个整数组中。
{
intNumber[j] = intCode[Convert.ToInt32(Charcode[j])] + Convert.ToInt32(Charcode[j]);
} #region 此处代码 待优化
string strAsciiName = “”;//用于存储注册码
for (int j = 1; j < intNumber.Length; j++)
{ if (intNumber[j] >= 48 && intNumber[j] <= 57)//判断字符ASCII值是否0-9之间
{
strAsciiName += Convert.ToChar(intNumber[j]).ToString();
} else if (intNumber[j] >= 65 && intNumber[j] <= 90)//判断字符ASCII值是否A-Z之间
{
strAsciiName += Convert.ToChar(intNumber[j]).ToString();
} else if (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();
}
}
} #endregion
return strAsciiName;
} ///
/// 是否需要注册 ///

///
public bool IsReg() {
_Times = LeftTimes(); if (_Times == 0 || _Times == -1) { return false;
} return true;
} ///
/// 升序的次数 ///

/// 剩余的次数
private int LeftTimes() {
RegistryKey rootKey, regKey;
rootKey = Registry.CurrentUser.OpenSubKey(“Software”,true); if ((regKey = rootKey.OpenSubKey(_regKey, true)) == null)
{
rootKey.CreateSubKey(_regKey);
regKey = rootKey.OpenSubKey(_regKey,true);
_Times = _Times - 1;
regKey.SetValue(“LeftTime”,(object)(_Times)); return _Times;
} object leftTime = regKey.GetValue(“LeftTime”);
_Times = Int32.Parse(leftTime.ToString()) - 1; if (_Times <= 0) { return -1;
} else {
regKey.SetValue(“LeftTime”, (object)(_Times)); return _Times;
}
} #endregion

复制代码

这个是我写的简单类库,我们在自己程序的时候 只需要简单的调用这个类库,然后去生命这个类的对象就可以了。具体使用如下:

RegClass reg = new JCodesRegLib.RegClass(5, “TestKey”);      //其中前面的参数是代表你的应用程序可以被使用的次数,后面那个是注册码的名字

复制代码

private void Form1_Load(object sender, EventArgs e)
{
textBox1.Text = reg.CPU;
textBox2.Text = reg.DiskVolumeSerialNumber;
textBox3.Text = reg.MachineNum;
textBox4.Text = reg.RegNum;
}

复制代码

当我们程序一开始加载的时候,就去使用得到相应的注册码和别的信息。

**不足之处
  首先我觉得自己设计的时候还是比较简单的。没有从大众的软件注册码设计出发。其中我们的注册码设计的原理是根据你的硬件和磁盘信息得到的32位注册码。其中还有把一些信息保存的到了注册表中,但是安全性比较低。我自己也测试过了,如果你的电脑上装一个Regmon这个软件,就可以去动态的检查你的注册表修改信息。很容易破解。所以在开发的时候,这个只是给初学者了解一下 注册码大概的实现过程和c#如何去操作注册码这些知识。
**

代码下载