沈 瑜 妙全興
摘 要:移動(dòng)存儲(chǔ)介質(zhì)在涉及安全的應(yīng)用場(chǎng)合需要對(duì)其進(jìn)行標(biāo)識(shí)。給出基于磁盤(pán)分區(qū)表實(shí)現(xiàn)移動(dòng)存儲(chǔ)介質(zhì)標(biāo)識(shí)的方法,對(duì)分區(qū)表的結(jié)構(gòu)和工作原理、在分區(qū)表空閑表項(xiàng)中寫(xiě)入和訪問(wèn)標(biāo)識(shí)的方法等進(jìn)行闡述,并給出核心代碼。結(jié)果表明,該方法不但可行,而且具有其他方法所沒(méi)有的優(yōu)點(diǎn),是對(duì)移動(dòng)存儲(chǔ)介質(zhì)進(jìn)行標(biāo)識(shí)和認(rèn)證的一種新的手段。
關(guān)鍵詞:移動(dòng)存儲(chǔ)介質(zhì);分區(qū)表;標(biāo)識(shí);表項(xiàng);API
中圖分類(lèi)號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:B 文章編號(hào):1004-373X(2009)04-096-03
Method of Marking Removable Storage Medium Based on Partition Table
SHEN Yu, MIAO Quanxing
(Armed Police Engineering College,Xi′an,710086,China)
Abstract: It is necessary for removable storage medium to be marked when involving the application of security.The new method for marking removable storage medium based on partition table is put forth.The formation and principle of partition table are discussed,the method to modify and check the vacancy partition table item is described,and some key codes are presented.The result indicates that it is a new technical method for removable storage medium to be marked and authenticated.
Keywords:removable storage medium;partition table;marking;table item;API
0 引 言
由于移動(dòng)存儲(chǔ)介質(zhì)(移動(dòng)硬盤(pán)、U盤(pán)等)具有容量大、體積小、易攜帶等一系列特點(diǎn),而得到了廣泛的使用,同時(shí)移動(dòng)存儲(chǔ)介質(zhì)也存在使用過(guò)于隨意,難以對(duì)其使用情況進(jìn)行有效監(jiān)管等問(wèn)題,因而已經(jīng)成為敏感數(shù)據(jù)泄漏的重要環(huán)節(jié)。因此,移動(dòng)存儲(chǔ)介質(zhì)在涉及安全的應(yīng)用場(chǎng)合需要對(duì)其進(jìn)行標(biāo)識(shí),以便于對(duì)移動(dòng)介質(zhì)的使用進(jìn)行監(jiān)管。
部分移動(dòng)存儲(chǔ)介質(zhì)有一個(gè)廠家惟一的序列號(hào),這些序列號(hào)一般用戶(hù)無(wú)法改變,但可以使用現(xiàn)成的軟件或編程方法方便的讀出。然而,各廠家定義的序列號(hào)并不遵從統(tǒng)一的標(biāo)準(zhǔn),不同品牌移動(dòng)存儲(chǔ)介質(zhì)的序列號(hào)長(zhǎng)度、使用字符等不盡相同,甚至有些閃存產(chǎn)品根本就沒(méi)有序列號(hào)。同時(shí)移動(dòng)存儲(chǔ)介質(zhì)品牌繁雜,對(duì)所使用的移動(dòng)存儲(chǔ)介質(zhì)種類(lèi)做硬性規(guī)定又不現(xiàn)實(shí)。因此,利用固有的序列號(hào)標(biāo)識(shí)移動(dòng)介質(zhì)存在困難。在此提出的方法是將一個(gè)惟一的編號(hào)作為序列號(hào)寫(xiě)入移動(dòng)存儲(chǔ)介質(zhì)分區(qū)表空閑字段中,該方法既適用于目前常用的各種存儲(chǔ)介質(zhì),又具有較好的隱蔽性和抗毀性,能實(shí)現(xiàn)對(duì)各種移動(dòng)存儲(chǔ)介質(zhì)統(tǒng)一的標(biāo)識(shí)。
1 硬盤(pán)的邏輯結(jié)構(gòu)
常見(jiàn)的移動(dòng)存儲(chǔ)介質(zhì)有U盤(pán)和移動(dòng)硬盤(pán)。他們的物理結(jié)構(gòu)和存儲(chǔ)機(jī)理都不同。如:U盤(pán)是半導(dǎo)體存儲(chǔ)設(shè)備,而移動(dòng)硬盤(pán)是磁存儲(chǔ)設(shè)備。但是這些移動(dòng)存儲(chǔ)介質(zhì)的邏輯結(jié)構(gòu)都是相同的,而且有相同的邏輯訪問(wèn)方式,都是基于特定的文件系統(tǒng)。下面就以硬盤(pán)為例,對(duì)移動(dòng)存儲(chǔ)介質(zhì)的存儲(chǔ)結(jié)構(gòu),分區(qū)原理等進(jìn)行詳細(xì)闡述。
1.1 硬盤(pán)的數(shù)據(jù)分布
硬盤(pán)上的數(shù)據(jù)按照不同特點(diǎn)和作用大致可分為5部分:主引導(dǎo)記錄區(qū)、DOS引導(dǎo)記錄區(qū)、文件分配表區(qū)、文件目錄表區(qū)和數(shù)據(jù)區(qū)。
主引導(dǎo)記錄區(qū)位于硬盤(pán)的0磁道0柱面1扇區(qū),占用此扇區(qū)的前446個(gè)字節(jié),其中存放的主引導(dǎo)記錄是BIOS向操作系統(tǒng)交接的重要入口。其后的64個(gè)字節(jié)是主分區(qū)表,用來(lái)存儲(chǔ)硬盤(pán)主引導(dǎo)分區(qū)信息。
DOS引導(dǎo)記錄區(qū)位于硬盤(pán)的0磁道1柱面1扇區(qū),它包括一個(gè)引導(dǎo)程序和一個(gè)被稱(chēng)為BPB(BIOS參數(shù)塊)的分區(qū)參數(shù)記錄表,是操作系統(tǒng)可以直接訪問(wèn)的第一個(gè)扇區(qū)。引導(dǎo)程序的任務(wù)是對(duì)硬盤(pán)系統(tǒng)進(jìn)行復(fù)位,并檢查兩個(gè)系統(tǒng)隱含文件的合法性,即查看它們是否處于指定根目錄區(qū)的文件目錄表中第一,第二項(xiàng),若不合法,則給出提示信息。若檢查合法,則將IO.SYS讀入內(nèi)存并執(zhí)行。BPB參數(shù)塊主要記錄硬盤(pán)的每扇區(qū)字節(jié)數(shù)、磁頭數(shù)、目錄起始簇等重要信息。
文件分配表區(qū) (File Allocation Table)是用來(lái)記錄文件存儲(chǔ)位置的表格,文件的存放是以鏈?zhǔn)酱鎯?chǔ)的方式存放在磁盤(pán)的非連續(xù)區(qū)域內(nèi)的,通過(guò)指針將分段存放的文件聯(lián)系在一起。當(dāng)讀寫(xiě)文件時(shí),操作系統(tǒng)通過(guò)文件分配表可以準(zhǔn)確地讀出文件。文件分配表一般有兩個(gè),第二個(gè)文件分配表作為第一個(gè)的備份。
文件目錄表區(qū)(DIRECTORY)就是文件的目錄,它記錄著每個(gè)文件的起始單元、文件的屬性等,與文件分配表共同配合,確定文件的位置。
數(shù)據(jù)區(qū)(DATA)是真正存儲(chǔ)數(shù)據(jù)的區(qū)域,其組織與管理由系統(tǒng)根據(jù)前4個(gè)區(qū)域的內(nèi)容來(lái)完成。
1.2 硬盤(pán)的分區(qū)
分區(qū)是硬盤(pán)上的一組連續(xù)的扇區(qū)。硬盤(pán)上的任何扇區(qū)均要位于某一特定的分區(qū)中才能被系統(tǒng)直接訪問(wèn)。分區(qū)有兩種:一種是主分區(qū);另一種是擴(kuò)展分區(qū),擴(kuò)展分區(qū)通常不含系統(tǒng)文件,并可以分成若干個(gè)邏輯驅(qū)動(dòng)器,相應(yīng)的,分區(qū)表也分為主分區(qū)表和擴(kuò)展分區(qū)表兩類(lèi)。由于擴(kuò)展分區(qū)又可分為許多邏輯分區(qū),每個(gè)邏輯分區(qū)對(duì)應(yīng)一個(gè)擴(kuò)展分區(qū)表,因此有多少個(gè)邏輯分區(qū)就會(huì)有多少個(gè)擴(kuò)展分區(qū)表。擴(kuò)展分區(qū)表包含在擴(kuò)展分區(qū)的第一扇區(qū)或邏輯驅(qū)動(dòng)器“二級(jí)擴(kuò)展分區(qū)”的第一扇區(qū)。
1.2.1 主分區(qū)表的結(jié)構(gòu)
主分區(qū)表中最多可以包含4個(gè)分區(qū)表項(xiàng),即最多可以將硬盤(pán)劃分成4個(gè)主分區(qū),且每個(gè)主分區(qū)可以安裝不同的操作系統(tǒng)。一個(gè)分區(qū)表項(xiàng)為16B,它可以確定一個(gè)分區(qū)的邊界 、分區(qū)的類(lèi)型和分區(qū)的大小(扇區(qū)數(shù)),分區(qū)表項(xiàng)的格式見(jiàn)圖1[1]。其中,表項(xiàng)的第一字節(jié)為引導(dǎo)標(biāo)志,若該字節(jié)為80H則表示該分區(qū)為可引導(dǎo)的活動(dòng)分區(qū),若該字節(jié)為0則表示該分區(qū)為非活動(dòng)分區(qū),最多只能有1個(gè)分區(qū)為活動(dòng)分區(qū)。
1.2.2 擴(kuò)展分區(qū)表的結(jié)構(gòu)
在擴(kuò)展分區(qū)表所在扇區(qū)中沒(méi)有主引導(dǎo)程序,只有分區(qū)表,擴(kuò)展分區(qū)表中只包含2項(xiàng)(32 B):第一項(xiàng)描述本邏輯分區(qū)的情況,另一項(xiàng)指向下一個(gè)邏輯驅(qū)動(dòng)器的分區(qū)扇區(qū)的位置。主分區(qū)表和所有擴(kuò)展分區(qū)表形成一個(gè)鏈表結(jié)構(gòu),即在主分區(qū)表中有一個(gè)分區(qū)表項(xiàng)指向第一擴(kuò)展分區(qū)表,每個(gè)擴(kuò)展分區(qū)表又有一個(gè)分區(qū)表項(xiàng)指向下一個(gè)擴(kuò)展分區(qū)表。這樣在主引導(dǎo)扇區(qū)中僅需要存儲(chǔ)一個(gè)分區(qū)表項(xiàng)數(shù)據(jù)的擴(kuò)展分區(qū),通過(guò)這個(gè)擴(kuò)展分區(qū)的數(shù)據(jù)可以找到下一個(gè)邏輯分區(qū)的起始位置,以此起始位置類(lèi)推可以找到所有的邏輯分區(qū)。如圖2所示為擴(kuò)展分區(qū)表結(jié)構(gòu)示意圖[2]。
當(dāng)移動(dòng)硬盤(pán)首次接入操作系統(tǒng)時(shí),需要進(jìn)行高級(jí)格式化。這種高級(jí)格式化是按照擴(kuò)展分區(qū)類(lèi)進(jìn)行的,因此移動(dòng)硬盤(pán)將作為一個(gè)普通的邏輯分區(qū)加入到已有的擴(kuò)展分區(qū)鏈表中;而且其上面分區(qū)數(shù)據(jù)的分布和硬盤(pán)上一個(gè)邏輯分區(qū)的數(shù)據(jù)分布一樣,都是擴(kuò)展分區(qū)下面的一個(gè)邏輯分區(qū),因此,移動(dòng)硬盤(pán)可作為操作系統(tǒng)下面一個(gè)文件系統(tǒng)而存在。
2 技術(shù)原理及核心代碼
2.1 技術(shù)原理
移動(dòng)存儲(chǔ)介質(zhì)標(biāo)識(shí)符應(yīng)滿(mǎn)足以下要求:每個(gè)介質(zhì)標(biāo)識(shí)符要具有惟一性;標(biāo)識(shí)符的存在不影響正常使用;標(biāo)識(shí)符具有一定的耐久性,不會(huì)因正常的使用而去掉。要滿(mǎn)足第三條要求,標(biāo)識(shí)符只能存儲(chǔ)在介質(zhì)的系統(tǒng)區(qū)。理論分析表明,擴(kuò)展分區(qū)表中分區(qū)表信息只占用前兩個(gè)分區(qū)表項(xiàng),后面兩個(gè)分區(qū)表項(xiàng)暫時(shí)未用(32個(gè)字節(jié)),在對(duì)磁盤(pán)進(jìn)行高級(jí)格式化時(shí),這兩個(gè)分區(qū)表項(xiàng)的內(nèi)容并不發(fā)生改變,是用來(lái)存放標(biāo)識(shí)符的理想位置。
2.2 核心代碼
利用VC++實(shí)現(xiàn)對(duì)硬盤(pán)扇區(qū)數(shù)據(jù)的訪問(wèn),對(duì)其中空閑區(qū)域的數(shù)據(jù)進(jìn)行修改,將移動(dòng)介質(zhì)標(biāo)識(shí)符編寫(xiě)進(jìn)扇區(qū),再將數(shù)據(jù)寫(xiě)回到硬盤(pán)扇區(qū)。
2.2.1 訪問(wèn)扇區(qū)數(shù)據(jù)
在Windows操作系統(tǒng)中采取訪問(wèn)安全保護(hù)機(jī)制,如:不能直接訪問(wèn)物理內(nèi)存,不能使用各種DOS,BIOS中斷等。但在采取“實(shí)保護(hù)”措施的同時(shí)也提供了另外的一種有別于在DOS下訪問(wèn)硬件設(shè)備的方法,允許按照對(duì)文件的讀寫(xiě)方式對(duì)其進(jìn)行數(shù)據(jù)存取訪問(wèn)。在Windows下把所有的設(shè)備都當(dāng)作文件進(jìn)行操作。通過(guò)Windows API中提供的CreateFile()函數(shù)可以直接對(duì)磁盤(pán)扇區(qū)進(jìn)行訪問(wèn)。通過(guò)此接口函數(shù),可以“打開(kāi)”設(shè)備驅(qū)動(dòng)程序,得到設(shè)備的句柄。與對(duì)串行端口的訪問(wèn)類(lèi)似,也需要用與文件存放路徑相類(lèi)似的方式指出要操作的硬件設(shè)備(硬盤(pán))。一般存儲(chǔ)設(shè)備的名稱(chēng)是微軟規(guī)定好的,如:軟盤(pán)驅(qū)動(dòng)器用A:,B:標(biāo)識(shí);邏輯驅(qū)動(dòng)器用C:,D:,E:標(biāo)識(shí);而物理驅(qū)動(dòng)器則用PHYSICALDRIVE X(X=0,1,2)標(biāo)識(shí);對(duì)于第一個(gè)物理驅(qū)動(dòng)器,訪問(wèn)格式為“\\\\.\\PHYSICALDRIVE 0”。如:需要對(duì)磁盤(pán)進(jìn)行讀取操作,而他是第四個(gè)物理驅(qū)動(dòng)器,則使用:HANDLE hDev=CreateFile(“\\\\.\\PHYSICALDRIVE 3”,…)。一般調(diào)用CreateFile獲得設(shè)備句柄時(shí),訪問(wèn)方式參數(shù)設(shè)置為0或GENERIC_READ|GENERIC_WRITE,共享方式參數(shù)設(shè)置為FILE_SHARE_READ|FILE_SHARE_WRITE,創(chuàng)建方式參數(shù)設(shè)置為OPEN_EXISTING,因?yàn)樵L問(wèn)的是已經(jīng)存在的物理設(shè)備,其他參數(shù)設(shè)置為0或NULL。利用這樣的方法,就可以對(duì)分區(qū)扇區(qū)中的空閑字段數(shù)據(jù)進(jìn)行訪問(wèn)操作。
2.2.2 讀取與寫(xiě)入扇區(qū)數(shù)據(jù)
當(dāng)用CreateFile()函數(shù)訪問(wèn)磁盤(pán)扇區(qū)后,采用hDev保存磁盤(pán)扇區(qū)的句柄,
下面就可以通過(guò)ReadFile()或WriteFile()函數(shù)實(shí)施相應(yīng)的讀寫(xiě)操作,具體操作與文件讀寫(xiě)差別不大。最后,在完成訪問(wèn)操作后,以CloseHandle()關(guān)閉文件句柄釋放資源,從而完成一次完整的磁盤(pán)扇區(qū)數(shù)據(jù)讀取與寫(xiě)入操作。利用這種方法,標(biāo)識(shí)符就可以保存在磁盤(pán)分區(qū)扇區(qū)分區(qū)表中的空閑字段,起到移動(dòng)介質(zhì)標(biāo)識(shí)的作用。
2.2.3 關(guān)鍵代碼
關(guān)鍵代碼如下所示:
Int main(void)
{
HANDLE hDev=CreateFile("\\\\.\\PHYSICALDRIVEX",GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);//打開(kāi)分區(qū)扇區(qū)
if(hDev==INVALID_HANDLE_VALUE)
{
ExitProcess(0);
}
DWORD dwByte=512;
DWORD dwReadsize;
BOOL b_Ret;
LPTSTR lpsectBuff;
lpsectBuff=(LPTSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,512);
b_Ret=ReadFile(hDev,lpsectBuff,dwByte,&dwReadsize;,NULL);//讀取分區(qū)扇區(qū)
if(b_Ret==FALSE||dwReadsize<512)
{
CloseHandle(hDev);
ExitProcess(0);
}
BYTE bSECT[512]={0};
for(int i=0;i<512;i++)
{
bSECT=lpsectBuff;
}
bSECT[0x185]=50;
bSECT[0x186]=51;
bSECT[0x187]=52;
bSECT[0x188]=53;
bSECT[0x189]=54;
bSECT[0x18A]=55;//嵌入12位標(biāo)識(shí)符:505152535455到空閑字段
b_Ret=WriteFile(hDev,lpsectBuff,dwByte,&dwReadsize;,NULL);//將修改寫(xiě)回扇區(qū)
if(b_Ret==FALSE||dwReadsize<512)
{
CloseHandle(hDev);
ExitProcess(0);
}
CloseHandle(hDev);
Return 1;
}
3 結(jié) 語(yǔ)
為了能惟一標(biāo)識(shí)移動(dòng)存儲(chǔ)介質(zhì),在此提出了一種新的標(biāo)識(shí)方法,將具有惟一標(biāo)識(shí)的移動(dòng)介質(zhì)標(biāo)識(shí)符嵌入移動(dòng)介質(zhì)中分區(qū)表中的空閑字段,而在移動(dòng)介質(zhì)的正常使用中,對(duì)用戶(hù)完全透明,不會(huì)被用戶(hù)覺(jué)察。在高級(jí)格式化的操作中,這些寫(xiě)入分區(qū)表中的信息也不會(huì)被重寫(xiě)。在需要時(shí),可以將嵌入的信息讀取出來(lái)。雖然這種方法是可行的,但考慮到如果對(duì)移動(dòng)存儲(chǔ)介質(zhì)進(jìn)行低級(jí)格式化后,移動(dòng)介質(zhì)里的數(shù)據(jù)就會(huì)全部被清除,也包括標(biāo)識(shí),因此,在這一方面還需做進(jìn)一步的研究,以便找到更好的標(biāo)識(shí)方法。
參 考 文 獻(xiàn)
[1]蔣華龍,夏齡.大容量硬盤(pán)邏輯分區(qū)的隱藏與恢復(fù)[J].四川理工學(xué)院學(xué)報(bào):自然科學(xué)版,2004,17(3):57-58.
[2]李為,劉嘉勇.一種基于分區(qū)引導(dǎo)扇區(qū)控制的移動(dòng)存儲(chǔ)介質(zhì)安全控制方法[J].成都信息工程學(xué)院學(xué)報(bào),2007,22(1):92-97.
[3]袁建東,趙強(qiáng),鄭見(jiàn)靈.Windows系統(tǒng)下FAT32分區(qū)信息分析與獲取方法[J].河北工業(yè)科技,2007,24(1):11-12.
[4]黃國(guó)盛,梁平元,周小清.Windows環(huán)境中分區(qū)表結(jié)構(gòu)剖析與安全修復(fù)[J].吉首大學(xué)學(xué)報(bào):自然科學(xué)版,2003,24(1):56-57.
[5]張載鴻,余永進(jìn),何渝,等.MS-DOS6技術(shù)精萃[M].北京:清華大學(xué)出版社,1994.74-93.
[6]佚名.VC++實(shí)現(xiàn)Win2000下直接讀寫(xiě)磁盤(pán)扇區(qū)[EB/OL].http://www.VCZX.com/article/list.php,2004.
作者簡(jiǎn)介 沈 瑜 女,1984年出生,陜西西安人,碩士研究生。主要研究方向?yàn)橹笓]自動(dòng)化。
妙全興 男,1965年出生,陜西岐山人,副教授,研究生導(dǎo)師。主要研究方向?yàn)橛?jì)算機(jī)網(wǎng)絡(luò)、信息安全。