一個數據庫系統的注冊原理:
在討論這前先來了解一下異或運算的性質:
若c=a^b;
則a=c^b;b=a^c;
基本思路如下:
(1)int(用戶C盤序列號^用戶名^1234567890123)生成一個序列號N(是字符串CString類型);
(2)系統檢測到你的軟件還沒注冊就自動生成一個文件,文件保存了你輸入的用戶名和序列號 N.公司會叫你EMail這個文件到他們公司郵箱,公司再返回一個注冊碼的!
(3)如果發回一個注冊碼,系統會判斷 用戶名^用戶C盤序列號 =注冊碼?來進入系統的!注冊成 功后再把用戶名和注冊碼保存到系統文件(ini)中下次登陸就會檢測這個文件,這次是判斷 用戶名^注冊碼=用戶C盤序列號? 來判斷進入系統了!
推理:
從上得到三條有用信息:
(1)用戶名對于用戶和公司來說都是已知的
(2)int(用戶C盤序列號^1234567890123)=N(經過Format變成字符串)
(3)用戶名^用戶C盤序列號=注冊碼
從(1)和上面的異或性質推出: atoi(N)^1234567890123=用戶C盤序列號 (3)
從(2)和異或性質推出: 注冊碼=用戶C盤序列號^用戶名 (4)
從(3),(4)式再推出
注冊碼=atoi(N)^1234567890123^用戶名
用戶名和序列號N都發給了公司,公司就是利用這條公司進行求注冊碼!
理解了這個思路后我就寫了個生成注冊碼的程序:
就是逆運算吧了!假如我是那公司,發到我手上的信息已經有兩個了,用戶名和序列號N;這樣,主要我用atoi(序列號)^1234567890123就可以求得注冊碼了,只不過在做的時候就是類型轉換有點復雜吧了!!
為了便于復習把代碼貼出來:
LPCTSTR lpRootPathName="C:\\";
LPTSTR lpVolumeNameBuffer=new char[12];
DWORD nVolumnNameSize=12;
DWORD MaximumComponentLength;
DWORD FileSystemFlags;
LPTSTR lpFileSystemNameBuffer=new char[10];
DWORD FileSystemNameLength=12;
GetVolumeInformation(lpRootPathName,lpVolumeNameBuffer,nVolumnNameSize,&m_VolumnSerialNumber,&MaximumComponentLength,&FileSystemFlags,lpFileSystemNameBuffer,FileSystemNameLength);
delete(lpVolumeNameBuffer);
delete(lpFileSystemNameBuffer);
上面就是將C盤序列號放到DWORD類型的m_VolumnSerialNumber中!
sSerialNumber.Format("%d",m_VolumnSerialNumber^1234567890123);
生成的序列號就保存在sSerialNumber中!
int(用戶C盤序列號^1234567890123)=N已經完成!
下面是 用戶名^用戶C盤序列號=注冊碼
CString sName,sNameCode,sCode;
this->m_EdtUserName.GetWindowText(sName);
char * cNameCode=sName.GetBuffer(sName.GetLength());
DWORD dNameCode=*cNameCode;
sCode.Format("%d",m_VolumnSerialNumber^dNameCode);
sCode就保存了注冊碼!