如何保護自己的軟件不被非授權盜用的問題,始終困擾著每一個程序員。當前世界上保護軟件的方法有很多,主要是采用加密(如加軟件狗)方式或軟件注冊方式。使用軟件狗等加密方法,雖然其保護最有效,但對授權用戶的正常使用有一定的影響,而且軟件發放比較復雜,在實際運用中比較少被采用。而注冊登記方式則是當前最流行、運用最廣泛的方法,雖然有許多通用軟件其注冊碼可以很容易地被發燒友們所解,但對於獨立程序員為某特定應用設計的應用軟件而言,采用注冊機制顯得最經濟、最方便,而且在一定的范圍內非常有效。筆者在實際工作中,廣泛使用了軟件注冊方法,有效地維護了軟件的權益。
DEPHI軟件的功能極為強大,深受程序員喜歡。用DEPHI開發的軟件,可以很方便地加入注冊機制。下面筆者就如何在DEPHI開發的軟件中加入注冊機制與朋友們交流心得。
要實現軟件注冊機制,需解決以下幾個問題:1、如何加入注冊檢測,判斷軟件是否注冊;2、如何隱藏注冊碼,及是否注冊的標志;3、在軟件不注冊情況下,如何限制軟件的使用時間或次數;4、對正常用戶而言,不應造成使用不便。對於以上四個問題,如何隱藏注冊碼及是否注冊的標志是關鍵。在Windows95中,WIN95本身及大多數的應用軟件都將其各種參數放入注冊表中,因而注冊表內的數據顯得極為龐大和復雜。如果將注冊標志隱藏在注冊表的某一角落中,想要找到它並理解它是極其困難的事。因此我們可以利用這一點,在注冊表的某個分支上設置一個從名稱上看毫無特殊意義的關鍵字,將自己軟件的注冊標志數據存放在這裡。以下是整個注冊機制的流程框圖:
從上圖可以看出,整個注冊機制主要由兩個部分組成:檢查和注冊。通過檢查標志值,得出軟件是否已注冊;若沒有注冊,則要看它允許使用的次數是否已達到;若可使用的次數已用完,則應提示用戶輸入注冊碼,進行注冊;只有用戶輸入的注冊碼正確時,才讓用戶繼續使用軟件,同時將標志置為已注冊,讓用戶永久性使用;否則允許使用的次數未達到,應將次數加一;若用戶注冊輸入的注冊碼錯誤或拒絕注冊,則直接關閉軟件,拒絕其繼續使用。當然,在軟件允許使用次數未達到時,也應通過菜單項為用戶提供機會進行注冊登記。以下是筆者在實際開發中,建立注冊機制的程序代碼及注釋。
假設軟件的主程序窗口為FORM1,則將該段代碼置放在FORM1.CREATE事件中。代碼如下:
procedure TForm1.form1create(Sender: TObject);
var
re_id:integer;
registerTemp : TRegistry;
inputstr,get_id:string;
dy,clickedok:boolean;
begin
dy:=false; //軟件是否已到注冊期、及是否允許繼續使用的標志,當值為FALSE是為允許使用。
registerTemp := TRegistry.Create; //准備使用注冊表
with registerTemp do
begin
RootKey:=HKEY_LOCAL_MacHINE; //存放在此根下
if OpenKey('SoftwareMicrosoftWindowsCurrentVersionMark',True) then
// 建一目錄,存放標志值。當然也可以存放在已存在的目錄下。怎麼樣,很難發現吧?
begin
if valueexists('gc_id') then begin //用gc_id的值作為標志,首先判斷其存在否?
re_id:=readinteger('gc_id');//讀出標志值
if (re_id<>0) and (re_id<>100) then begin //若標志值為0,則說明已注冊。
//若不為0且值不到100,說明雖未注冊,但允許使用的次數尚未達到。
re_id:=re_id+5; //允許標志的最大值為100,每次加5,則最多只可用20次。
Writeinteger('gc_id',re_id);//將更新後的標志值寫入注冊表中。
end;
if re_id=100 then dy:=true; //假如值已到100,則應注冊。
end
else Writeinteger('gc_id',5);//建立標志,並置初始標志值。
end;
if dy then begin //若dy值為TRUE,則應提示用戶輸入注冊碼,進行注冊。
clickedok:=InputQuery('您使用的是非注冊軟件,請輸入注冊碼:',' ',inputstr);
if clickedok then begin
get_id:=inttostr(27593758*2);//注冊碼為55187516,當然可加入更雜的算法。
if get_id=inputstr then begin
Writeinteger('gc_id',0);//若輸入的注冊碼正確,則將標志值置為0,即已注冊。
CloseKey;
Free;
end
else begin //若輸入的注冊碼錯誤,應作出提示並拒絕讓其繼續使用
application.messagebox('注冊碼錯誤!請與作者聯系!','警告框',mb_ok);
CloseKey;
Free;
application.terminate; //中止程序運行,拒絕讓其繼續使用
end;
end
else begin //若用戶不輸入注冊碼,也應作出提示並拒絕讓其繼續使用
application.messagebox('請與作者聯系,使用注冊軟件!','警告框',mb_ok);
CloseKey;
Free;
application.terminate;
end;
end;
end;
end;
(注:通過菜單進行注冊的方法同本段提示用戶進行注冊的內容雷同,這裡不提供代碼。)
以上程序代碼已在DEPHI3.0/WIN95環境中運行通過,並在實際運用中得到驗證。對合法用戶而言,這樣的機制,只要其錄入注冊碼一次就可以,不增加其日常使用的負擔;而對非法用戶而言,除非他得到注冊碼或重裝Windows95,否則超過使用次數後,將無法繼續使用。當然在實際應用中還有許多地方可以進一步加強反破解能力,歡迎朋友們提出批評和指導。