血色戰車 原文 給自己的軟件制作注冊碼
前言
從今天起, 您開發的的任何軟件如果您願意都可以為之加密 --為您的軟件制作一款注冊機!
當您看完這篇文章時, 您就可以理直氣壯的告訴您的用戶 : "喂, 想用我的軟件是吧 ? 掏錢!".
呵呵, 這當然只是給自己壯膽的話, 現在連萬能注冊機都有了, 人家還怕啥 ? 不過只要您想想微軟, 人家再牛B的加密技術都會被國人"鄙視"? 但人家不也在中國大把大把的撈錢嗎? OK, 不扯了, 我們進入正題.
同一般的軟件注冊一樣, 我們這里的注冊是這樣進行的:
1. 首先根據用戶的硬件信息生成24位的機器碼
-- 相當於種子,用於生成隨機數
2. 采用注冊機根據特征數字生成一個24位注冊碼
-- 相當於偽隨機數生成器, 輸出長度自己定, 最后用一個格式化函數,將隨機數映射到ASCII字符集合
3. 用戶輸入注冊碼注冊成功
假設客戶很喜歡您的軟件, 也假設他沒有破解, 他需要通過以下方式向您取得注冊碼:
(1).如果他能上網, 他需要把機器碼用Email發給您;
(2).如果他不能上網, 他可以把機器碼用手機短信的方式發給您.
(3).如果他沒有手機, 他可以帶着機器碼然后坐火車到您的辦公室想您要一個注冊碼.
--第3條只是為了讓您看帖子的時候別太枯燥了, 抱歉.
現在, 您拿到了客戶的機器碼后, 如果您同時也收到了他匯的錢, 呵呵, 好像給軟件加密就是為了要錢吧? 那么您就可以用客戶的機器碼生成一個唯一的注冊碼再用同樣的方式給用戶, 最后, 用戶輸入注冊碼即可!
需要強調的是客戶機器的硬件信息獲取方式是有很多種選擇的. 這里我們選擇最放心的兩個硬件: CUP的序列號和硬盤的卷標號. 好了, 下面您就可以一步一步制作一款軟件注冊機了.
實現步驟
步驟一: 獲得CUP序列號和硬盤序列號的實現代碼如下:
獲得CPU的序列號
publicstring 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; }
取得設備硬盤的卷標號
publicstring GetDiskVolumeSerialNumber() { ManagementClass mc =new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObject disk =new ManagementObject("win32_logicaldisk.deviceid=/"d:/""); disk.Get(); return disk.GetPropertyValue("VolumeSerialNumber").ToString(); }
步驟二: 收集硬件信息生成機器碼, 代碼如下:
生成機器碼
privatevoid button1_Click(object sender, EventArgs e) { label2.Text = getCpu() + GetDiskVolumeSerialNumber();//獲得24位Cpu和硬盤序列號 string[] strid =newstring[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)]; } }
步驟三: 使用機器碼生成軟件注冊碼, 代碼如下:
publicint[] intCode =newint[127];//用於存密鑰 publicvoid setIntCode()//給數組賦值個小於10的隨機數 { Random ra =new Random(); for (int i =1; i < intCode.Length;i++ ) { intCode[i] = ra.Next(0, 9); } } publicint[] intNumber =newint[25];//用於存機器碼的Ascii值 publicchar[] Charcode =newchar[25];//存儲機器碼字 //生成注冊碼 privatevoid 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值是否0-9之間 { strAsciiName += Convert.ToChar(intNumber[j]).ToString(); } elseif (intNumber[j] >=65&& intNumber[j] <=90)//判斷字符ASCII值是否A-Z之間 { strAsciiName += Convert.ToChar(intNumber[j]).ToString(); } elseif (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(); } } label3.Text = strAsciiName;//得到注冊碼 } } else {
MessageBox.Show("請選生成機器碼","注冊提示"); } }
步驟四: 用戶輸入注冊碼注冊軟件, 演示代碼如下:
privatevoid btnRegist_Click(object sender, EventArgs e) { if (label3.Text !="") { if (textBox1.Text.TrimEnd().Equals(label3.Text.TrimEnd())) { Microsoft.Win32.RegistryKey retkey = Microsoft.Win32.Registry.CurrentUser. OpenSubKey("software", true).CreateSubKey("ZHY").CreateSubKey("ZHY.INI"). CreateSubKey(textBox1.Text.TrimEnd()); retkey.SetValue("UserName", "MySoft"); MessageBox.Show("注冊成功"); } else { MessageBox.Show("注冊碼輸入錯誤"); } } else { MessageBox.Show("請生成注冊碼","注冊提示"); } }
我平時整理的一個生成機器碼的類,大伙看看.
using System; using System.Management; using System.IO; using System.Runtime.InteropServices; using System.Security.Cryptography; using System.Text; using Microsoft.Win32; namespace YiSheng { /// <summary> /// register 的摘要說明。 /// 注冊軟件所用到的類 /// </summary> public class SoftKey { #region 獲取cpu序列號 硬盤ID 網卡硬地址 /// <summary> /// 獲取cpu序列號 /// </summary> /// <returns>string </returns> public static string GetCpuInfo() { string cpuInfo = ""; ManagementClass cimobject = new ManagementClass("Win32_Processor"); ManagementObjectCollection moc = cimobject.GetInstances(); foreach (ManagementObject mo in moc) { cpuInfo = mo.Properties["ProcessorId"].Value.ToString(); } return cpuInfo.ToString(); } /// <summary> /// 獲取硬盤ID /// </summary> /// <returns>string </returns> public static string GetHDid() { string HDid = ""; ManagementClass cimobject1 = new ManagementClass("Win32_DiskDrive"); ManagementObjectCollection moc1 = cimobject1.GetInstances(); foreach (ManagementObject mo in moc1) { HDid = (string)mo.Properties["Model"].Value; } return HDid.ToString(); }