C#实现注册码功能编程总结
生活随笔
收集整理的這篇文章主要介紹了
C#实现注册码功能编程总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C# 給自己寫的軟件,加注冊碼功能
為自己寫的程序加一個注冊功能吧。生成的機器號是根據CPU和硬盤號來的,根據自己的需求改成是否是隨機生成。
代碼直接粘貼到新建類覆蓋原代碼就能直接用了。
using System;
using System.Management;
using System.Security.Cryptography;
using System.Text;
namespace RegisterClass
{
? ? class RegisterClass
? ? {
? ? ? ? //步驟一: 獲得CUP序列號和硬盤序列號的實現代碼如下:
? ? ? ? //獲得CPU的序列號
? ? ? ? bool Stupids = true;
? ? ? ? bool Cat = false;
? ? ? ?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=\"c:\"");
? ? ? ? ? ? disk.Get();
? ? ? ? ? ? return disk.GetPropertyValue("VolumeSerialNumber").ToString();
? ? ? ? }
?
?
? ? ? ? //步驟二: 收集硬件信息生成機器碼, 代碼如下:?
? ? ? ? //生成機器碼
? ? ? ?public string CreateCode()
? ? ? ? {
? ? ? ? ? ? string temp = getCpu() + GetDiskVolumeSerialNumber();//獲得24位Cpu和硬盤序列號
? ? ? ? ? ? string[] strid = new string[24];//
? ? ? ? ? ? for (int i = 0; i < 24; i++)//把字符賦給數組
? ? ? ? ? ? {
? ? ? ? ? ? ? ? strid[i] = temp.Substring(i, 1);
? ? ? ? ? ? }
? ? ? ? ? ? temp = "";
? ? ? ? ? ? //Random rdid = new Random();
? ? ? ? ? ? for (int i = 0; i < 24; i++)//從數組隨機抽取24個字符組成新的字符生成機器三
? ? ? ? ? ? {
? ? ? ? ? ? ? ? //temp += strid[rdid.Next(0, 24)];
? ? ? ? ? ? ? ? temp += strid[i+3>=24?0:i+3];
? ? ? ? ? ? }
? ? ? ? ? ? return GetMd5(temp);
? ? ? ? }
? ? ? ? //步驟三: 使用機器碼生成軟件注冊碼, 代碼如下:
? ? ? ? //使用機器碼生成注冊碼
? ? ? ? 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);
? ? ? ? ? ? //}
? ? ? ? ? ? for (int i = 1; i < intCode.Length; i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? intCode[i] = i + 3 > 9 ? 0 : i + 3;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? public int[] intNumber = new int[25];//用于存機器碼的Ascii值
? ? ? ? public char[] Charcode = new char[25];//存儲機器碼字
? ??
? ? ? ? //生成注冊碼
? ? ? ? public string GetCode(string code)
? ? ? ? {
? ? ? ? ? ? if (code != "")
? ? ? ? ? ? {
? ? ? ? ? ? ? ? //把機器碼存入數組中
? ? ? ? ? ? ? ? setIntCode();//初始化127位數組
? ? ? ? ? ? ? ? for (int i = 1; i < Charcode.Length; i++)//把機器碼存入數組中
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? Charcode[i] = Convert.ToChar(code.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());
? ? ? ? ? ? ? ? ? ? //判斷字符ASCII值是否0-9之間
? ? ? ? ? ? ? ? ? ? if (intNumber[j] >= 48 && intNumber[j] <= 57)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? strAsciiName += Convert.ToChar(intNumber[j]).ToString();
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? //判斷字符ASCII值是否A-Z之間
? ? ? ? ? ? ? ? ? ? else if (intNumber[j] >= 65 && intNumber[j] <= 90)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? strAsciiName += Convert.ToChar(intNumber[j]).ToString();
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? //判斷字符ASCII值是否a-z之間
? ? ? ? ? ? ? ? ? ? else if (intNumber[j] >= 97 && intNumber[j] <= 122) ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? 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;//得到注冊碼
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? return strAsciiName;
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? {
? ? ? ? ? ? ? ? return "";
? ? ? ? ? ? }
? ? ? ? }
?
?
? ? ? ? //步驟四: 用戶輸入注冊碼注冊軟件, 演示代碼如下:
? ? ? ? //注冊
? ? ? ? public bool RegistIt(string currentCode,string realCode)
? ? ? ? {
? ? ? ? ? ? if (realCode != "")
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if (currentCode.TrimEnd().Equals(realCode.TrimEnd()))
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? Microsoft.Win32.RegistryKey retkey =?
? ? ? ? ? ? ? ? ? ? ? ? ?Microsoft.Win32.Registry.CurrentUser.
? ? ? ? ? ? ? ? ? ? ? ? ?OpenSubKey("software", true).CreateSubKey("StupidsCat").
? ? ? ? ? ? ? ? ? ? ? ? ?CreateSubKey("StupidsCat.ini").
? ? ? ? ? ? ? ? ? ? ? ? ?CreateSubKey(currentCode.TrimEnd());
? ? ? ? ? ? ? ? ? ? retkey.SetValue("StupidsCat", "BBC6D58D0953F027760A046D58D52786");
? ? ? ? ? ? ? ? ? ? retkey = Microsoft.Win32.Registry.LocalMachine.
? ? ? ? ? ? ? ? ? ? ? ? OpenSubKey("software", true).CreateSubKey("StupidsCat").
? ? ? ? ? ? ? ? ? ? ? ? ?CreateSubKey("StupidsCat.ini").
? ? ? ? ? ? ? ? ? ? ? ? ?CreateSubKey(currentCode.TrimEnd());
? ? ? ? ? ? ? ? ? ? retkey.SetValue("StupidsCat", "BBC6D58D0953F027760A046D58D52786");
? ? ? ? ? ? ? ? ? ? return Stupids;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? return Cat;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? else { return Cat; }
? ? ? ? }
? ? ? ? public bool BoolRegist(string sn)
? ? ? ? {
? ? ? ? ? ? string[] keynames; bool flag = false;
? ? ? ? ? ? Microsoft.Win32.RegistryKey localRegKey = Microsoft.Win32.Registry.LocalMachine;
? ? ? ? ? ? Microsoft.Win32.RegistryKey userRegKey = Microsoft.Win32.Registry.CurrentUser;
? ? ? ? ? ? try
? ? ? ? ? ? {
? ? ? ? ? ? ? ? keynames = localRegKey.OpenSubKey("software\\StupidsCat\\StupidsCat.ini\\" + GetMd5(sn)).GetValueNames();
? ? ? ? ? ? ? ? foreach (string name in keynames)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? if (name == "StupidsCat")
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? if (localRegKey.OpenSubKey("software\\StupidsCat\\StupidsCat.ini\\" + GetMd5(sn)).GetValue("StupidsCat").ToString() == "BBC6D58D0953F027760A046D58D52786")
? ? ? ? ? ? ? ? ? ? ? ? ? ? flag = true;?
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? keynames = userRegKey.OpenSubKey("software\\StupidsCat\\StupidsCat.ini\\" + GetMd5(sn)).GetValueNames();
? ? ? ? ? ? ? ? foreach (string name in keynames)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? if (name == "StupidsCat")
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? if (flag && userRegKey.OpenSubKey("software\\StupidsCat\\StupidsCat.ini\\" + GetMd5(sn)).GetValue("StupidsCat").ToString() == "BBC6D58D0953F027760A046D58D52786")
? ? ? ? ? ? ? ? ? ? ? ? ? ? return true;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? }
? ? ? ? ? ? catch
? ? ? ? ? ? {
? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? }
? ? ? ? ? ? finally?
? ? ? ? ? ? {?
? ? ? ? ? ? ? ? localRegKey.Close();?
? ? ? ? ? ? ? ? userRegKey.Close();?
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? public string GetMd5(object text)
? ? ? ? {
? ? ? ? ? ? string path = text.ToString();
? ? ? ? ? ? MD5CryptoServiceProvider MD5Pro = new MD5CryptoServiceProvider();
? ? ? ? ? ? Byte[] buffer = Encoding.GetEncoding("utf-8").GetBytes(text.ToString());
? ? ? ? ? ? Byte[] byteResult = MD5Pro.ComputeHash(buffer);
? ? ? ? ? ? string md5result = BitConverter.ToString(byteResult).Replace("-", "");
? ? ? ? ? ? return md5result;
? ? ? ? }
? ? }
}
========
C#學習筆記——軟件注冊與注冊機
SoftReg類:
? ?1: using System;
? ?2: using System.Collections.Generic;
? ?3: using System.Linq;
? ?4: using System.Text;
? ?5: using System.Management; ? ?//需要引用System.Management.dll
? ?6: ?
? ?7: namespace SoftRegister
? ?8: {
? ?9: ? ? class SoftReg
? 10: ? ? {
? 11: ? ? ? ? ///<summary>
? 12: ? ? ? ? /// 獲取硬盤卷標號
? 13: ? ? ? ? ///</summary>
? 14: ? ? ? ? ///<returns></returns>
? 15: ? ? ? ? public string GetDiskVolumeSerialNumber()
? 16: ? ? ? ? {
? 17: ? ? ? ? ? ? ManagementClass mc = new ManagementClass("win32_NetworkAdapterConfiguration");
? 18: ? ? ? ? ? ? ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid=\"c:\"");
? 19: ? ? ? ? ? ? disk.Get();
? 20: ? ? ? ? ? ? return disk.GetPropertyValue("VolumeSerialNumber").ToString();
? 21: ? ? ? ? }
? 22: ?
? 23: ? ? ? ? ///<summary>
? 24: ? ? ? ? /// 獲取CPU序列號
? 25: ? ? ? ? ///</summary>
? 26: ? ? ? ? ///<returns></returns>
? 27: ? ? ? ? public string GetCpu()
? 28: ? ? ? ? {
? 29: ? ? ? ? ? ? string strCpu = null;
? 30: ? ? ? ? ? ? ManagementClass myCpu = new ManagementClass("win32_Processor");
? 31: ? ? ? ? ? ? ManagementObjectCollection myCpuCollection = myCpu.GetInstances();
? 32: ? ? ? ? ? ? foreach (ManagementObject myObject in myCpuCollection)
? 33: ? ? ? ? ? ? {
? 34: ? ? ? ? ? ? ? ? strCpu = myObject.Properties["Processorid"].Value.ToString();
? 35: ? ? ? ? ? ? }
? 36: ? ? ? ? ? ? return strCpu;
? 37: ? ? ? ? }
? 38: ?
? 39: ? ? ? ? ///<summary>
? 40: ? ? ? ? /// 生成機器碼
? 41: ? ? ? ? ///</summary>
? 42: ? ? ? ? ///<returns></returns>
? 43: ? ? ? ? public string GetMNum()
? 44: ? ? ? ? {
? 45: ? ? ? ? ? ? string strNum = GetCpu() + GetDiskVolumeSerialNumber();
? 46: ? ? ? ? ? ? string strMNum = strNum.Substring(0, 24); ? ?//截取前24位作為機器碼
? 47: ? ? ? ? ? ? return strMNum;
? 48: ? ? ? ? }
? 49: ?
? 50: ? ? ? ? public int[] intCode = new int[127]; ? ?//存儲密鑰
? 51: ? ? ? ? public char[] charCode = new char[25]; ?//存儲ASCII碼
? 52: ? ? ? ? public int[] intNumber = new int[25]; ? //存儲ASCII碼值
? 53: ?
? 54: ? ? ? ? //初始化密鑰
? 55: ? ? ? ? public void SetIntCode()
? 56: ? ? ? ? {
? 57: ? ? ? ? ? ? for (int i = 1; i < intCode.Length; i++)
? 58: ? ? ? ? ? ? {
? 59: ? ? ? ? ? ? ? ? intCode[i] = i % 9;
? 60: ? ? ? ? ? ? }
? 61: ? ? ? ? }
? 62: ?
? 63: ? ? ? ? ///<summary>
? 64: ? ? ? ? /// 生成注冊碼
? 65: ? ? ? ? ///</summary>
? 66: ? ? ? ? ///<returns></returns>
? 67: ? ? ? ? public string GetRNum()
? 68: ? ? ? ? {
? 69: ? ? ? ? ? ? SetIntCode();
? 70: ? ? ? ? ? ? string strMNum = GetMNum();
? 71: ? ? ? ? ? ? for (int i = 1; i < charCode.Length; i++) ? //存儲機器碼
? 72: ? ? ? ? ? ? {
? 73: ? ? ? ? ? ? ? ? charCode[i] = Convert.ToChar(strMNum.Substring(i - 1, 1));
? 74: ? ? ? ? ? ? }
? 75: ? ? ? ? ? ? for (int j = 1; j < intNumber.Length; j++) ?//改變ASCII碼值
? 76: ? ? ? ? ? ? {
? 77: ? ? ? ? ? ? ? ? intNumber[j] = Convert.ToInt32(charCode[j]) + intCode[Convert.ToInt32(charCode[j])];
? 78: ? ? ? ? ? ? }
? 79: ? ? ? ? ? ? string strAsciiName = ""; ? //注冊碼
? 80: ? ? ? ? ? ? for (int k = 1; k < intNumber.Length; k++) ?//生成注冊碼
? 81: ? ? ? ? ? ? {
? 82: ?
? 83: ? ? ? ? ? ? ? ? if ((intNumber[k] >= 48 && intNumber[k] <= 57) || (intNumber[k] >= 65 && intNumber[k]
? 84: ? ? ? ? ? ? ? ? ? ? <= 90) || (intNumber[k] >= 97 && intNumber[k] <= 122)) ?//判斷如果在0-9、A-Z、a-z之間
? 85: ? ? ? ? ? ? ? ? {
? 86: ? ? ? ? ? ? ? ? ? ? strAsciiName += Convert.ToChar(intNumber[k]).ToString();
? 87: ? ? ? ? ? ? ? ? }
? 88: ? ? ? ? ? ? ? ? else if (intNumber[k] > 122) ?//判斷如果大于z
? 89: ? ? ? ? ? ? ? ? {
? 90: ? ? ? ? ? ? ? ? ? ? strAsciiName += Convert.ToChar(intNumber[k] - 10).ToString();
? 91: ? ? ? ? ? ? ? ? }
? 92: ? ? ? ? ? ? ? ? else
? 93: ? ? ? ? ? ? ? ? {
? 94: ? ? ? ? ? ? ? ? ? ? strAsciiName += Convert.ToChar(intNumber[k] - 9).ToString();
? 95: ? ? ? ? ? ? ? ? }
? 96: ? ? ? ? ? ? }
? 97: ? ? ? ? ? ? return strAsciiName;
? 98: ? ? ? ? }
? 99: ? ? }
?100: }
主窗體:
image
? ?1: using System;
? ?2: using System.Collections.Generic;
? ?3: using System.ComponentModel;
? ?4: using System.Data;
? ?5: using System.Drawing;
? ?6: using System.Linq;
? ?7: using System.Text;
? ?8: using System.Windows.Forms;
? ?9: using Microsoft.Win32;
? 10: ?
? 11: namespace SoftRegister
? 12: {
? 13: ? ? public partial class FormMain : Form
? 14: ? ? {
? 15: ? ? ? ? public FormMain()
? 16: ? ? ? ? {
? 17: ? ? ? ? ? ? InitializeComponent();
? 18: ? ? ? ? }
? 19: ?
? 20: ? ? ? ? SoftReg softReg = new SoftReg();
? 21: ?
? 22: ? ? ? ? private void FormMain_Load(object sender, EventArgs e)
? 23: ? ? ? ? {
? 24: ? ? ? ? ? ? //判斷軟件是否注冊
? 25: ? ? ? ? ? ? RegistryKey retkey = Registry.CurrentUser.OpenSubKey("SOFTWARE", true).CreateSubKey("mySoftWare").CreateSubKey("Register.INI");
? 26: ? ? ? ? ? ? foreach (string strRNum in retkey.GetSubKeyNames())
? 27: ? ? ? ? ? ? {
? 28: ? ? ? ? ? ? ? ? if (strRNum == softReg.GetRNum())
? 29: ? ? ? ? ? ? ? ? {
? 30: ? ? ? ? ? ? ? ? ? ? this.labRegInfo.Text = "此軟件已注冊!";
? 31: ? ? ? ? ? ? ? ? ? ? this.btnReg.Enabled = false;
? 32: ? ? ? ? ? ? ? ? ? ? return;
? 33: ? ? ? ? ? ? ? ? }
? 34: ? ? ? ? ? ? }
? 35: ? ? ? ? ? ? this.labRegInfo.Text = "此軟件尚未注冊!";
? 36: ? ? ? ? ? ? this.btnReg.Enabled = true;
? 37: ? ? ? ? ? ? MessageBox.Show("您現在使用的是試用版,可以免費試用30次!", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
? 38: ? ? ? ? ? ??
? 39: ? ? ? ? ? ? Int32 tLong; ? ?//已使用次數
? 40: ? ? ? ? ? ? try
? 41: ? ? ? ? ? ? {
? 42: ? ? ? ? ? ? ? ? tLong = (Int32)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\mySoftWare", "UseTimes", 0);
? 43: ? ? ? ? ? ? ? ? MessageBox.Show("您已經使用了" + tLong + "次!", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
? 44: ? ? ? ? ? ? }
? 45: ? ? ? ? ? ? catch
? 46: ? ? ? ? ? ? {
? 47: ? ? ? ? ? ? ? ? MessageBox.Show("歡迎使用本軟件!", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
? 48: ? ? ? ? ? ? ? ? Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\mySoftWare", "UseTimes", 0, RegistryValueKind.DWord);
? 49: ? ? ? ? ? ? }
? 50: ?
? 51: ? ? ? ? ? ? //判斷是否可以繼續(xù)試用
? 52: ? ? ? ? ? ? tLong = (Int32)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\mySoftWare", "UseTimes", 0);
? 53: ? ? ? ? ? ? if (tLong < 30)
? 54: ? ? ? ? ? ? {
? 55: ? ? ? ? ? ? ? ? int tTimes = tLong + 1;
? 56: ? ? ? ? ? ? ? ? Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\mySoftWare", "UseTimes", tTimes);
? 57: ? ? ? ? ? ? }
? 58: ? ? ? ? ? ? else
? 59: ? ? ? ? ? ? {
? 60: ? ? ? ? ? ? ? ? DialogResult result = MessageBox.Show("試用次數已到!您是否需要注冊?", "信息", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
? 61: ? ? ? ? ? ? ? ? if (result == DialogResult.Yes)
? 62: ? ? ? ? ? ? ? ? {
? 63: ? ? ? ? ? ? ? ? ? ? FormRegister.state = false; //設置軟件狀態(tài)為不可用
? 64: ? ? ? ? ? ? ? ? ? ? btnReg_Click(sender, e); ? ?//打開注冊窗口
? 65: ? ? ? ? ? ? ? ? }
? 66: ? ? ? ? ? ? ? ? else
? 67: ? ? ? ? ? ? ? ? {
? 68: ? ? ? ? ? ? ? ? ? ? Application.Exit();
? 69: ? ? ? ? ? ? ? ? }
? 70: ? ? ? ? ? ? }
? 71: ?
? 72: ? ? ? ? }
? 73: ?
? 74: ? ? ? ? private void btnClose_Click(object sender, EventArgs e)
? 75: ? ? ? ? {
? 76: ? ? ? ? ? ? Application.Exit();
? 77: ? ? ? ? }
? 78: ?
? 79: ? ? ? ? private void btnReg_Click(object sender, EventArgs e)
? 80: ? ? ? ? {
? 81: ? ? ? ? ? ? FormRegister frmRegister = new FormRegister();
? 82: ? ? ? ? ? ? frmRegister.ShowDialog();
? 83: ? ? ? ? }
? 84: ? ? }
? 85: }
注冊窗體:
image
? ?1: using System;
? ?2: using System.Collections.Generic;
? ?3: using System.ComponentModel;
? ?4: using System.Data;
? ?5: using System.Drawing;
? ?6: using System.Linq;
? ?7: using System.Text;
? ?8: using System.Windows.Forms;
? ?9: using Microsoft.Win32;
? 10: ?
? 11: namespace SoftRegister
? 12: {
? 13: ? ? public partial class FormRegister : Form
? 14: ? ? {
? 15: ? ? ? ? public FormRegister()
? 16: ? ? ? ? {
? 17: ? ? ? ? ? ? InitializeComponent();
? 18: ? ? ? ? }
? 19: ?
? 20: ? ? ? ? public static bool state = true; ?//軟件是否為可用狀態(tài)
? 21: ? ? ? ? SoftReg softReg = new SoftReg();
? 22: ?
? 23: ? ? ? ? private void btnReg_Click(object sender, EventArgs e)
? 24: ? ? ? ? {
? 25: ? ? ? ? ? ? try
? 26: ? ? ? ? ? ? {
? 27: ? ? ? ? ? ? ? ? if (txtLicence.Text == softReg.GetRNum())
? 28: ? ? ? ? ? ? ? ? {
? 29: ? ? ? ? ? ? ? ? ? ? MessageBox.Show("注冊成功!重啟軟件后生效!", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
? 30: ? ? ? ? ? ? ? ? ? ? RegistryKey retkey = Registry.CurrentUser.OpenSubKey("Software", true).CreateSubKey("mySoftWare").CreateSubKey("Register.INI").CreateSubKey(txtLicence.Text);
? 31: ? ? ? ? ? ? ? ? ? ? retkey.SetValue("UserName", "Rsoft");
? 32: ? ? ? ? ? ? ? ? ? ? this.Close();
? 33: ? ? ? ? ? ? ? ? }
? 34: ? ? ? ? ? ? ? ? else
? 35: ? ? ? ? ? ? ? ? {
? 36: ? ? ? ? ? ? ? ? ? ? MessageBox.Show("注冊碼錯誤!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
? 37: ? ? ? ? ? ? ? ? ? ? txtLicence.SelectAll();
? 38: ? ? ? ? ? ? ? ? }
? 39: ? ? ? ? ? ? }
? 40: ? ? ? ? ? ? catch (Exception ex)
? 41: ? ? ? ? ? ? {
? 42: ? ? ? ? ? ? ? ? throw new Exception(ex.Message);
? 43: ? ? ? ? ? ? }
? 44: ? ? ? ? }
? 45: ?
? 46: ? ? ? ? private void btnClose_Click(object sender, EventArgs e)
? 47: ? ? ? ? {
? 48: ? ? ? ? ? ? if (state == true)
? 49: ? ? ? ? ? ? {
? 50: ? ? ? ? ? ? ? ? this.Close();
? 51: ? ? ? ? ? ? }
? 52: ? ? ? ? ? ? else
? 53: ? ? ? ? ? ? {
? 54: ? ? ? ? ? ? ? ? Application.Exit();
? 55: ? ? ? ? ? ? }
? 56: ? ? ? ? }
? 57: ?
? 58: ? ? ? ? private void FormRegister_Load(object sender, EventArgs e)
? 59: ? ? ? ? {
? 60: ? ? ? ? ? ? this.txtHardware.Text = softReg.GetMNum();
? 61: ? ? ? ? }
? 62: ? ? }
? 63: }
(二)注冊機的實現:
SoftReg類:
? ?1: using System;
? ?2: using System.Collections.Generic;
? ?3: using System.Linq;
? ?4: using System.Text;
? ?5: using System.Management;
? ?6: ?
? ?7: namespace SoftwarePassport
? ?8: {
? ?9: ? ? class SoftReg
? 10: ? ? {
? 11: ? ? ? ? public int[] intCode = new int[127]; ? ?//存儲密鑰
? 12: ? ? ? ? public char[] charCode = new char[25]; ?//存儲ASCII碼
? 13: ? ? ? ? public int[] intNumber = new int[25]; ? //存儲ASCII碼值
? 14: ?
? 15: ? ? ? ? //初始化密鑰
? 16: ? ? ? ? public void SetIntCode()
? 17: ? ? ? ? {
? 18: ? ? ? ? ? ? for (int i = 1; i < intCode.Length; i++)
? 19: ? ? ? ? ? ? {
? 20: ? ? ? ? ? ? ? ? intCode[i] = i % 9;
? 21: ? ? ? ? ? ? }
? 22: ? ? ? ? }
? 23: ?
? 24: ? ? ? ? ///<summary>
? 25: ? ? ? ? /// 生成注冊碼
? 26: ? ? ? ? ///</summary>
? 27: ? ? ? ? ///<returns></returns>
? 28: ? ? ? ? public string GetRNum(string strMNum)
? 29: ? ? ? ? {
? 30: ? ? ? ? ? ? SetIntCode();
? 31: ? ? ? ? ? ??
? 32: ? ? ? ? ? ? for (int i = 1; i < charCode.Length; i++) ? //存儲機器碼
? 33: ? ? ? ? ? ? {
? 34: ? ? ? ? ? ? ? ? charCode[i] = Convert.ToChar(strMNum.Substring(i - 1, 1));
? 35: ? ? ? ? ? ? }
? 36: ? ? ? ? ? ? for (int j = 1; j < intNumber.Length; j++) ?//改變ASCII碼值
? 37: ? ? ? ? ? ? {
? 38: ? ? ? ? ? ? ? ? intNumber[j] = Convert.ToInt32(charCode[j]) + intCode[Convert.ToInt32(charCode[j])];
? 39: ? ? ? ? ? ? }
? 40: ? ? ? ? ? ? string strAsciiName = ""; ? //注冊碼
? 41: ? ? ? ? ? ? for (int k = 1; k < intNumber.Length; k++) ?//生成注冊碼
? 42: ? ? ? ? ? ? {
? 43: ?
? 44: ? ? ? ? ? ? ? ? if ((intNumber[k] >= 48 && intNumber[k] <= 57) || (intNumber[k] >= 65 && intNumber[k]
? 45: ? ? ? ? ? ? ? ? ? ? <= 90) || (intNumber[k] >= 97 && intNumber[k] <= 122)) ?//判斷如果在0-9、A-Z、a-z之間
? 46: ? ? ? ? ? ? ? ? {
? 47: ? ? ? ? ? ? ? ? ? ? strAsciiName += Convert.ToChar(intNumber[k]).ToString();
? 48: ? ? ? ? ? ? ? ? }
? 49: ? ? ? ? ? ? ? ? else if (intNumber[k] > 122) ?//判斷如果大于z
? 50: ? ? ? ? ? ? ? ? {
? 51: ? ? ? ? ? ? ? ? ? ? strAsciiName += Convert.ToChar(intNumber[k] - 10).ToString();
? 52: ? ? ? ? ? ? ? ? }
? 53: ? ? ? ? ? ? ? ? else
? 54: ? ? ? ? ? ? ? ? {
? 55: ? ? ? ? ? ? ? ? ? ? strAsciiName += Convert.ToChar(intNumber[k] - 9).ToString();
? 56: ? ? ? ? ? ? ? ? }
? 57: ? ? ? ? ? ? }
? 58: ? ? ? ? ? ? return strAsciiName;
? 59: ? ? ? ? }
? 60: ? ? }
? 61: }
主窗體:
image
? ?1: using System;
? ?2: using System.Collections.Generic;
? ?3: using System.ComponentModel;
? ?4: using System.Data;
? ?5: using System.Drawing;
? ?6: using System.Linq;
? ?7: using System.Text;
? ?8: using System.Windows.Forms;
? ?9: ?
? 10: namespace SoftwarePassport
? 11: {
? 12: ? ? public partial class FormMain : Form
? 13: ? ? {
? 14: ? ? ? ? public FormMain()
? 15: ? ? ? ? {
? 16: ? ? ? ? ? ? InitializeComponent();
? 17: ? ? ? ? }
? 18: ?
? 19: ? ? ? ? SoftReg softReg = new SoftReg();
? 20: ?
? 21: ? ? ? ? private void btnCreate_Click(object sender, EventArgs e)
? 22: ? ? ? ? {
? 23: ? ? ? ? ? ? try
? 24: ? ? ? ? ? ? {
? 25: ? ? ? ? ? ? ? ? string strHardware = this.txtHardware.Text;
? 26: ? ? ? ? ? ? ? ? string strLicence = softReg.GetRNum(strHardware);
? 27: ? ? ? ? ? ? ? ? this.txtLicence.Text = strLicence;
? 28: ? ? ? ? ? ? }
? 29: ? ? ? ? ? ? catch (System.Exception ex)
? 30: ? ? ? ? ? ? {
? 31: ? ? ? ? ? ? ? ? MessageBox.Show("輸入的機器碼格式錯誤!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
? 32: ? ? ? ? ? ? } ?
? 33: ? ? ? ? }
? 34: ?
? 35: ? ? ? ? private void btnExit_Click(object sender, EventArgs e)
? 36: ? ? ? ? {
? 37: ? ? ? ? ? ? Application.Exit();
? 38: ? ? ? ? }
? 39: ? ? }
? 40: }
========
C#軟件加序列號激活、試用期限
程序員想盡各種辦法給軟件加密,用戶就想盡各種辦法對軟件破解。
現在做軟件試用限制,那么就討論下軟件的試用限制。總體來說,限制的方法有這么幾種:
1.時間限制。
2.次數限制。
? ? ? ? 以時間限制為例,主要是用戶從安裝之日起, 限制用戶使用天數。n天之后,就無法使用。這種限制主要是安裝的時候,將當前日期寫入注冊表(或者硬盤上某文件)。當然,寫入的是加密過的亂碼字符。運行軟件時,首先讀取注冊表(或者文件),如找不到
注冊表(或者文件),則提示軟件未注冊。當正常讀取后進行解密,得到注冊日期,與當前日期進行比較,如果 ?當前日期 減去 注冊日期 > n(允許試用天數),那么提示軟件試用到期,直接退出軟件。否則 提示可試用天數, 繼續(xù)試用軟件。 ?根據以上思路,那么
用戶可以很容易破解軟件。比如更改系統日期、或者刪除注冊表,重新安裝軟件等 。
? ? ? 針對用戶的破解,對軟件限制進行修改。如果試用軟件必須聯網,或者需要服務器端(比如聊天軟件等客戶端軟件),當前時間要從去服務器的時間,防止用戶更改客戶機系統時間。或者服務器上對客戶機進行記錄,如記錄主板id,安裝時間,等等。。。
以上為客戶機可聯網的做法,當客戶機無法上網,切不存在服務器,或者服務器就在本機時。以上做法將無法使用。
? ? ? 那么對于單機運行的軟件,如果需要數據庫,我們可以將注冊時間等信息寫入數據庫。或者,我們可以采用一明一暗的做法,注冊表是明,在硬盤的某角落,存放隱藏文件。軟件需讀取兩處,對兩處進行比較,一致則通過,不一致就退出程序。當然,安裝的時候
對該文件不替換。 我想用戶是不愿意為了使用你的軟件而格式化整個硬盤的。
? ? ? 其實還有做法,就是每次運行軟件,先將當前日期與注冊表對比,看是否過期。如未過期,就對注冊表進行一次更改,更改為當前日期,那么用戶即使更改系統日期,他的試用期限也在逐漸縮小。為了防止用戶重裝,還是采用一明一暗的做法。
? ? ? 基本上就這些方法吧.. ?貼上測試代碼:
加密解密類:
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Xml.Linq;
using System.IO;
using System.Text;
using System.Security.Cryptography;
namespace Add_To_Regedit
{
? ? public class Encryption
? ? {
? ? ? ? public static string EncryPW(string Pass, string Key)
? ? ? ? {
? ? ? ? ? ? return DesEncrypt(Pass, Key);
? ? ? ? }
? ? ? ? public static string DisEncryPW(string strPass, string Key)
? ? ? ? {
? ? ? ? ? ? return DesDecrypt(strPass, Key);
? ? ? ? }
? ? ? ? / ??
? ? ? ?
? ? ? ? /// <summary>
? ? ? ? /// DES加密
? ? ? ? /// </summary>
? ? ? ? /// <param name="encryptString"></param>
? ? ? ? /// <returns></returns>
? ? ? ? public static string DesEncrypt(string encryptString, string key)
? ? ? ? {
? ? ? ? ? ? byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 8));
? ? ? ? ? ? byte[] keyIV = keyBytes;
? ? ? ? ? ? byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
? ? ? ? ? ? DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
? ? ? ? ? ? MemoryStream mStream = new MemoryStream();
? ? ? ? ? ? CryptoStream cStream = new CryptoStream(mStream, provider.CreateEncryptor(keyBytes, keyIV), CryptoStreamMode.Write);
? ? ? ? ? ? cStream.Write(inputByteArray, 0, inputByteArray.Length);
? ? ? ? ? ? cStream.FlushFinalBlock();
? ? ? ? ? ? return Convert.ToBase64String(mStream.ToArray());
? ? ? ? }
? ? ? ? /// <summary>
? ? ? ? /// DES解密
? ? ? ? /// </summary>
? ? ? ? /// <param name="decryptString"></param>
? ? ? ? /// <returns></returns>
? ? ? ? public static string DesDecrypt(string decryptString, string key)
? ? ? ? {
? ? ? ? ? ? byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 8));
? ? ? ? ? ? byte[] keyIV = keyBytes;
? ? ? ? ? ? byte[] inputByteArray = Convert.FromBase64String(decryptString);
? ? ? ? ? ? DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
? ? ? ? ? ? MemoryStream mStream = new MemoryStream();
? ? ? ? ? ? CryptoStream cStream = new CryptoStream(mStream, provider.CreateDecryptor(keyBytes, keyIV), CryptoStreamMode.Write);
? ? ? ? ? ? cStream.Write(inputByteArray, 0, inputByteArray.Length);
? ? ? ? ? ? cStream.FlushFinalBlock();
? ? ? ? ? ? return Encoding.UTF8.GetString(mStream.ToArray());
? ? ? ? }
? ? ? ? //
? ? }
}
讀寫注冊表類:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;
using System.Security.Cryptography;
using Microsoft.Win32;
namespace Test_Form_Time
{
? ? class TimeClass
? ? {
? ? ? ? public static int InitRegedit()
? ? ? ? {
? ? ? ? ? ? /*檢查注冊表*/
? ? ? ? ? ? string SericalNumber = ReadSetting("", "SerialNumber", "-1"); ? ?// 讀取注冊表, 檢查是否注冊 -1為未注冊
? ? ? ? ? ? if (SericalNumber == "-1")
? ? ? ? ? ? { ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? return 1;
? ? ? ? ? ? }
? ? ? ? ? ? /* 比較CPUid */
? ? ? ? ? ? string CpuId = GetSoftEndDateAllCpuId(1, SericalNumber); ? //從注冊表讀取CPUid
? ? ? ? ? ? string CpuIdThis = GetCpuId(); ? ? ? ? ? //獲取本機CPUId ? ? ? ??
? ? ? ? ? ? if (CpuId != CpuIdThis)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? return 2;
? ? ? ? ? ? }
? ? ? ? ? ? /* 比較時間 */
? ? ? ? ? ? string NowDate = TimeClass.GetNowDate();
? ? ? ? ? ? string EndDate = TimeClass.GetSoftEndDateAllCpuId(0, SericalNumber);
? ? ? ? ? ? if (Convert.ToInt32(EndDate) - Convert.ToInt32(NowDate) < 0)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? return 3;
? ? ? ? ? ? }
? ? ? ? ? ? return 0;
? ? ? ? }
? ? ? ? ?/*CPUid*/
? ? ? ? public static string GetCpuId()
? ? ? ? {
? ? ? ? ? ? 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;
? ? ? ? }
? ? ? ? /*當前時間*/
? ? ? ? public static string GetNowDate()
? ? ? ? {
? ? ? ? ? ? string NowDate = DateTime.Now.ToString("yyyyMMdd"); //.Year + DateTime.Now.Month + DateTime.Now.Day).ToString();
? ? ? ?// ? ? DateTime date = Convert.ToDateTime(NowDate, "yyyy/MM/dd");
? ? ? ? ? ? return NowDate;
? ? ? ? }
? ? ? ? /* 生成序列號 */
? ? ? ? public static string CreatSerialNumber()
? ? ? ? {
? ? ? ? ? ? string SerialNumber = GetCpuId() + "-" + "20110915";
? ? ? ? ? ? return SerialNumber;?
? ? ? ? }
? ? ? ? /*?
? ? ? ? ?* i=1 得到 CUP 的id?
? ? ? ? ?* i=0 得到上次或者 開始時間?
? ? ? ? ?*/
? ? ? ? public static string GetSoftEndDateAllCpuId(int i, string SerialNumber)
? ? ? ? {
? ? ? ? ? ? if (i == 1)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? string cupId = SerialNumber.Substring(0, SerialNumber.LastIndexOf("-")); // .LastIndexOf("-"));
? ? ? ? ? ? ? ? return cupId;
? ? ? ? ? ? }
? ? ? ? ? ? if (i == 0)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? string dateTime = SerialNumber.Substring(SerialNumber.LastIndexOf("-") + 1);
? ? ? ? ? ? ? // ?dateTime = dateTime.Insert(4, "/").Insert(7, "/");
? ? ? ? ? ? ? // ?DateTime date = Convert.ToDateTime(dateTime);
? ? ? ? ? ? ? ? return dateTime;
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? {
? ? ? ? ? ? ? ? return string.Empty;
? ? ? ? ? ? } ? ? ? ??
? ? ? ? }
? ? ? ? /*寫入注冊表*/
? ? ? ? public static void WriteSetting(string Section, string Key, string Setting) ?// name = key ?value=setting ?Section= path
? ? ? ? {
? ? ? ? ? ? string text1 = Section;
? ? ? ? ? ? RegistryKey key1 = Registry.CurrentUser.CreateSubKey("Software\\MyTest_ChildPlat\\ChildPlat"); // .LocalMachine.CreateSubKey("Software\\mytest");
? ? ? ? ? ? if (key1 == null)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? return;
? ? ? ? ? ? }
? ? ? ? ? ? try
? ? ? ? ? ? {
? ? ? ? ? ? ? ? key1.SetValue(Key, Setting);
? ? ? ? ? ? }
? ? ? ? ? ? catch (Exception exception1)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? return;
? ? ? ? ? ? }
? ? ? ? ? ? finally
? ? ? ? ? ? {
? ? ? ? ? ? ? ? key1.Close();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? /*讀取注冊表*/
? ? ? ? public static string ReadSetting(string Section, string Key, string Default)
? ? ? ? {
? ? ? ? ? ? if (Default == null)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Default = "-1";
? ? ? ? ? ? }
? ? ? ? ? ? string text2 = Section;
? ? ? ? ? ? RegistryKey key1 = Registry.CurrentUser.OpenSubKey("Software\\MyTest_ChildPlat\\ChildPlat");
? ? ? ? ? ? if (key1 != null)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? object obj1 = key1.GetValue(Key, Default);
? ? ? ? ? ? ? ? key1.Close();
? ? ? ? ? ? ? ? if (obj1 != null)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? if (!(obj1 is string))
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? return "-1";
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? string obj2 = obj1.ToString();
? ? ? ? ? ? ? ? ? ? obj2 = Encryption.DisEncryPW(obj2, "ejiang11");
? ? ? ? ? ? ? ? ? ? return obj2;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? return "-1";
? ? ? ? ? ? }
? ? ? ? ? ?
? ? ? ? ? ? return Default;
? ? ? ? }
? ? }
}
調用方式如下:
?int res = TimeClass.InitRegedit();
? ? ? ? ? ? if (res == 0)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Application.Run(new Form1());
? ? ? ? ? ? }
? ? ? ? ? ? else if(res == 1)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? MessageBox.Show("軟件尚未注冊,請注冊軟件!");
? ? ? ? ? ? }
? ? ? ? ? ? else if (res == 2)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? MessageBox.Show("注冊機器與本機不一致,請聯系管理員!");
? ? ? ? ? ? }
? ? ? ? ? ? else if (res == 3)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? MessageBox.Show("軟件試用已到期!");
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? {
? ? ? ? ? ? ? ? MessageBox.Show("軟件運行出錯,請重新啟動!");
? ? ? ? ? ? }
?
========
總結
以上是生活随笔為你收集整理的C#实现注册码功能编程总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 共享软件发布总结
- 下一篇: c# char unsigned_dll