本文主要從三個方面介紹了電腦軟體註冊與加密技術:DOS系統下軟體註冊與加密,Windows系統軟體註冊與加密以及共用軟體網路註冊方法。文中介紹的許多方法現在仍在沿用,也有的方法和技術早已淘汰,但大都值得我們借鑒學習。在分析註冊加密過程和方法的同時,引用了不少原始碼以突出其實現過程。
關鍵詞:軟體加密、軟體註冊、共用軟體
引言
隨著電腦科學與技術的發展,電腦軟體學科已經成為電腦科學的重要組成部分,軟體產品也在電腦產品市場上佔有重要地位。由於軟體產品的可複製性和可篡改性,它能很容易的被非法複製並銷售,嚴重損害了軟體設計者的合法權益。為此,軟體設計者們經過不懈努力,精心為自己的軟體加密,以保證自己的權益不被侵犯。他們成功過,但也曾對電腦安全產生了不良影響,有的設計者為了嚴厲打擊盜版,在程式碼中加入“邏輯炸彈”,更有甚者,設計出帶有“自殺性”和病毒的軟體,當發現有複製操作進行時,便使用這段代碼把自己銷毀並將病毒傳播出去,這些舉動都對電腦系統的安全造成威脅。
要瞭解當今流行的電腦軟體註冊和加密技術,我們必須首先深入DOS系統,深刻理解DOS環境下的軟體註冊和加密的原理和實現方法。雖然Windows已一統天下,DOS早已失去了它的光芒,但基於這一平台的許多軟體設計思想都是值得借鑒的,因為它具有Windows系統不可替代的特性:對硬體操作更加方便,軟體的加密方法更加多樣化也更容易實現。Windows系統的出現,又給軟體設計者們帶來了新的機遇:註冊表、動態串連庫、多線程技術和電腦網路給軟體註冊和加密提供了新的途徑。如果能將這兩種完全不同結構的系統下軟體註冊加密技術結合的話,我想,所能實現的效果是任何一種技術都不可比擬的。
本文討論的重點並不在於資料的加密過程,而是在於如何充分利用作業系統的特性和提供的API才能使軟體加密更加安全。或者說,對於如何?資料加密和通過什麼途徑來實現軟體加密這兩個問題,我們更加關心後者。軟體加密和資料加密不同,方法不同,目的也不同,但軟體加密離不開資料加密。
一、DOS系統下軟體註冊和加密技術
許多共用軟體都有這樣的特點:使用了一段時間後,要求使用者輸入使用者名稱和註冊碼,使用者名稱由使用者自己定義,而註冊碼則需要通過付款給軟體著作人的途徑來取得,得到註冊碼後,使用者將編碼填入對話方塊後,軟體便能繼續使用,否則將無法運行。這一過程是一等價交換的過程:設計者獲得其價值,使用者獲得使用價值,軟體成為商品。那麼,軟體本身是如何知道使用者填入的資訊是合法的呢?其實很簡單:著作人和軟體本身使用了同一套註冊機制,或稱之為“協議”,使用者並不知道這一協議,所以無法破解註冊碼,只能從著作人處購買。其實所有的註冊型軟體都有一段類似於下面的程式碼:
program MyProgram (Input, Output);
function GetKey (UserName,OtherInfo:String):KeyType;
begin
//...
end;
function Registered (UserName,OtherInfor:String;UserInput:KeyType):Boolean;
begin
if GetKey(UserName,OtherInfo)=UserInput then begin
result:=TRUE;
Exit;
end;
result:=FALSE;
end;
begin
//...
if (not Registered) then begin
ShowMessage ('Not Registered!!');
Exit;
end;
//...
end.
在這段代碼中,GetKey函數用於通過使用者的使用者名稱和一些其它資訊產生註冊碼,Registered函數用於返回使用者是否正確註冊。上面已經提到過,軟體加密與資料加密不同,軟體加密在注重資料加密演算法的同時,更加註重資料密碼的隱蔽性。下面從三個方面來介紹DOS系統下的常用加密技術。
1、 使用磁碟的隱藏扇區實現加密
這是最古老的加密技術。仍然是上面這個問題,為什麼軟體使用一段時間以後或者是使用了多少次以後,它會提示使用者註冊?它怎麼會知道使用者用了多長時間或用了多少次?我們可以這樣想:在軟體被安裝程式安裝的時候,一些記錄使用者合法性和安裝時間的資訊被寫到本機電腦中,在今後運行軟體時,只要判斷這些資訊是否合法就可以決定是讓使用者繼續使用還是立即註冊。這種方法在一定程度上也增強了軟體本身的防複製性,因為複製品在其它未正確安裝的機器上找不到合法使用者資訊,也就無法正確運行。在電腦裝置中,能儲存資料的最直接的地方就是磁碟,而用硬碟的隱藏扇區儲存這些密碼資訊又最可靠。在硬碟的資料結構中,每個硬碟邏輯分區的第一個柱面是隱藏的,整個物理硬碟的最後幾個柱面也是隱藏的。說它是隱藏的,也就是說,在DOS系統中,普通的INT 21H所提供的對磁碟讀寫的中斷調用無法管轄這部分地區,要操作這部分隱藏的磁碟空間,就必須通過INT 13H來進行。
以下一段函數代碼實現了對磁碟的任何部分(包括隱藏扇區)的讀寫操作,它能把一個扇區的資訊讀入緩衝區,也能把緩衝區中的資訊存入磁碟的一個扇區。值得注意的是,這個函數只能對小於8.4GB的資料區進行操作,大於8.4GB的資料區需要INT 13 Extension的支援,在此不多討論,有興趣的讀者可以參閱筆者所寫的《大容量硬碟的讀寫操作》。對於一般的隱藏扇區加密的實現,使用這個函數已經足夠了。
#include <stdio.h>
#include <dos.h>
int DiskIo (int drive,
int operation,
unsigned int cylinder,
unsigned int head,
unsigned short sector,
unsigned char * buffer)
{
union REGS regs;
struct SREGS sregs;
regs.h.ah=operation; regs.h.al=1;
regs.x.bx=FP_OFF(buffer); sregs.es=FP_SEG(buffer);
regs.h.ch=cylinder; regs.h.cl=sector;
regs.h.dh=head; regs.h.dl=drive;
int86x(0x13,®s,®s,&sregs);
return regs.h.ah;
}
最後說明一點,在設計軟體中的GetKey函數時,盡量使用原生硬體資訊和使用者名稱來產生密碼,再將其存入隱藏扇區,這樣使密碼既有保密性,又有安全性。
2、 使用雷射穿孔法實現軟體防複製加密
這種方法主要是利用程式設計中的“陷阱技術”來實現的。基本設計思路是這樣的:在磁碟片表面穿孔,使部分扇區遭到破壞,這是物理損壞,無法用工具軟體修複。設計者在開發軟體以前,用通用的偵查工具對磁碟表面全面掃描,找到已被損壞的扇區,將它們記錄下來,以後設計軟體時,只要讓軟體判斷這些扇區是否損壞就能判斷軟體是否已被複製。
對於生產少量的軟體產品而言,這種方法不失為一種經濟有效加密方法,但是如果軟體要被大量生產,這種方法就變得更加繁雜:每次穿孔的位置不一定一樣,軟體所要判斷的扇區編號也不一樣,實現相當困難,但設計思想是值得借鑒的。
3、 特殊磁軌防複製加密技術
雖然雷射穿孔技術能達到很好的防複製加密效果,但其實現過程是相當複雜的。特殊磁軌防複製加密技術實現簡單,也能夠很好的對軟體起到加密作用。為了簡單起見,在此僅對磁碟片進行討論。
平時我們所討論的磁碟扇區都是指的資料區,其實一個扇區由標識區和資料區以及兩個間隙組成,一些磁軌(柱面)的ID資訊被儲存在非資料區中。在DOS系統啟動的時候,磁碟片磁碟基數表被裝載到起始地址為0000:0525的記憶體單元中,INT 13H的許多操作都是根據這一基數表來確定扇區大小的。那麼,只要我們修改磁碟基數表,再用普通的INT 13H來操作磁碟,就能很容易的將軟體密鑰寫到磁碟扇區間隙處。一般情況下,對於這種特殊扇區,磁碟控制卡無法在磁碟上寫出,這樣,一般的複製程式也就無法將其複製,但在被加密的軟體程式中可以將間隙處的密鑰作為特殊扇區的一部分讀出,判斷密鑰資訊就可以確定軟體是否已被複製。
以下是採用這種方法讀取一個扇區長為4096B的資料區的例子,讀取的是磁碟片的0面0道,讀出的資訊被儲存在DS段位移量為1000H的記憶體單元中。
C:"WINDOWS>debug
-e0000:0525
0000:0525 02.05 3F.01
-a100
1288:0100 mov ax,201
1288:0103 mov bx,1000
1288:0106 mov cx,0
1288:0109 mov dx,0
1288:010C int 13
1288:010E int 3
1288:010F
-g=100
特殊磁軌加密是這樣實現的:INT 13H AH=05H功能是根據BX所指向的記憶體單元的參數來對磁碟進行格式化的。上面已經提到,每個扇區都有一個ID,ID是由柱面號、磁頭號和扇區位元組長度組成,那麼只要修改ID參數,並用這種奇特的參數格式化磁碟,就會產生特殊磁軌。剩下的工作和對特殊扇區的操作相同:將密鑰寫入特殊磁軌,就能實現軟體防複製。下面是一個對360K、DSDD磁碟磁軌格式化的C語言函數,其中trktbl數組存放的就是磁碟扇區的ID參數。
int fmt_trk (int dsk, int trk, int head)
{
union REGS regs;
struct SREGS sregs;
char trktbl[36];
int i;
for (i=0;i<9;i++) {
trktbl[i*4] = trk;
trktbl[i*4+1] = head;
trktbl[i*4+2] = i;
trktbl[i*4+3] = 2;
}
regs.h.ah=0x05; regs.h.ch=trk;
regs.h.dh=head; regs.h.dl=dsk;
regs.x.bx=FP_OFF(trktbl); sregs.es=FP_SEG(trktbl);
int86x (0x13, ®s, ®s, &sregs);
return (regs.h.ah);
}
二、Windows系統下軟體註冊加密技術
1、利用Windows註冊表實現軟體註冊加密
相信大多數軟體都是採用這種方法來實現註冊功能的。Windows系統註冊表資訊量相當大,幾乎所有Windows系統和電腦系統配置資訊都儲存在註冊表中。如果軟體密鑰被寫入註冊表,那麼尋找密鑰儲存位置無異于海底撈針,不採用一定的技術(如線程跟蹤等)是無法得到密鑰的。
Windows系統註冊表有六個主鍵:HKEY_CLASS_ROOT、HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE、HKEY_USERS、HKEY_CURRENT_CONFIG和HKEY_DYN_DATA。每個主鍵下面又分若干個子鍵,每個子鍵下又可建立子鍵和項,整個註冊表呈樹狀結構。每個項都有名稱和值,值可以是二進位、十進位、十六進位和字串型。
用程式實現註冊表的操作是相當簡便的。以下Delphi程式段用以在HKEY_CURRENT_USER的子鍵Software下建立一個名為Arcobet的子鍵,並將字串“ChenQingyang”寫入該字串中。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Registry, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var regs:TRegistry;
begin
regs:=TRegistry.Create;
regs.RootKey := HKEY_CURRENT_USER;
if (not regs.OpenKey('Software"Arcobet',False)) then
regs.CreateKey ('Software"Arcobet');
regs.WriteString('UserName','ChenQingyang');
regs.CloseKey;
regs.Destroy;
end;
end.
2、Windows系統下的特殊磁軌法
這種方法的基本原理同上述DOS下的特殊磁軌法原理相同,但必須注意的是:在32bit Application中直接使用INT 13H,Windows系統會彈出保護性錯誤的對話方塊,禁止程式的繼續執行。
解決這種問題的基本方法是採用虛擬設備驅動程式“VWIN32.VxD”,而使用該VxD又是通過DeviceIoControl來實現的,它能完成INT 13H、INT 25H、INT 26H的各種功能。通過CreateFile開啟VWIN32.VxD後獲得控制控制代碼,進而執行各種控制命令。開啟VWIN32.VxD格式如下:
HANDLE hDevice=CreateFile (“"""".""VWIN32”, GENERIC_WRITE|GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
在所有操作完成後,應使用CloseHandle (hDevice)來關閉開啟的VWIN32.VxD。
如何使用這種方法讀寫磁碟在此不作討論,請讀者自己參考有關文獻。
三、共用軟體網上註冊方法簡介
隨著Internet的發展,共用軟體也隨之出現。共用軟體允許使用者對軟體試用,並通過Internet網上註冊的途徑來購買軟體。共用軟體有一個最大的好處就是其可試用性,通過使用者的免費試用,能及時的將使用結果反饋給軟體作者,作者便可以根據這些反饋資訊對軟體的結構和功能改進。可以說,共用軟體給使用者和作者提供了更為廣泛的交流空間。另一方面,軟體購買也變的更加簡單,大大減少了軟體在市場上的周轉期,使軟體版本的更新也更快。
許多優秀的軟體如《Windows最佳化大師》等在被使用者使用了一段時間後都會要求使用者註冊方能繼續使用。此時,使用者應根據介面提示填寫好使用者名稱,程式會自動產生一個序號,只要將這個序號和註冊費用一起郵寄給軟體作者,便可以得到註冊碼,最後把註冊碼填入軟體指定的位置並確認後,共用軟體註冊過程就完成了。
為了方便使用者的註冊,許多共用軟體網站都有代理註冊的服務,其作用相當於使用者和作者之間的一座橋樑,協助雙方方便的完成註冊過程。使用者只需要將序號和註冊費上交到網站,網站定期地將使用者名稱單、序號和註冊費轉交給作者,作者根據網站發送的資訊產生每個使用者的註冊碼後反饋給網站,最後網站再將獲得的註冊碼分發到每個使用者手裡。
結論
軟體加密註冊方法還有很多,以軟體手段加密的比如CRC錯誤校正法、弱位法、硬碟鎖、軟體狗等,以硬體手段加密的有硬體狗等,在此不一一說明。總之,只要我們能夠好好的利用作業系統給我們帶來的程式資源和介面,我們就能夠利用這些介面和特性設計出很好的註冊加密方法。有興趣的讀者可以按照本文介紹的方法或者參考其它文獻動手試一試,相信這樣做能給你帶來更大的收穫。
參考文獻
1、《軟體加密與電腦安全技術》孫兆林 主編 中國水利出版社 2001年9月
2、《DOS程式員參考手冊》Terry Dettmann 著 清華大學出版社 1996年1月
3、《For Win9X系統下額外磁軌防複製技術》 劉興平(《電腦編程技巧與維護》2000-5)
4、《Windows系統註冊表完全精通》 電腦愛好者雜誌社 2001年5月
5、《加密解密方法與執行個體》e-Age Technology&Development 北京騰圖電子出版社
6、《深入DOS編程》 求伯君 著 1993年
7、《Microsoft Software Developer Network(MSDN)》Microsoft Press, July 2001
8、《利用互斥磁碟鎖定保護磁碟資料》 江天送 (《電腦編程技巧與維護》2000-10)
9、《DOS6.22核心分析與記憶體管理技術》 肖金秀 著 中國大地出版社 1998年1月
10、CSDN網站:http://www.csdn.net/
11、DDCOPY:硬碟全盤複製軟體:http://ddcopy.yeah.net/