TrueCrypt是很好的硬盘加密工具之一,虽然说因一些不能细说的原因目前停止了开发。官方给出替代产品是BitLocker,但众所周知BitLocker是Win7旗舰版里才有的功能,广大人民群众是用不起的,且向下的兼容性并不好。FreeOTFE是个人作品,在x64系统上有驱动签名的问题,虽说可以找作废的证书签名绕过,但肯定过不了杀软且再发布版本将流淌着浓浓的山寨气味。
在288号文章中笔者已经详细比较了以上几种加密方式,其中对TrueCrypt和FreeOTFE的隐藏卷做了一些比较。TrueCrypt隐藏卷的缺点主要是往外层卷写数据时有破坏隐藏卷的风险,所以公安部门也会用这种办法,在无法确认隐藏卷存在的时候会破坏掉数据让嫌疑人在被调查结束后也无法取回自己的文件(得不到的就毁掉,这是真爱。。)
FreeOTFE的优点是可以在现有文件中(如电影)隐藏加密卷。近日研究发现,TrueCrypt也可以通过一些小trick实现这样的效果。
原理
TrueCrypt卷的设计结构如下:
偏移 长度 内容 0 512 卷头 65536 512 隐藏卷头 131072 加密数据 -131072 512 备份卷头 -65536 512 备份隐藏卷头
因为需要支持隐藏卷,卷头中存放有卷的开始偏移以及长度。所以只要卷头相应的位置上填上正确的数值,即可指定从任意文件中加载卷。
而挂载时TC提供使用备份卷头尝试加载的功能,这使得我们可以只更改文件尾部-128K或-64K位置的512字节数据,而保持文件头不变,这样原有文件几乎不会被破坏。
实验
TrueCrypt当然没有提供这样的功能。通过阅读TrueCrypt的代码,决定目前暂时使用OD调试的方法来完成这个任务,因为想自己重新写一个TC格式化程序会死人。
通过代码审查,发现格式化卷生成卷头的调用位于Common\Format.c:140行,在TrueCrypt Format.exe中该调用位于0x449251地址处。在这个调用时修改dataOffset和dataAreaSize参数即可指定加密卷在文件中的位置与大小。
调用结束后,header指向的内存,本例中为0x3A096DC内存中的512字节即为得到的卷头。选择512字节,在内存窗口右键点击二进制复制。
用WinHex打开需要当作容器的文件,定位到-0x20000的位置,Ctrl+B粘贴。
使用
TrueCrypt加载时选项中选中“使用备份头”即可。
然后在Windows中格式化即可正常使用。
问题与安全
在实验中表明,卷起始位置必须对齐,不对齐的话可以加载,但无法格式化与写入。具体多么整我没有再去测试,推测是扇区对齐,因为MSDN中ReadFile与WriteFile要求块设备必须是扇区对齐。
另外使用备份头加载的卷无法直接通过自带的修改密码功能修改密码,不过可以绕过,即先备份文件头512字节,将备份头复制到文件头512字节,然后修改密码,再把这512字节恢复回去。
关于取证安全,比起按照TrueCrypt手册使用隐藏卷,安全系数肯定有所下降,因为很容易通过分析文件损坏的位置来确定加密卷的位置,对于“被逼迫说出密码”的情形无法应对。为此应尽量使用电影与视频这样的无规律数据作为容器。此外,文件的修改日期会暴露存有加密数据。对于下载的电影,如果某个文件修改日期比较不合群,则会受到怀疑。