原理就是软件与注册机使用同一种算法,将数据进行匹配。注册后将数据写入至注册表中。一种简单的注册机的方式。
1、软件的实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Management;
using System.Text;
using System.Threading.Tasks;
namespace SoftwareRegister
{
class SoftReg
{
/// <summary>
/// 获取硬盘序列号
/// </summary>
/// <returns></returns>
public string GetDiskSerialNum()
{
ManagementClass mydisk = new ManagementClass("win32_NetworkAdapterConfiguration");
ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid=\"c:\"");
disk.Get();
return disk.GetPropertyValue("VolumeSerialNumber").ToString();
}
/// <summary>
/// 获取CPu序列号
/// </summary>
/// <returns></returns>
public string GetCpuSerialNum()
{
string cpustr = "";
ManagementClass mycpu = new ManagementClass("win32_Processor");
ManagementObjectCollection mycpuCollention = mycpu.GetInstances();
foreach (ManagementObject var in mycpuCollention)
{
cpustr = var.Properties["Processorid"].Value.ToString();
}
return cpustr;
}
/// <summary>
/// 通过CPU序列号和硬盘序列号的前24位做机器码
/// </summary>
/// <returns></returns>
public string GetMachineNum()
{
string Num = GetCpuSerialNum() + GetDiskSerialNum();
string MachineNum = Num.Substring(0,24);
return MachineNum;
}
public int[] m_intCode = new int[127]; //存储密钥
public char[] m_charASCII = new char[25]; //存储ASCII
public int[] m_intASCII = new int[25]; //存储ASCII的值
/// <summary>
/// 初始化密钥(通过模9生成)
/// </summary>
public void IntiIntCode()
{
for (int i = 0; i < m_intCode.Length; i++)
{
m_intCode[i] = i % 9;
}
}
/// <summary>
/// 获取设备注册码
/// </summary>
/// <returns></returns>
public string GetRegisterNum()
{
IntiIntCode();
string MachineNume = GetMachineNum();
//通过机器码获取ASCII码
for (int i = 1; i < m_charASCII.Length; i++)
{
m_charASCII[i] = Convert.ToChar(MachineNume.Substring(i - 1, 1));
}
//通过简单算法,改变ASCII的值, ASCII的值,再加上初始化密钥的值
for (int j = 1; j < m_intASCII.Length; j++)
{
m_intASCII[j] = Convert.ToInt32(m_charASCII[j]) + m_intCode[Convert.ToInt32(m_charASCII[j])];
}
string MachineASCII = "";
for (int k = 1; k < m_intASCII.Length; k++)
{
if ((m_intASCII[k] >= 48 && m_intASCII[k] <= 57) || (m_intASCII[k] >= 65 && m_intASCII[k] <= 90) || (m_intASCII[k] >= 97 && m_intASCII[k] <= 122))
{
MachineASCII += Convert.ToChar(m_intASCII[k]).ToString(); //在0-9,A-Z,a-z之间
}
else if (m_intASCII[k] > 122)
{
MachineASCII += Convert.ToChar(m_intASCII[k] - 10).ToString(); //大于z
}
else
{
MachineASCII += Convert.ToChar(m_intASCII[k] - 9).ToString();
}
}
return MachineASCII;
}
}
}
2、检查注册是否可用
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SoftwareRegister
{
public class CheckReg
{
SoftReg softReg = new SoftReg();
/// <summary>
/// 检查是否已经注册
/// </summary>
/// <returns></returns>
public bool GetIsReg()
{
bool IsCheck = false;
RegistryKey regKey = Registry.CurrentUser.OpenSubKey("SOFTWARE", true).CreateSubKey("mySoftWare").CreateSubKey("Register.INI");
foreach (var item in regKey.GetSubKeyNames())
{
if (item == softReg.GetRegisterNum())
{
IsCheck = true;
}
}
return IsCheck;
}
/// <summary>
/// 判断软件是否可用,拥有二十次的试用期,也可以换成天数,再写入注册表信息
/// </summary>
/// <returns></returns>
public bool GetUseInfo(ref int m_intUse)
{
m_intUse = 0;
bool Is_CanUse = false;
try
{
m_intUse = (int)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\mySoftWare", "UseTimes", 0);
}
catch (Exception)
{
Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\mySoftWare", "UseTimes", 0, RegistryValueKind.DWord);
}
m_intUse = (int)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\mySoftWare", "UseTimes", 0);
if (m_intUse < 5)
{
int int_count = m_intUse + 1;
Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\mySoftWare", "UseTimes", int_count);
Is_CanUse = true;
}
else
{
Is_CanUse = false;
}
return Is_CanUse;
}
}
}
</pre><p></p><pre>
主窗体::
using Microsoft.Win32;
using SoftwareRegister;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace RegisterMachine
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Inti();
}
SoftReg softReg = new SoftReg();
CheckReg checkReg = new CheckReg();
private void Inti()
{
txtb_MachineNum.Text=softReg.GetMachineNum();
if (checkReg.GetIsReg())
label1.Text = "软件已经注册";
else
label1.Text = "软件未注册";
int count = 0;
if (checkReg.GetUseInfo(ref count))
{
int k = 5 - count;
MessageBox.Show("未注册!试用次数还剩下" + k .ToString()+ "次!", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void button1_Click(object sender, EventArgs e)
{
try
{
if (txtB_RegNum.Text == softReg.GetRegisterNum())
{
MessageBox.Show("注册成功!重启软件后生效!", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
RegistryKey retkey = Registry.CurrentUser.OpenSubKey("Software", true).CreateSubKey("mySoftWare").CreateSubKey("Register.INI").CreateSubKey(txtB_RegNum.Text);
retkey.SetValue("UserName", "Rsoft");
this.Close();
}
else
{
MessageBox.Show("注册码错误!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
txtB_RegNum.SelectAll();
}
}
catch(Exception ex)
{
throw new Exception(ex.Message);
}
}
private void but_Cancel_Click(object sender, EventArgs e)
{
this.Close();
}
}
}
二:注册机
里面的方法和上面的一样,通过同一种算法对数据进行匹配。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Register
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public int[] m_intCode = new int[127]; //存储密钥
public char[] m_charASCII = new char[25]; //存储ASCII
public int[] m_intASCII = new int[25]; //存储ASCII的值
/// <summary>
/// 初始化密钥(通过模9生成)
/// </summary>
public void IntiIntCode()
{
for (int i = 0; i < m_intCode.Length; i++)
{
m_intCode[i] = i % 9;
}
}
public string GetRegisterNum(string MachineNume)
{
IntiIntCode();
if (MachineNume.Length != 25)
return "机器编码有误,请重新输入!";
//通过机器码获取ASCII码
for (int i = 1; i < m_charASCII.Length; i++)
{
m_charASCII[i] = Convert.ToChar(MachineNume.Substring(i - 1, 1));
}
//通过简单算法,改变ASCII的值, ASCII的值,再加上初始化密钥的值
for (int j = 1; j < m_intASCII.Length; j++)
{
m_intASCII[j] = Convert.ToInt32(m_charASCII[j]) + m_intCode[Convert.ToInt32(m_charASCII[j])];
}
string MachineASCII = "";
for (int k = 1; k < m_intASCII.Length; k++)
{
if ((m_intASCII[k] >= 48 && m_intASCII[k] <= 57) || (m_intASCII[k] >= 65 && m_intASCII[k] <= 90) || (m_intASCII[k] >= 97 && m_intASCII[k] <= 122))
{
MachineASCII += Convert.ToChar(m_intASCII[k]).ToString(); //在0-9,A-Z,a-z之间
}
else if (m_intASCII[k] > 122)
{
MachineASCII += Convert.ToChar(m_intASCII[k] - 10).ToString(); //大于z
}
else
{
MachineASCII += Convert.ToChar(m_intASCII[k] - 9).ToString();
}
}
return MachineASCII;
}
private void but_Reg_Click(object sender, EventArgs e)
{
textBox2.Text = "";
textBox2.Text = GetRegisterNum(textBox1.Text);
}
private void btn_Cancel_Click(object sender, EventArgs e)
{
this.Close();
}
}
}
3、再回到主界面进行注册