谈谈程序设计中的诚信与正直——“私人磁盘”分析始末
bell 2004-03-15 08:24:15
近日从网上发现了一个非常有趣的软件——私人磁盘(我经常会打成死人磁盘),当前版本为V3.70。该软件只有一个主程序(附带的那个Agent.dll没见有什么用,删了都能跑),使用相当简单,并且功能强大,起码从表面上看是这样,还号称加密强度一流!
我当时就晕了,试用了一下,哎,还真吸引人。前段时间我也做了个加密虚拟磁盘来玩,但比起它差远了,首先我的虚拟磁盘不支持空间动态调整,而私人磁盘则完全实现了——巨轻松,它就象从源驱动器长出来似的,一切都是那么直截了当。还有就是,它那四百来K的超小SIZE直让我冒汗,我想俺算是密界最无知的人了。
在强烈的好奇心驱动下,我耍起性子来了——俺就要剖了你!随便提一下,我分析(注意不是破解,我通常懒得去干)一个软件一般都不会去DEBUG来DEBUG去,费劲不讨好。先用eXeScope瞧瞧它的导入表吧,看看装了些什么东西。一瞧,狂晕……除了mpr.dll中的WNetGetConnectinA还有点发挥想象的余地外,其它都是三个代表。当然,我不排除写程序的兄台采用动态加载的方法,但这时我已对这没兴趣了。再CHECK CHECK资源吧,看看有没有在资源段内含了些SYS驱动什么的,RegMon、FileMon等就比较喜欢这套。结果是——NO!我更晕了,幸好今天没丢第N+1个钱包,否则就要打开窗户含泪跟大家道别了。
连驱动都不用,那那那……是高手?唬我吧?我身躯本来就不庞大,给几大箩的问题一压,顿时更渺小了。在WINDOWS NT下,如果不通过驱动而直接在用户模式下建立加密虚拟盘是非常困难的,目前我只知道可以通过代理机制来实现,大家可以参考Galen C. Hunt写的Creating User-Mode Device Drivers with a Proxy,但该机制实现起来相当相当复杂,理智点的人都会优先考虑用DDK搭个驱动。开始的时候,那WNetGetConnectinA函数就在我的脑子里闪了一下,难道眼前这个就是传说中的Hunter?
迅速打开RegSnap,配合私人磁盘跑了两遍,结果出来了:只在右键菜单扩展里动了点手脚,其它都没变。显然,Hunter还没诞生,如果采用代理机制,在注册表HKEY_LOCAL_MACHINE\SOFTWARE\URCS\ProxyDevices分枝下会有登记。我那本来就不是很好使的脑瓜进一步陷入昏迷状态,赶紧泡杯参茶喝下,总算及时抢救过来。到这时,我已肯定这兄台是蒙着俺的眼睛使巧了!巧巧巧,你巧巧巧巧,我看你往哪巧!再巧也不能不操作文件吧?说时迟那时快,FileMon已蹦出来,并依次记录了私人磁盘的四个动作:建立、打开、关闭、删除。一看FileMon记录,噢噢噢,亲爱的灰姑娘啊,我可揪到你啦!下面不正是吗?
//在回收站里建立虚拟驱动器源目录
C:\Recycled\UDrives.{25336920-03F9-11CF-8FD0-00AA00686F13}
//构造一个虚拟驱动器回收站
C:\Recycled\UDrives.{25336920-03F9-11CF-8FD0-00AA00686F13}\Recycled\
//虚拟驱动器加载程序
C:\WINNT\System32\subst.exe
注意,subst.exe是Windows下自带的一个命令行小工具,用来将路径与驱动器关联,具体用法为:
SUBST [drive1: [drive2:]path]
SUBST drive1: /D
drive1: 指定要指派路径的虚拟驱动器。
[drive2:]path 指定物理驱动器和要指派给虚拟驱动器的路径。
/D 删除被替换的 (虚拟) 驱动器。
不加任何参数键入 SUBST,可以显示当前虚拟驱动器的清单。
显然,私人磁盘整个工作机制是通过把回收站下一子目录指派给虚拟驱动器来实现的,由于回收站文件夹在Shell名字空间的特殊性,在里面自建立的文件或目录不会从资源管理器反映出来,从而达到隐藏源文件的目的。但是,在控制台模式下用dir /a就能让所有东西原形毕露。
好,程序的工作机制已经搞清楚,那回到前面最重要的问题——加密。在私人磁盘里建立的文件是否经过加密并安全存储呢,现在是时候来找答案了。我在新建的虚拟盘根目录下建了个文本文件hello.txt,随便写了些东西,然后一顿关闭,连私人磁盘程序也结了。按程序上说的,现在的虚拟盘数据应该是“自动加密隐藏”了。对,藏是藏起来了,可还是能揪出来。用记事本程序顺利打开“C:\Recycled\UDrives.{25336920-03F9-11CF-8FD0-00AA00686F13}\hello.txt”,上面一个字也没变,害我咖啡喷了一屏幕。唉,失望啊。
——总结——
在Windows下,单单做个虚拟磁盘并不是件困难的事,你甚至不用编写一行代码就可以用subst.exe来完成。但如果要支持加密,而且还是面向透明文件访问的加密,那就没那么简单的,区块解释、文件流加密、冲突控制、缓冲管理、设备管理等等都是非常头疼的问题,去分析一下StrongDisk就知道所有这些事情实现起来是多么的不容易。
——后话——
刚拿到这个软件的时候,我是怀着十二分的敬意来看待的,因为自己也是个做技术的人,知道搞点东西很不容易,但知道来龙去脉后,就有了现在这篇文章。如果那兄台在描述这个软件的时候有一说一,就算没有加密功能,我也会叫好,因为其在巧上面做得的确有水平。诚然,不管是做人还是做事,灵巧是很重要的,但离开诚信和正直就一文不值了。这个私人磁盘软件是共享软件,叫价倒不高,也就¥30,用起来还算可以,就是在加密这个敏感问题上撒了谎,你买不买单就看着办吧。反正我是肯定不会了,至少对当前版本,我还要把钱省下来买瓶清洁剂——清洗我那无辜的笔记本屏幕和键盘。
希望下一版本的私人磁盘能走好。