目前,國內軟體銷售過程中採用了一種新的方式:開發者根據計算機中不同的硬體配置標誌直接在應用程式中設定金鑰,限制程式的使用次數或者限制某些先進功能的使用,然後將受限制的應用程式無償提供給使用者。使用者在試用一段時間之後如果覺得很滿意,就可以將安裝程式提取的硬體配置解密金鑰或已經採集機器配置情況的應用程式提供給開發者,並花少量費用購買自己機器中的電子註冊金鑰,從而能夠充分利用應用程式的所有功能。
在應用程式中利用電子註冊來限制應用程式的部分功能,這樣既可以讓使用者先試用然後再決定是否購買應用程式,又保護了開發者的合法勞動成果,減少了使用者與開發者之間的不必要的中間環節。開發者直接得到使用者購買軟體的費用,真正地體現了開發者所創造的價值;使用者在試用軟體之後再決定是否購買,從而使得使用者能夠得到稱心如意、物有所值的軟體。因此,不通過中間環節這種銷售方式降低了軟體的成本,使開發者和使用者雙方都受益。同時,這種方式還可以使得開發者能夠直接獲得使用者的反饋資訊,促使開發者開發出功能更加完善的應用程式。
然而,要想在應用程式中實現電子註冊功能決不是件容易的事情,尤其是在windows 平台推出以後,要想實現乙個跨平台的應用程式電子註冊功能,則要求開發者應具有豐富的程式設計技巧和實際開發經驗以及廣闊的開發視野。筆者通過實踐探索,終於成功地實現了跨越dos、windows 3.x和windows 95平台的應用程式電子註冊功能。下面將闡述其實現原理及技巧。
一、註冊金鑰點的選擇與生成
實現應用程式的電子註冊功能,最關鍵的問題是採集硬體配置中的金鑰點。在dos 系統下,可以通過硬碟埠1f6h和1f7h直接讀取硬碟的序列號等作為金鑰演算法的資料,因為每塊硬碟的型號、版本號和序列號均不同,只要使用者提供上述內容,利用這種方法生成的註冊金鑰在每台計算機中均不同,從而實現電子註冊的功能。著名的字表處理軟體cced 5.18中採用的就是類似的方法。雖然這種方法在絕大數場合下很有效,甚至可以在windows 3.x系統和windows 95系統的相容模式下通過,但在最高效能配置的windows 95保護模式下卻行不通,原因是windows 95保護模式下不允許通過埠方式讀取硬碟型別引數,所以利用這種方法無法實現跨平台的通用電子註冊功能。
本人仔細分析計算機中rom區的f000h-ffffh內容後 ,發現該區域中記錄著很多與硬體配置有關的資訊(如cmos配置資訊、主機板名稱、型號和序列號、主機標誌位元組和生產日期等)。可以採集其中一處或幾處作為註冊金鑰演算法的原始資料(如機器rom區中的f000h:fff5h-f000h:ffffh中依次存放主機出廠日期和主機標誌位元組的內容),這些硬體特有的資訊對於不同型號的計算機來說是不可能相同的。因此,完全可以將其作為註冊金鑰演算法的原始資料,而且這些內容在dos、windows 3.x和windows 95下均相同。需要注意的是,如果在實際應用中真的將該採集點作為演算法的原始資料,則不應該包括f000:fff0h開始的前五個位元組的內容,原因是該位址已被用作機器熱啟動時的入口位址,在dos、windows 3.x和windows 95系統中對熱啟動復合鍵ctrl+alt+del的處理程式均不同,因此該處的內容在三者之中也都不相同,讀者應記住這一點。
利用上述方法取得註冊金鑰演算法的原始資料後,開發者就可以確定自己的加密演算法,這可以通過程式語言中豐富的位操作功能來實現。然後將註冊加密演算法增加到應用程式中需要限制的部分,並可根據應用程式的實際需要和限制的功能任意設定多處,使盜版者很難解密,從而有效地保護開發者的成果。利用這一方法,即使機器中有多個應用程式使用相同的硬體配置資訊採集點,也不可能發生任意加密衝突問題;即便是使用了相同的演算法原始資料,由於演算法不同,註冊金鑰也不會完全相同;即使解密者知道加密演算法的原始資料,由於無法知道加密演算法,再加上加密演算法貫穿於整個應用程式,所以很難解密。因此,上述方法可以有效地實現跨越dos、windows 3.x和windows 95平台的電子註冊功能。此外,由於rom 區關鍵點的內容不可能發生變化,所以即使將來推出新型的作業系統平台,這種方法仍然會很有效。
二、利用解密金鑰建立聯絡
應用程式的加密部分完成之後,就需要建立相應的解密金鑰。所謂解密金鑰,就是將加密演算法的原始資料經過加密之後,直接顯示給使用者並寫入應用程式的相應位置。這樣,使用者既可以通過**或計算機網路給開發者提供註冊功能的演算法原始資料,也可以將安裝後的應用程式寄給開發者。加密金鑰既可以是rom 區域內的原始資料(最好不要原樣提供),也可以是由原始資料經過一定換算後形成的新的資料。因此,開發者提供的應用程式中的加密演算法部分應包括兩部分:將機器rom 區域內的資料經過解密金鑰演算法後形成解密金鑰,再將解密金鑰資料經註冊演算法後形成註冊金鑰。
應用程式中註冊金鑰的演算法、註冊金鑰的長度、顯示或提供給開發者的方式可自己確定,但解密金鑰的長度和演算法應與註冊金鑰完全相同。解密金鑰也沒有必要做得那麼複雜,只需進行簡單處理後就可以實現,例如本文程式中實現的方法是將rom中採集的資料簡單地減去0x2020。
三、電子註冊金鑰生成程式
開發者得到使用者提供的解密金鑰原始資料後,需要利用專用的金鑰生成程式將其轉換成註冊金鑰,並將註冊金鑰交給使用者。註冊金鑰的演算法與應用程式中判斷註冊金鑰的加密演算法程式應該完全相同。該程式一般應具有以下三種取得註冊金鑰演算法原始資料的方式,以方便進行金鑰的處理。該程式的名稱為readkey.exe,其功能如下:
(1)當readkey不帶引數時,則直接從當前機器中取得註冊金鑰;
(2)當readkey帶引數時,則從鍵盤輸入解密金鑰來獲取註冊金鑰;
(3)當readkey帶exe檔名引數時,則從相應應用程式的特定位置取得解密金鑰,並生成註冊金鑰。
使用者得到註冊金鑰後,重新安裝一次應用程式或在需要輸入註冊金鑰處直接輸入金鑰,則應用程式會自動將這個註冊金鑰存放到檔案的特定位置處,當應用程式被他人拷貝到其它機器中之後,由於註冊金鑰隨機器的不同而不同,所以應用程式的功能或使用次數仍然受限,要想在其它機器中使用該應用程式,則必須重新註冊。
應用程式中解密金鑰和註冊金鑰的位置,可先用特殊字元來標識,然後用debug 等程式直接查詢其位置,再修改其它程式中讀取或寫入資料的位址值。至於解密金鑰顯示和註冊金鑰的輸入方式,可由開發者確定是用安裝程式的方法還是在應用程式中直接處理的方法。
/*電子註冊功能金鑰讀取程式清單readkey.c*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
void readser(void);
void readser1(void);
unsigned char buff[18];
unsigned int keyrom[9];
unsigned int sum,sumi,sumj;
unsigned int far *pt= (unsigned int far *)0xf000fff6l;
unsigned int i=0,j=0,m;
unsigned char p;
unsigned int nn,nn1,nn2;
unsigned char rbuff[100],cc,cc1,cc2;
int fp;
void main(int argc,char *argv)
printf("num:");
for(i=0;i<5;i++)
printf("\n");
sum=0x2020;
for(sumj=0;sumj<4;sumj++)
if((fp=open(argv[1],o_rdwr | o_binary))==-1)
lseek(fp,0xf040l,seek_set);//rom 10個資料位址+200h
read(fp,keyrom,0xal); //讀取資料
readser1(); //讀檔案中的註冊金鑰
} else readser(); //讀機器中的註冊金鑰
void readser(void)
else
for(sumj=0;sumj<4;sumj++) else{
simeg.useflag=true;//未註冊
由於直接讀取記憶體單元中的資料來生成註冊金鑰和註冊限制功能的**部分,其執行速度特別快,對應用程式幾乎沒有任何影響。因此,可以在應用程式中增加若干個註冊金鑰生成函式和限制功能**,使解密者知難而退,從而達到保護開發者的勞動成果的目的。這種增加註冊金鑰生成及判斷限制功能的方法,其缺點是使應用程式的長度增加了,但這對於目前高檔計算機的大容量硬碟來說只不過是九牛一毛而已,所以該方法非常可行。
如何在型別中嵌入功能
主要有兩種方法來實現在型別中嵌入功能 a 聚合 或組合 包含乙個所需功能型別的具名字段。b 內嵌 內嵌 匿名地 所需功能型別,像前一節 10.6 5 所演示的那樣。為了使這些概念具體化,假設有乙個 customer 型別,我們想讓它通過 log 型別來包含日誌功能,log 型別只是簡單地包含乙個累積...
如何在程式中延時
方法一 使用sleep函式,如延時2秒,用sleep 2000 方法二 使用sleep函式的不利在於延時期間不能處理其他的訊息,如果時間太長,就好象宕機一樣,利用coledatetime類和coledatetimespan類實現延時就不會出現那樣的問題 coledatetime start time...
Python實現註冊 登入小程式功能
主要實現功能 1 使用者輸入使用者名稱,在使用者名稱檔案中查詢對應的使用者,若無對應使用者名稱則列印輸入錯誤 2 使用者名稱輸入正確後,進行密碼匹配。輸入密碼正確則登入成功,否則重新輸入。3 連續輸錯三次密碼則該使用者名稱被鎖,退出程式 在程式資料夾下建立乙個使用者名稱 密碼的檔案 user np....