主要思路:获取机器的CPU序列号,得到机器码。通过对机器码进行MD5运算之后得到注册码。将注册码写进注册表或系统目录。
//1.在程序的入口处(winform)检测注册文件是否存在,如果不存在
//则提示用户注册文件损坏或者用户未注册,如果注册文件存在,则读取文件内容,判断注册码是否正确。
//在程序的入口函数所在的文件要引用 using System.IO;来进行文件操作。
- using System;
- using System.Collections.Generic;
- using System.Windows.Forms;
- using System.IO;
- namespace LoginWindowTest
- {
- static class Program
- {
- /// <summary>
- /// 应用程序的主入口点。
- /// </summary>
- [STAThread]
- static void Main()
- {
- String sysFolder = System.Environment.SystemDirectory;//获取系统安装目录如:c:\windows\system32
- Reg rg=new Reg();//此类里有几个函数(获取CPU序列号,对字符串进行MD5运算等)
- Application.EnableVisualStyles();
- Application.SetCompatibleTextRenderingDefault(false);
- if (!File.Exists(sysFolder + "file://sixi.ini/"))
- {
- //如果注册文件不存在。注册失败
- //创建注册文件
- File.Create(sysFolder + "file://sixi.ini/");
- MessageBox.Show("请注册!");
- Application.Run(new RegForm());//进入注册界面。
- }
- else
- {//如果注册文件存在,读取文件内容跟密码比较
- byte[] arry=new byte [32];
- string str = "";
- FileInfo fi = new FileInfo(sysFolder + "file://sixi.ini/");
- FileStream fs = fi.OpenRead();
- int i=fs.Read(arry, 0, 32);
- fs.Close();
- str = System.Text.Encoding.ASCII.GetString(arry);
- if (str == rg.getMd5(rg.GetCpuID()).Trim())//如果注册文件里的字符串和经过MD5运算过的注册码相同,则注册成功
- {
- MessageBox.Show("软件已经成功注册!");
- Application.Run(new MainForm());//进入软件主界面
- }
- else
- {
- MessageBox.Show("请注册软件!");
- Application.Run(new RegForm());//进入注册界面。
- }
- }
- }
- }
- }
- //2.Reg类,获取CPU序列号、对字符串进行MD5加密等。需要引用System.Managerment
//你也可以对这个类进行优化,把验证注册码也放在这个里面,可以写一个方法,比如:Public bool ISRight()
3.注册页面可以这样写:
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Management;
- namespace LoginWindowTest
- {
- class Reg
- {
- //取CPU编号
- public string GetCpuID()
- {
- try
- {
- ManagementClass mc = new ManagementClass("Win32_Processor");
- ManagementObjectCollection moc = mc.GetInstances();
- String strCpuID = null;
- foreach (ManagementObject mo in moc)
- {
- strCpuID = mo.Properties["ProcessorId"].Value.ToString();
- break;
- }
- return strCpuID;
- }
- catch
- {
- return "";
- }
- }//end method
- //取第一块硬盘编号,因为移动硬盘的复杂性,所以不建议加密时同时对CPUID和HDID操作,如果用户把移动硬盘设为启动盘,就会造成注册码和机器码经过运算后不符合的错误。
- public string GetHardDiskID()
- {
- string HDid = "";
- try
- {
- ManagementClass cimobject1 = new ManagementClass("Win32_DiskDrive");
- ManagementObjectCollection moc1 = cimobject1.GetInstances();
- foreach (ManagementObject mo in moc1)
- {
- HDid = (string)mo.Properties["Model"].Value;
- }
- return HDid;
- }
- catch
- {
- return "";
- }
- }
- public string getaa()
- {
- string aa = "";
- ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
- ManagementObjectCollection moc2 = mc.GetInstances();
- foreach (ManagementObject mo in moc2)
- {
- if ((bool)mo["IPEnabled"] == true)
- aa = mo["MacAddress"].ToString();
- mo.Dispose();
- }
- return aa;
- }
- public string getMd5(string md5)
- {
- System.Security.Cryptography.MD5CryptoServiceProvider md = new System.Security.Cryptography.MD5CryptoServiceProvider();
- byte[] value, hash;
- value = System.Text.Encoding.UTF8.GetBytes(md5);
- hash = md.ComputeHash(value);
- md.Clear();
- string temp = "";
- for (int i = 0, len = hash.Length; i < len; i++)
- {
- temp += hash[i].ToString("x").PadLeft(2, '0');
- }
- return temp;
- }
- }
- }
- private void button3_Click(object sender, EventArgs e)
- {
- Reg rg = new Reg();
- String sysFolder = System.Environment.SystemDirectory;
- //注册,
- //1.修改app.config
- if (textBox2.Text.Trim() != rg.getMd5(GetCpuID()))
- {
- MessageBox.Show("注册码错误!");
- }
- else
- {
- MessageBox.Show("注册成功!");
- File.WriteAllText(mailto:sysFolder+@"%20sixi.ini", rg.getMd5(rg.GetCpuID()));
- //可以进入软件的主界面。或重新启动本程序。
- }
- }
开头的时候说了,这个只是注册软件的简单的实现。如果你想更复杂一点儿,你还可以对机器码(CPUID)进行一些复杂的运算。这个需要你自己设计一个复杂的算法。你也可以把注册码写进注册表。