- 相關(guān)推薦
用Windows終端仿真程序?qū)崿F(xiàn)微機遠程文件傳送
有些硬盤防拷貝是通過對硬盤FAT表中的簇鏈的檢測來實現(xiàn)的,這與本文所推薦的方法原理一樣,都是通過檢測文件位置信息是否被改變來判斷文件是否已被移動的。但前者涉及到定位FAT表及文件所在目錄等繁瑣工作,而且還和硬盤型號及格式化信息有關(guān),編程很不方便。本文所介紹的方法則不然,它直接與操作系統(tǒng)打交道,取出操作系統(tǒng)內(nèi)核中現(xiàn)成的數(shù)據(jù),即利用DOS系統(tǒng)文件表(SYSTEM FILE TABLE 簡稱SFT)來實現(xiàn)防拷貝。當(dāng)您打開硬盤上的一個文件并移動讀寫指針時,DOS會時刻記錄讀寫指針?biāo)鶎?yīng)的硬盤位置。一個稍大些的文件在硬盤上要占用多個簇,這些簇并不是連續(xù)的,而是由操作系統(tǒng)一般按照“就近循環(huán)分配”原則為該文件分配的,這些簇的絕對簇號具有一定的隨機性,在FAT表中形成一個簇鏈。移動讀寫指針超過一個簇的大小時,則所對應(yīng)的絕對簇號也要變化。只要該文件沒有被移動過(拷貝或整理硬盤),這些簇號就是固定的。一旦該文件被移動了,根據(jù)DOS簇分配原則,這些對應(yīng)的簇號就會改變。由此,我們可以檢查特定的文件指針?biāo)鶎?yīng)的絕對簇號是否改變了來判斷該文件是否已被非法移動。
SFT是DOS在文件管理上的一個很重要的數(shù)據(jù)結(jié)構(gòu)。只要DOS開始引用一個文件或設(shè)備,它必然要建立一個SFT。該表記錄了文件設(shè)備名、目錄特性、設(shè)備特性、文件大小和位置、DDPB(塊設(shè)備)或設(shè)備驅(qū)動程序標(biāo)題(字符設(shè)備)的地址,以及打開模式等有關(guān)文件的存儲、訪問和操作的管理信息。其中有幾項數(shù)據(jù)可以用來確定文件在硬盤上的位置,它們是:文件讀寫指針?biāo)鶎?yīng)的絕對簇號,目錄項的相對索引號(即目錄項在目錄扇區(qū)中的序號),目錄項所在扇區(qū)的扇區(qū)號。
那么怎樣利用這幾項數(shù)據(jù)防拷貝呢?這里所說的防拷貝是指可以拷貝但拷貝后的文件不能執(zhí)行或不能被使用,包括數(shù)據(jù)文件和可執(zhí)行文件。若是可執(zhí)行文件,則其本身包括一段檢測代碼,用以判斷其本身是否已被非法移動。若是數(shù)據(jù)文件,則在使用該數(shù)據(jù)文件的可執(zhí)行文件中包括一段檢測代碼,來判斷該數(shù)據(jù)文件是否已被非法移動。當(dāng)?shù)谝淮螌⒁粋文件裝入硬盤后,它所占有的硬盤的簇號已是固定的了。這樣我們就可以作一個加密程序,在該程序里,約定一個或多個秘密的值N,N1,N2…,然后將文件指針分別移動到N或N1,N2…,在SFT中取出那幾項硬盤位置數(shù)據(jù),再用約定的秘密算法加以運算,就得到了包含被加密文件位置信息的“鑰匙”,將它存于另一個文件中或干脆附加在被加密文件的末尾。在使用該文件的可執(zhí)行文件的檢測代碼中,按同樣的算法取得當(dāng)前的“鑰匙”,與先前保存的“鑰匙”相比較,若相等,則說明文件沒有被移動過,程序正常執(zhí)行,否則,說明文件已不在先前的位置了,即已被非法移動過了,則程序異常執(zhí)行。
我們先看看DOS系統(tǒng)中SFT的具體結(jié)構(gòu),系統(tǒng)有多個SFT,這個數(shù)目取決于CONFIG.SYS文件中的FILES=N的N值。在DOS4.0,5.0,6.0中,每個SFT的長度是3BH。多個SFT形成SFT數(shù)組,并不是整個系統(tǒng)的所有SFT組成一個連續(xù)的大數(shù)組,而是可能有多個SFT數(shù)組,每個數(shù)組由一個控制塊管理,它們之間由指針連接。每個SFT數(shù)組的結(jié)構(gòu)如下:
偏移量 長度 說明
00H DWORD 指向下一個SFT數(shù)組的指針
04H WORD 本SFT數(shù)組內(nèi)的SFT數(shù)目
06H nBYTEs 由SFT組成的數(shù)組(n=本數(shù)組中SFT數(shù)目*每個SFT所占字節(jié)數(shù))
我們還必須知道第一個SFT數(shù)組所在的地址。這可由DOS功能調(diào)用52H先取得DOS的多重表指針,在多重表偏移量04H處即是一個長指針,它即指向第一個SFT數(shù)組的頭部。這樣剩下的SFT數(shù)組的位置也就知道了。
每當(dāng)DOS打開一個新文件時,DOS就從這些SFT數(shù)組中找一個空閑的SFT項,分配給該文件。以后DOS就用此SFT控制訪問該文件。那么怎樣確定一個剛打開的文件所對應(yīng)的SFT項是SFT數(shù)組中的第幾項呢?我們利用文件句柄和文件句柄表。每個進程都有一個文件句柄表,當(dāng)我們打開一個文件時可得到該文件的句柄,它是一個整數(shù),設(shè)為M,則在文件句柄表中的第M項即為該文件的SFT表項在SFT數(shù)組中的位置。那么怎樣找到文件句柄表呢?我們先用DOS功能調(diào)用51H得到程序段前綴(PSP)的地址,在PSP偏移34H處即是指向該進程文件句柄表的雙字指針。
附圖給出怎樣找一個已打開文件的SFT。
@@02A08500.GIF;附圖@@
打開文件取得文件句柄是3,所對應(yīng)的SFT的序號是6。
下面就給出一個可執(zhí)行文件防拷貝的例子。
假設(shè)我們用C 語言編一個完成某一功能的程序NO-COPY.CPP,經(jīng)過編譯連接生成可執(zhí)行文件NO-COPY.EXE,要對這個可執(zhí)行文件實行硬盤防拷貝。我們先編寫一個設(shè)置“鑰匙”的程序PUT-KEY,在該程序中按上述方法取得NO-COPY.EXE的“原鑰匙”(它包含了NO-COPY.EXE初次裝入硬盤時的位置信息),存于一個專用文件LOC-KEY.DAT中(當(dāng)然也可直接附加在NO-COPY.EXE的末尾,取時也到文件末尾去取),在NO-COPY.EXE中必須包含一段檢測代碼。
它也用PUT-KEY的方法取出自己的“當(dāng)前鑰匙”,與存于LOC-KEY.DAT中的“原鑰匙”比較,相等則說明文件還在原處,正常執(zhí)行。否則,說明正在執(zhí)行的NO-COPY.EXE是被拷貝的副本,停止執(zhí)行或異常執(zhí)行。
這里,不用考慮“鑰匙”的安全性,“鑰匙”是可以公開的,只要取得“鑰匙”的方法是保密的,非法拷貝者就無可奈何?梢赃@樣理解這個防拷貝方法:可執(zhí)行文件本身具有自鎖性,在它每拷貝到一個新地點時就按文件位置上了一把新鎖,當(dāng)它執(zhí)行時,它到一個固定的地方去取“鑰匙”,打開本身的鎖執(zhí)行。當(dāng)它被移動后,可理解為鎖換了(因為位置變了)。用“原鑰匙”打不開,所以“原鑰匙”是可以公開的,PUT-KEY.EXE就是用來設(shè)置“原鑰匙”的。當(dāng)合法用戶想把NO-COPY.EXE拷貝到一個新地方,只需運行一次PUT-KEY.EXE就可以使用新的NO-COPY.EXE了。所以PUT-KEY.EXE必須由合法用戶保管。
先編寫一個取“鑰匙”的子程序,放在MAKE-KEY.CPP文件中,在該子程序中,分別取目錄項的相對索引號,目錄項所在扇區(qū)的扇區(qū)號,文件指針?biāo)鶎?yīng)的絕對簇號。采用相加的算法,形成“鑰匙”。這里只用了一個文件指針6000所對應(yīng)的簇號,當(dāng)然可以使用多個文件指針,采用更復(fù)雜的算法,如相乘、相除、異或、相減等。所用的文件指針和所用的算法是保密的。而算出的“鑰匙”可以是公開的。
MAKE-KEY.CPP的內(nèi)容如下(本文件用來被包含在PUT-KEY.CPP和NO-COPY.CPP中)。
/*本子程序用來取filename的"當(dāng)前鑰匙"*/
unsigned long curentlocation-key(char filename)
{
unsigned long secc;
int filehandle;
int i,iii,jjj1,jj
【用Windows終端仿真程序?qū)崿F(xiàn)微機遠程文件傳送】相關(guān)文章:
如何在 Windows操作系統(tǒng)中改變文件打開方式05-30
Windows05-28
用Verilog HDL實現(xiàn)I2C總線功能06-01
光網(wǎng)絡(luò)技術(shù)在城域傳送網(wǎng)中的應(yīng)用08-08
基于分組技術(shù)的下一代光傳送網(wǎng)05-29
從程序本位到程序自治06-04