今天本来想把Format部分抠出来的,但是XX实在太多了...只好装虚拟机,重新配置调试环境.把昨天的笔记放一下...然后说一下应用层的,Mount部分.其实关于Mount,可以参考阅读下filedisk的源代码...
分析Truecrypt的源代码的初衷,是为了仿写一个类似QQ文件保险柜的功能.
而似乎QQ的文件保险柜,也是从Truecrypt中抠出来的代码.
具体来看,QQ的文件保险柜实现的是Truecrypt的file_container的功能,
并没有实现给磁盘加密,或者给系统盘加密.
而在file_container这一部分,又是选择了Standard_Volume功能,
并没有实现Hidden_Volume功能.
QQ保险柜在实现隐藏的时候,是Unmount这个卷了,所以在磁盘分区中看不到.
当打开这个卷的时候,先验证密码,然后又重新mount这个file了...
目前打算从TrueCrypt中将file_container抠出来...
先实现Format部分..StandardVolume...
+--->Standa vol --> vol_path-->Ea_Ha -> vol_size -> Password -> Format
+
file_container --+
+ +--> Normal-->vol_path-->OuterVolume-->Ea_Ha->vol_size->Pwd -> Format
+--->Hidden vol --+
+--> Direct-->vol_path-->...
QQ文件保险柜流程如下:(其中的加密算法,cluster,选择默认了...)
1.新建保险柜 file_container->Standard vol
2.确认密码 Password(绑定QQ的不会..nnd)
3.保存位置 VolPath
4.容量大小 vol_size
6.初始化 Format
7.打开保险柜 Mount
8.关闭保险柜 UnMount
本来想放一个demo的...但是今天是不可能了...只想弄file_container部分...其他的关于给Windows系统盘加密和分区加密,还是放到以后再说.
放一个console程序的main函数流程.
void main(int argc,char** argv).
{
// step1,Init Volume Password
strcpy(volumePassword.Text,"123456");
volumePassword.Length = (unsigned int)(strlen(volumePassword.Text));
// step2,Init VolumePath,or szDiskFile
strcpy(szDiskFile,"C:\\volumeTest.txt");
szDiskFile[strlen("C:\\volumeTest.txt")] = 0 ;
// step3,Init VolumeSize
nVolumeSize = 10*1024*1024; // 10 MB
// step4,Format Volume
Format();
// step5,Mount Volume
Mount();
// step6,DisMount Volume
UnMount();// 关闭文件保险柜,即调用DisMount()函数.
}
关于Truecrpyt的Mount/DisMount部分的两个核心函数,都很简单,都是向驱动发送IOCTL,来完成的.
打开TrueCrypt.exe这个程序."Select file"选择前面使用Format程序,创建的一个file_cotainer的文件.
然后选择一个驱动盘符,然后点击"Mount".这个时候会调用函数Mount(),而该函数内部调用的核心函数为MountVolume().
int MountVolume (HWND hwndDlg,// 传入的窗口句柄
int driveNo, // 加载的磁盘分区序号
char *volumePath,// 用户选择的加密卷文件
Password *password,// 用户输入的密码
BOOL cachePassword,// 是否使用缓存密码
BOOL sharedAccess,
MountOptions *mountOptions,// mount选项
BOOL quiet,
BOOL bReportWrongPassword // 是否报告错误的密码
)
其函数的Mount的核心是,这部分可以看看FileDisk的src
bResult = DeviceIoControl (hDriver, TC_IOCTL_MOUNT_VOLUME, &mount,
sizeof (mount), &mount, sizeof (mount), &dwResult, NULL);
当你点击"UnMount"时,会调用UnMountVolume()函数,其核心函数是.DriverUnmountVolume();
其实也是向驱动返送IOCTL.
bResult = DeviceIoControl (hDriver, TC_IOCTL_DISMOUNT_VOLUME, &unmount,
sizeof (unmount), &unmount, sizeof (unmount), &dwResult, NULL);