開發軟體時,當用到商業用途時,註冊碼與啟用碼就顯得很重要了。現在的軟體破解技術實在在強了,各種國內外大型軟體都有註冊機制,但同時也不斷地被破解。下面發的只是乙個常用版本,發出原始碼被破就更容易了,但我們學習的是技術。當然也為以後自己的軟體不會被輕易破解。
第一步。根據卷標,cpu序列號,生成機器碼
// 取得裝置硬碟的卷標號
public static string getdiskvolumeserialnumber()
managementclass mc = new managementclass(「win32_networkadapterconfiguration」);
managementobject disk = new managementobject(「win32_logicaldisk.deviceid=」d:」");
disk.get();
return disk.getpropertyvalue(「volumeserialnumber」).tostring();
//獲得cpu的序列號
public static 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 static string getmnum()
string strnum = getcpu() + getdiskvolumeserialnumber();//獲得24位cpu和硬碟序列號
string strmnum = strnum.substring(0, 24);//從生成的字串中取出前24個字元做為機器碼
return strmnum;
public static int intcode = new int[127];//儲存金鑰
public static int intnumber = new int[25];//存機器碼的ascii值
public static char charcode = new char[25];//儲存機器碼字
public static void setintcode()//給陣列賦值小於10的數
for (int i = 1; i < intcode.length; i++)
intcode[i] = i % 9;
第二步。根據機器碼 生成註冊碼
//生成註冊碼
public static string getrnum()
setintcode();//初始化127位陣列
for (int i = 1; i < charcode.length; i++)//把機器碼存入陣列中
charcode[i] = convert.tochar(getmnum().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 = 「」;//用於儲存註冊碼
for (int j = 1; j < intnumber.length; j++)
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();
return strasciiname;
第三步。檢查註冊狀況,若沒有註冊,可自定義試用
///
/// 檢查註冊
///
private void checkregist()
this.btn_reg.enabled = true;
registrykey retkey = microsoft.win32.registry.currentuser.opensubkey(「software」, true).createsubkey(「wxk」).createsubkey(「wxk.ini」);
foreach (string strrnum in retkey.getsubkeynames())//判斷是否註冊
if (strrnum == clstools.getrnum())
thcontrol(true);
return;
thcontrol(false);
thread th2 = new thread(new threadstart(thcheckregist2));
th2.start();
///
/// 驗證試用次數
///
private static void thcheckregist2()
messagebox.show(「您現在使用的是試用版,該軟體可以免費試用3000000次!」, 「提示」, messageboxbuttons.ok, messageboxicon.information);
int32 tlong;
trytlong = (int32)registry.getvalue(「hkey_local_machine\software\angel」, 「usetimes」, 0);
catch
registry.setvalue(「hkey_local_machine\software\angel」, 「usetimes」, 0, registryvaluekind.dword);
messagebox.show(「歡迎新使用者使用本軟體」, 「提示」, messageboxbuttons.ok, messageboxicon.information);
tlong = (int32)registry.getvalue(「hkey_local_machine\software\angel」, 「usetimes」, 0);
if (tlong < 3000000)
int times = tlong + 1;
registry.setvalue(「hkey_local_machine\software\angel」, 「usetimes」, times);
else
messagebox.show(「試用次數已到」, 「警告」, messageboxbuttons.ok, messageboxicon.warning);
C 生成軟體註冊碼
今天早上,花了乙個早上弄了個生成機器碼和註冊碼的demo,通過生成的註冊碼裡面包含時間資訊,保證了註冊碼在使用後的指定時間後失效 由於數學不行所以寫的比較簡單,ok 上 吧 產生機器碼的原理很簡單,基本上都是取裝置資訊之後加密 取本機機器碼 public static string getmachi...
C 軟體生成註冊碼
開發軟體時,當用到商業用途時,註冊碼與啟用碼就顯得很重要了。現在的軟體破解技術實在在強了,各種國內外大型軟體都有註冊機制,但同時也不斷地被破解。下面發的只是乙個常用版本,發出原始碼被破就更容易了,但我們學習的是技術。當然也為以後自己的軟體不會被輕易破解。第一步。根據卷標,cpu序列號,生成機器碼 取...
C 生成註冊碼
string t datetime.now.ticks.tostring t deskey.desencrypt t,deskey.deskeystr string strid new string t.length for int i 0 i t.length i 把字元賦給陣列 string s...