基于分区表的移动存储介质标识方法
2009-03-02沈瑜妙全兴
沈 瑜 妙全兴
摘 要:移动存储介质在涉及安全的应用场合需要对其进行标识。给出基于磁盘分区表实现移动存储介质标识的方法,对分区表的结构和工作原理、在分区表空闲表项中写入和访问标识的方法等进行阐述,并给出核心代码。结果表明,该方法不但可行,而且具有其他方法所没有的优点,是对移动存储介质进行标识和认证的一种新的手段。
关键词:移动存储介质;分区表;标识;表项;API
中图分类号:TP393 文献标识码:B 文章编号: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 引 言
由于移动存储介质(移动硬盘、U盘等)具有容量大、体积小、易携带等一系列特点,而得到了广泛的使用,同时移动存储介质也存在使用过于随意,难以对其使用情况进行有效监管等问题,因而已经成为敏感数据泄漏的重要环节。因此,移动存储介质在涉及安全的应用场合需要对其进行标识,以便于对移动介质的使用进行监管。
部分移动存储介质有一个厂家惟一的序列号,这些序列号一般用户无法改变,但可以使用现成的软件或编程方法方便的读出。然而,各厂家定义的序列号并不遵从统一的标准,不同品牌移动存储介质的序列号长度、使用字符等不尽相同,甚至有些闪存产品根本就没有序列号。同时移动存储介质品牌繁杂,对所使用的移动存储介质种类做硬性规定又不现实。因此,利用固有的序列号标识移动介质存在困难。在此提出的方法是将一个惟一的编号作为序列号写入移动存储介质分区表空闲字段中,该方法既适用于目前常用的各种存储介质,又具有较好的隐蔽性和抗毁性,能实现对各种移动存储介质统一的标识。
1 硬盘的逻辑结构
常见的移动存储介质有U盘和移动硬盘。他们的物理结构和存储机理都不同。如:U盘是半导体存储设备,而移动硬盘是磁存储设备。但是这些移动存储介质的逻辑结构都是相同的,而且有相同的逻辑访问方式,都是基于特定的文件系统。下面就以硬盘为例,对移动存储介质的存储结构,分区原理等进行详细阐述。
1.1 硬盘的数据分布
硬盘上的数据按照不同特点和作用大致可分为5部分:主引导记录区、DOS引导记录区、文件分配表区、文件目录表区和数据区。
主引导记录区位于硬盘的0磁道0柱面1扇区,占用此扇区的前446个字节,其中存放的主引导记录是BIOS向操作系统交接的重要入口。其后的64个字节是主分区表,用来存储硬盘主引导分区信息。
DOS引导记录区位于硬盘的0磁道1柱面1扇区,它包括一个引导程序和一个被称为BPB(BIOS参数块)的分区参数记录表,是操作系统可以直接访问的第一个扇区。引导程序的任务是对硬盘系统进行复位,并检查两个系统隐含文件的合法性,即查看它们是否处于指定根目录区的文件目录表中第一,第二项,若不合法,则给出提示信息。若检查合法,则将IO.SYS读入内存并执行。BPB参数块主要记录硬盘的每扇区字节数、磁头数、目录起始簇等重要信息。
文件分配表区 (File Allocation Table)是用来记录文件存储位置的表格,文件的存放是以链式存储的方式存放在磁盘的非连续区域内的,通过指针将分段存放的文件联系在一起。当读写文件时,操作系统通过文件分配表可以准确地读出文件。文件分配表一般有两个,第二个文件分配表作为第一个的备份。
文件目录表区(DIRECTORY)就是文件的目录,它记录着每个文件的起始单元、文件的属性等,与文件分配表共同配合,确定文件的位置。
数据区(DATA)是真正存储数据的区域,其组织与管理由系统根据前4个区域的内容来完成。
1.2 硬盘的分区
分区是硬盘上的一组连续的扇区。硬盘上的任何扇区均要位于某一特定的分区中才能被系统直接访问。分区有两种:一种是主分区;另一种是扩展分区,扩展分区通常不含系统文件,并可以分成若干个逻辑驱动器,相应的,分区表也分为主分区表和扩展分区表两类。由于扩展分区又可分为许多逻辑分区,每个逻辑分区对应一个扩展分区表,因此有多少个逻辑分区就会有多少个扩展分区表。扩展分区表包含在扩展分区的第一扇区或逻辑驱动器“二级扩展分区”的第一扇区。
1.2.1 主分区表的结构
主分区表中最多可以包含4个分区表项,即最多可以将硬盘划分成4个主分区,且每个主分区可以安装不同的操作系统。一个分区表项为16B,它可以确定一个分区的边界 、分区的类型和分区的大小(扇区数),分区表项的格式见图1[1]。其中,表项的第一字节为引导标志,若该字节为80H则表示该分区为可引导的活动分区,若该字节为0则表示该分区为非活动分区,最多只能有1个分区为活动分区。
1.2.2 扩展分区表的结构
在扩展分区表所在扇区中没有主引导程序,只有分区表,扩展分区表中只包含2项(32 B):第一项描述本逻辑分区的情况,另一项指向下一个逻辑驱动器的分区扇区的位置。主分区表和所有扩展分区表形成一个链表结构,即在主分区表中有一个分区表项指向第一扩展分区表,每个扩展分区表又有一个分区表项指向下一个扩展分区表。这样在主引导扇区中仅需要存储一个分区表项数据的扩展分区,通过这个扩展分区的数据可以找到下一个逻辑分区的起始位置,以此起始位置类推可以找到所有的逻辑分区。如图2所示为扩展分区表结构示意图[2]。
当移动硬盘首次接入操作系统时,需要进行高级格式化。这种高级格式化是按照扩展分区类进行的,因此移动硬盘将作为一个普通的逻辑分区加入到已有的扩展分区链表中;而且其上面分区数据的分布和硬盘上一个逻辑分区的数据分布一样,都是扩展分区下面的一个逻辑分区,因此,移动硬盘可作为操作系统下面一个文件系统而存在。
2 技术原理及核心代码
2.1 技术原理
移动存储介质标识符应满足以下要求:每个介质标识符要具有惟一性;标识符的存在不影响正常使用;标识符具有一定的耐久性,不会因正常的使用而去掉。要满足第三条要求,标识符只能存储在介质的系统区。理论分析表明,扩展分区表中分区表信息只占用前两个分区表项,后面两个分区表项暂时未用(32个字节),在对磁盘进行高级格式化时,这两个分区表项的内容并不发生改变,是用来存放标识符的理想位置。
2.2 核心代码
利用VC++实现对硬盘扇区数据的访问,对其中空闲区域的数据进行修改,将移动介质标识符编写进扇区,再将数据写回到硬盘扇区。
2.2.1 访问扇区数据
在Windows操作系统中采取访问安全保护机制,如:不能直接访问物理内存,不能使用各种DOS,BIOS中断等。但在采取“实保护”措施的同时也提供了另外的一种有别于在DOS下访问硬件设备的方法,允许按照对文件的读写方式对其进行数据存取访问。在Windows下把所有的设备都当作文件进行操作。通过Windows API中提供的CreateFile()函数可以直接对磁盘扇区进行访问。通过此接口函数,可以“打开”设备驱动程序,得到设备的句柄。与对串行端口的访问类似,也需要用与文件存放路径相类似的方式指出要操作的硬件设备(硬盘)。一般存储设备的名称是微软规定好的,如:软盘驱动器用A:,B:标识;逻辑驱动器用C:,D:,E:标识;而物理驱动器则用PHYSICALDRIVE X(X=0,1,2)标识;对于第一个物理驱动器,访问格式为“\\\\.\\PHYSICALDRIVE 0”。如:需要对磁盘进行读取操作,而他是第四个物理驱动器,则使用:HANDLE hDev=CreateFile(“\\\\.\\PHYSICALDRIVE 3”,…)。一般调用CreateFile获得设备句柄时,访问方式参数设置为0或GENERIC_READ|GENERIC_WRITE,共享方式参数设置为FILE_SHARE_READ|FILE_SHARE_WRITE,创建方式参数设置为OPEN_EXISTING,因为访问的是已经存在的物理设备,其他参数设置为0或NULL。利用这样的方法,就可以对分区扇区中的空闲字段数据进行访问操作。
2.2.2 读取与写入扇区数据
当用CreateFile()函数访问磁盘扇区后,采用hDev保存磁盘扇区的句柄,
下面就可以通过ReadFile()或WriteFile()函数实施相应的读写操作,具体操作与文件读写差别不大。最后,在完成访问操作后,以CloseHandle()关闭文件句柄释放资源,从而完成一次完整的磁盘扇区数据读取与写入操作。利用这种方法,标识符就可以保存在磁盘分区扇区分区表中的空闲字段,起到移动介质标识的作用。
2.2.3 关键代码
关键代码如下所示:
Int main(void)
{
HANDLE hDev=CreateFile("\\\\.\\PHYSICALDRIVEX",GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);//打开分区扇区
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);//读取分区扇区
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位标识符:505152535455到空闲字段
b_Ret=WriteFile(hDev,lpsectBuff,dwByte,&dwReadsize;,NULL);//将修改写回扇区
if(b_Ret==FALSE||dwReadsize<512)
{
CloseHandle(hDev);
ExitProcess(0);
}
CloseHandle(hDev);
Return 1;
}
3 结 语
为了能惟一标识移动存储介质,在此提出了一种新的标识方法,将具有惟一标识的移动介质标识符嵌入移动介质中分区表中的空闲字段,而在移动介质的正常使用中,对用户完全透明,不会被用户觉察。在高级格式化的操作中,这些写入分区表中的信息也不会被重写。在需要时,可以将嵌入的信息读取出来。虽然这种方法是可行的,但考虑到如果对移动存储介质进行低级格式化后,移动介质里的数据就会全部被清除,也包括标识,因此,在这一方面还需做进一步的研究,以便找到更好的标识方法。
参 考 文 献
[1]蒋华龙,夏龄.大容量硬盘逻辑分区的隐藏与恢复[J].四川理工学院学报:自然科学版,2004,17(3):57-58.
[2]李为,刘嘉勇.一种基于分区引导扇区控制的移动存储介质安全控制方法[J].成都信息工程学院学报,2007,22(1):92-97.
[3]袁建东,赵强,郑见灵.Windows系统下FAT32分区信息分析与获取方法[J].河北工业科技,2007,24(1):11-12.
[4]黄国盛,梁平元,周小清.Windows环境中分区表结构剖析与安全修复[J].吉首大学学报:自然科学版,2003,24(1):56-57.
[5]张载鸿,余永进,何渝,等.MS-DOS6技术精萃[M].北京:清华大学出版社,1994.74-93.
[6]佚名.VC++实现Win2000下直接读写磁盘扇区[EB/OL].http://www.VCZX.com/article/list.php,2004.
作者简介 沈 瑜 女,1984年出生,陕西西安人,硕士研究生。主要研究方向为指挥自动化。
妙全兴 男,1965年出生,陕西岐山人,副教授,研究生导师。主要研究方向为计算机网络、信息安全。