明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

用DEPHI為應(yīng)用軟件創(chuàng)建注冊機制

[摘要]如何保護自己的軟件不被非授權(quán)盜用的問題,始終困擾著每一個程序員。當(dāng)前世界上保護軟件的方法有很多,主要是采用加密(如加軟件狗)方式或軟件注冊方式。使用軟件狗等加密方法,雖然其保護最有效,但對授權(quán)用戶的正常使用有一定的影響,而且軟件發(fā)放比較復(fù)雜,在實際運用中比較少被采用。而注冊登記方式則是當(dāng)前最流行、...
如何保護自己的軟件不被非授權(quán)盜用的問題,始終困擾著每一個程序員。當(dāng)前世界上保護軟件的方法有很多,主要是采用加密(如加軟件狗)方式或軟件注冊方式。使用軟件狗等加密方法,雖然其保護最有效,但對授權(quán)用戶的正常使用有一定的影響,而且軟件發(fā)放比較復(fù)雜,在實際運用中比較少被采用。而注冊登記方式則是當(dāng)前最流行、運用最廣泛的方法,雖然有許多通用軟件其注冊碼可以很容易地被發(fā)燒友們所解,但對于獨立程序員為某特定應(yīng)用設(shè)計的應(yīng)用軟件而言,采用注冊機制顯得最經(jīng)濟、最方便,而且在一定的范圍內(nèi)非常有效。筆者在實際工作中,廣泛使用了軟件注冊方法,有效地維護了軟件的權(quán)益。
  DEPHI軟件的功能極為強大,深受程序員喜歡。用DEPHI開發(fā)的軟件,可以很方便地加入注冊機制。下面筆者就如何在DEPHI開發(fā)的軟件中加入注冊機制與朋友們交流心得。
  要實現(xiàn)軟件注冊機制,需解決以下幾個問題:1、如何加入注冊檢測,判斷軟件是否注冊;2、如何隱藏注冊碼,及是否注冊的標(biāo)志;3、在軟件不注冊情況下,如何限制軟件的使用時間或次數(shù);4、對正常用戶而言,不應(yīng)造成使用不便。對于以上四個問題,如何隱藏注冊碼及是否注冊的標(biāo)志是關(guān)鍵。在WINDOWS95中,WIN95本身及大多數(shù)的應(yīng)用軟件都將其各種參數(shù)放入注冊表中,因而注冊表內(nèi)的數(shù)據(jù)顯得極為龐大和復(fù)雜。如果將注冊標(biāo)志隱藏在注冊表的某一角落中,想要找到它并理解它是極其困難的事。因此我們可以利用這一點,在注冊表的某個分支上設(shè)置一個從名稱上看毫無特殊意義的關(guān)鍵字,將自己軟件的注冊標(biāo)志數(shù)據(jù)存放在這里。以下是整個注冊機制的流程框圖:



  從上圖可以看出,整個注冊機制主要由兩個部分組成:檢查和注冊。通過檢查標(biāo)志值,得出軟件是否已注冊;若沒有注冊,則要看它允許使用的次數(shù)是否已達到;若可使用的次數(shù)已用完,則應(yīng)提示用戶輸入注冊碼,進行注冊;只有用戶輸入的注冊碼正確時,才讓用戶繼續(xù)使用軟件,同時將標(biāo)志置為已注冊,讓用戶永久性使用;否則允許使用的次數(shù)未達到,應(yīng)將次數(shù)加一;若用戶注冊輸入的注冊碼錯誤或拒絕注冊,則直接關(guān)閉軟件,拒絕其繼續(xù)使用。當(dāng)然,在軟件允許使用次數(shù)未達到時,也應(yīng)通過菜單項為用戶提供機會進行注冊登記。以下是筆者在實際開發(fā)中,建立注冊機制的程序代碼及注釋。

假設(shè)軟件的主程序窗口為FORM1,則將該段代碼置放在FORM1.CREATE事件中。代碼如下:

procedure TForm1.form1create(Sender: TObject);
var
re_id:integer;
registerTemp : TRegistry;
inputstr,get_id:string;
dy,clickedok:boolean;
begin
 dy:=false; //軟件是否已到注冊期、及是否允許繼續(xù)使用的標(biāo)志,當(dāng)值為FALSE是為允許使用。
 registerTemp := TRegistry.Create; //準(zhǔn)備使用注冊表
 with registerTemp do
 begin
   RootKey:=HKEY_LOCAL_MACHINE; //存放在此根下
   if OpenKey('Software\Microsoft\Windows\CurrentVersion\Mark',True) then
    // 建一目錄,存放標(biāo)志值。當(dāng)然也可以存放在已存在的目錄下。怎么樣,很難發(fā)現(xiàn)吧?
    begin
     if valueexists('gc_id') then begin //用gc_id的值作為標(biāo)志,首先判斷其存在否?
       re_id:=readinteger('gc_id');//讀出標(biāo)志值
       if (re_id<>0) and (re_id<>100) then begin //若標(biāo)志值為0,則說明已注冊。
              //若不為0且值不到100,說明雖未注冊,但允許使用的次數(shù)尚未達到。
        re_id:=re_id+5; //允許標(biāo)志的最大值為100,每次加5,則最多只可用20次。
        Writeinteger('gc_id',re_id);//將更新后的標(biāo)志值寫入注冊表中。
     end;
     if re_id=100 then dy:=true; //假如值已到100,則應(yīng)注冊。
    end
   else Writeinteger('gc_id',5);//建立標(biāo)志,并置初始標(biāo)志值。
  end;
  if dy then begin //若dy值為TRUE,則應(yīng)提示用戶輸入注冊碼,進行注冊。
    clickedok:=InputQuery('您使用的是非注冊軟件,請輸入注冊碼:',' ',inputstr);
    if clickedok then begin
      get_id:=inttostr(27593758*2);//注冊碼為55187516,當(dāng)然可加入更雜的算法。
      if get_id=inputstr then begin
        Writeinteger('gc_id',0);//若輸入的注冊碼正確,則將標(biāo)志值置為0,即已注冊。
        CloseKey;
        Free;
       end
      else begin //若輸入的注冊碼錯誤,應(yīng)作出提示并拒絕讓其繼續(xù)使用
        application.messagebox('注冊碼錯誤!請與作者聯(lián)系!','警告框',mb_ok);
        CloseKey;
        Free;
        application.terminate; //中止程序運行,拒絕讓其繼續(xù)使用
       end;
      end
    else begin //若用戶不輸入注冊碼,也應(yīng)作出提示并拒絕讓其繼續(xù)使用
      application.messagebox('請與作者聯(lián)系,使用注冊軟件!','警告框',mb_ok);
      CloseKey;
      Free;
      application.terminate;
     end;
  end;
 end;
end;

(注:通過菜單進行注冊的方法同本段提示用戶進行注冊的內(nèi)容雷同,這里不提供代碼。)

  以上程序代碼已在DEPHI3.0/WIN95環(huán)境中運行通過,并在實際運用中得到驗證。對合法用戶而言,這樣的機制,只要其錄入注冊碼一次就可以,不增加其日常使用的負擔(dān);而對非法用戶而言,除非他得到注冊碼或重裝WINDOWS95,否則超過使用次數(shù)后,將無法繼續(xù)使用。當(dāng)然在實際應(yīng)用中還有許多地方可以進一步加強反破解能力,歡迎朋友們提出批評和指導(dǎo)。

(福建 楊健珊)