QQ文件保险柜与Truecrypt之对比.

 今天本来想把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);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值