軟體註冊與加密(2)
來源:互聯網
上載者:User
執行個體470 利用網卡序號設計軟體註冊程式
執行個體說明本執行個體實現了利用本機網卡序號產生軟體註冊碼的功能。運行程式,自動獲得本機網卡序號,單擊【產生註冊碼】按鈕,產生軟體註冊碼,將註冊碼依次輸入下面的文字框,單擊【註冊】按鈕實現軟體註冊功能。執行個體運行結果16.8所示。
技術要點實現本執行個體功能主要用到了Microsoft.Win32命名空間下的Registry類的CurrentUser屬性、RegistryKey類的OpenSubKey( )方法、GetSubKeyNames( )方法、SetValue( )方法、CreateSubKey( )方法、System.Management命名空間下的ManagementClass類的GetInstances( )方法、ManagementObjectCollection類和ManagementObject類。Microsoft.Win32命名空間下的類和方法在第16章執行個體469中已經做過介紹,這裡不再詳細說明,下面主要對System.Management命名空間及該命名空間下的類進行詳細介紹。(1)System.Management命名空間提供對大量管理資訊和管理事件集合的訪問,這些資訊和事件是與根據Windows管理規範 (WMI)結構對系統、裝置和應用程式設定檢測點有關的。(2)ManagementClass類表示公用資訊模型(CIM)管理類。管理類是一個WMI類,如Win32_LogicalDisk和Win32_Process,前者表示磁碟機,後者表示進程(如Notepad.exe)。文法格式為:public class ManagementClass : ManagementObject(3)GetInstances( )方法返回該類的所有執行個體的集合。文法格式為:public ManagementObjectCollection GetInstances ()l 傳回值:表示該類執行個體的ManagementObject對象的集合。(4)ManagementObjectCollection類基於指定的查詢檢索管理對象的集合。此類是用於檢索管理資訊的較為常用的進入點之一。例如,可以用於枚舉系統中的所有磁碟機、網路介面卡、進程及更多管理對象,或者用於查詢所有處於活動狀態的網路連接以及暫停服務等。(5)ManagementObject類表示 WMI 執行個體。
實現過程(1)建立一個Windows應用程式,將其命名為Ex16_08,預設表單為Form1。(2)在Form1表單中添加4個TextBox控制項、3個Button控制項和6個Label控制項。其中,TextBox控制項用輸入註冊碼,Button控制項用來執行註冊、退出和產生註冊碼操作,Label控制項用於顯示電腦名稱、網卡序號、軟體註冊碼和一些提示資訊等。(3)主要程式碼。獲得網卡序號和電腦名稱的實現代碼如下:private void Form1_Load(object sender, EventArgs e) { label2.Text = Environment.MachineName.ToString();//得到電腦名稱 label4.Text = GetNetCardMacAddress();//得到網卡資訊 } //獲得網卡資訊函數 public string GetNetCardMacAddress() { ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection moc = mc.GetInstances(); string str = ""; foreach (ManagementObject mo in moc) { if ((bool)mo["IPEnabled"] == true) str = mo["MacAddress"].ToString(); } return str; }產生註冊碼的實現代碼如下:string[] strLanCode = new string[12];// 網卡資訊儲存 string[] strkey ={ "Q", "W", "7", "E", "D", "F", "2", "G", "R", "T", "Y", "8", "P", "N", "B", "V", "C", "X", "Z", "0", "9", "I", "8", "6", "U", "O", "P", "M", "5", "4", "3", "1", "A", "S", "H", "J", "K", "L" }; //產生註冊碼 public int intRand = 0;//判斷隨機產生次數 private void button1_Click(object sender, EventArgs e) { //把網卡資訊轉換成字串 string strCode = GetNetCardMacAddress();//調用函數擷取網卡資訊 strCode = strCode.Substring(0, 2) + strCode.Substring(3, 2) + strCode.Substring(6, 2) + strCode.Substring(9, 2) + strCode.Substring(12, 2) +strCode.Substring(15, 2); string strb = strCode.Substring(0, 4) + strCode.Substring(4, 4) + strCode.Substring(8, 4);//網卡資訊儲存 for (int i = 0; i < strLanCode.Length; i++)//把網卡資訊存入數組 { strLanCode[i] = strb.Substring(i, 1); } Random ra = new Random(); switch (intRand)//隨機產生註冊碼的順序 { case 0: label5.Text = strCode.Substring(0, 4) + "-" + strCode.Substring(4, 4) + "-" + strCode.Substring(8, 4) + "-" + strkey[ra.Next(0, 37)].ToString() + strkey[ra.Next(0, 37)].ToString() + strkey[ra.Next(0, 37)].ToString() + strkey[ra.Next(0, 37)].ToString(); intRand = 1; break; case 1: label5.Text = strCode.Substring(0, 4) + "-" + strCode.Substring(4, 4) + "-" + strLanCode[ra.Next(0, 11)] + strLanCode[ra.Next(0, 11)] + strLanCode[ra.Next(0, 11)] + strLanCode[ra.Next(0, 11)] + "-" + strkey[ra.Next(0, 37)].ToString() + strkey[ra.Next(0, 37)].ToString() + strkey[ra.Next(0, 37)].ToString() + strkey[ra.Next(0, 37)].ToString(); intRand = 2; break; case 2: label5.Text = strCode.Substring(0, 4) + "-" + strLanCode[ra.Next(0, 11)] + strLanCode[ra.Next(0, 11)] + strLanCode[ra.Next(0, 11)] + strLanCode[ra.Next(0, 11)] + "-" + strLanCode[ra.Next(0, 11)] + strLanCode[ra.Next(0, 11)] + strLanCode[ra.Next(0, 11)] + strLanCode[ra.Next(0, 11)] + "-" + strkey[ra.Next(0, 37)].ToString() + strkey[ra.Next(0, 37)].ToString() + strkey[ra.Next(0, 37)].ToString() + strkey[ra.Next(0, 37)].ToString(); intRand = 3; break; case 3: label5.Text = strLanCode[ra.Next(0, 11)] + strLanCode[ra.Next(0, 11)] + strLanCode[ra.Next(0, 11)] + strLanCode[ra.Next(0, 11)] + "-" + strLanCode[ra.Next(0, 11)] + strLanCode[ra.Next(0, 11)] + strLanCode[ra.Next(0, 11)] + strLanCode[ra.Next(0, 11)] + "-" + strLanCode[ra.Next(0, 11)] + strLanCode[ra.Next(0, 11)] + strLanCode[ra.Next(0, 11)] + strLanCode[ra.Next(0, 11)] + "-" + strkey[ra.Next(0, 37)].ToString() + strkey[ra.Next(0, 37)].ToString() + strkey[ra.Next(0, 37)].ToString() + strkey[ra.Next(0, 37)].ToString(); intRand = 0; break; } }註冊軟體的實現代碼如下。 private void button2_Click(object sender, EventArgs e) { if (label5.Text == "") { MessageBox.Show("請產生註冊碼"); } else { string strNameKey = textBox1.Text.TrimEnd() + textBox2.Text.TrimEnd() + textBox3.Text.TrimEnd() + textBox4.Text.TrimEnd(); string strNumber = label5.Text.Substring(0, 4) + label5.Text.Substring(5, 4) + label5.Text.Substring(10, 4) + label5.Text.Substring(15, 4); if (strNameKey == strNumber) { Microsoft.Win32.RegistryKey retkey1 = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("software").OpenSubKey("ZHY").OpenSubKey("ZHY.INI", true); foreach (string strName in retkey1.GetSubKeyNames())//判斷註冊碼是否到期 { if (strName == strNameKey) { MessageBox.Show("此註冊碼已經到期"); return; } }//開始註冊資訊 Microsoft.Win32.RegistryKey retkey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("software",true).CreateSubKey("ZHY").CreateSubKey("ZHY.INI").CreateSubKey(strNumber.TrimEnd()); retkey.SetValue("UserName", "明日科技"); MessageBox.Show("註冊成功!", "提示"); Application.Exit(); } else { MessageBox.Show("註冊碼輸入錯誤"); } } }
舉一反三根據本執行個體,讀者可以實現以下功能。 應用組件的註冊使用。 銷售的軟體產品進行授權。執行個體471 根據cpu序號、磁碟序號設計軟體註冊程式
執行個體說明本執行個體根據電腦的cpu號和硬碟序號經過簡單的計算自動產生一組無規律的註冊碼來實現應用程式的註冊。運行程式,單擊【產生機器碼】按鈕,產生24位的機器碼,單擊【產生註冊碼】按鈕,根據產生的機器碼自動轉換出24位註冊碼,將註冊碼輸入文字框中,單擊【註冊】按扭,完成軟體註冊功能。執行個體運行對果16.9所示。
技術要點實現本執行個體功能主要用到了Microsoft.Win32命名空間下的Registry類的CurrentUser屬性、RegistryKey類的OpenSubKey( )方法、GetSubKeyNames( )方法、SetValue( )方法、CreateSubKey( )方法、System.Management命名空間下的ManagementClass類的GetInstances( )方法、ManagementObjectCollection類和ManagementObject類、Char字元、Random類的Next( )方法。Microsoft.Win32和System.Management命名空間下的類和方法在第16章執行個體469和470中已經做過介紹,這裡不再詳細講解。下面對本執行個體中用到的其他知識進行詳細介紹。(1)Char字元Char類型的常數可以寫成字元、十六進位換碼序列或Unicode表示形式,使用者也可以顯式轉換整數字元代碼。(2)Random類表示偽隨機數產生器,一種能夠產生滿足某些隨機性統計要求的數字序列的裝置。(3)Next方法返回一個指定範圍內的隨機數。文法格式為:public virtual int Next (int minValue,int maxValue)參數說明如下。l minValue:返回的隨機數的下界(隨機數可取該下界值)。l maxValue:返回的隨機數的上界(隨機數不能取該上界值)。maxValue必須大於或等於minValue。l 傳回值:一個大於或等於minValue且小於maxValue的32位帶正負號的整數,即返回的值範圍包括minValue但不包括maxValue。如果minValue等於maxValue,則返回minValue。
實現過程(1)建立一個Windows應用程式,將其命名為Ex16_08,預設表單為Form1。(2)在Form1表單中,主要添加一個TextBox控制項,用來輸入註冊碼;添加4個Button控制項,用來執行註冊、退出、產生註冊碼和產生機器碼操作;添加3個Label控制項,用於顯示軟體註冊碼和機器碼等資訊。(3)主要程式碼。獲得CPU序號和硬碟序號的實現代碼如下: 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 getCpu()獲得CPU的序號 { 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; }產生機器碼的實現代碼如下: private void button1_Click(object sender, EventArgs e) { label2.Text = getCpu() + GetDiskVolumeSerialNumber();//獲得24位CPU和硬碟序號 string[] strid = new string[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)]; } }產生註冊碼的實現代碼如下: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); } } public int[] intNumber = new int[25];//用於存機器碼的AscII值 public char[] Charcode = new char[25];//儲存機器碼字 //產生註冊碼 private void 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(); } 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(); } } label3.Text = strAsciiName;//得到註冊碼 } } else { MessageBox.Show("請選產生機器碼","註冊提示"); } }
舉一反三根據本執行個體,讀者可以實現以下功能。 擷取CPU資訊。 進行遠程軟體產品的註冊。