去年帮朋友恢复一台旧笔记本里的过密资料,硬盘里有个 2GB 的码提 zip 压缩包,里面是取文他早年拍的婚礼视频。密码?过密早忘了。他试了生日、码提手机号、取文甚至前女友名字的过密拼音,全错。码提我接手后没去跑什么暴力破解——那玩意儿跑一年也未必出结果——而是取文直接打开命令行,敲了一行 zip -FF。过密两分钟后,码提视频文件全躺在一个新目录里。取文
这就是过密 zip 格式一个老掉牙但极少被普通人注意的特性:它的加密只锁内容,不锁目录结构。码提文件头、取文文件名、压缩方式、大小、CRC 校验码,这些元数据默认是明文存储的。你拿 WinRAR 打开一个加密 zip,能看到里面有什么文件、多大、什么时候压的,只是双击解不开。很多人以为“能看到列表”等于“拿不到文件”,实际上只要知道文件名和压缩算法,用工具直接按偏移量把压缩后的数据流抠出来,再单独解压就行。密码?不参与解压过程,它只参与解密。而 zip 的“加密”和“压缩”是两层独立操作。
我常用的工具是 zip -FF 配合 7z。先修复可能损坏的中央目录,然后让 7z 去“提取”而不是“解压”。7z 有个参数 -p 后面跟空字符串,意思是“我知道有密码但我不提供”,它会尝试跳过解密步骤直接读原始压缩块。如果压缩块本身没被二次加密,就能直接还原。成功率取决于压缩软件——老版本 WinZip 和 Linux 下的 zip 命令,默认就是这种“伪加密”。新版本 WinRAR 加了 AES-256,头信息也加密了,这招就废了。但网上流传的 zip 包,八成以上还是老式 ZipCrypto。
另一个坑是“知道密码但不想输”。比如你有个自解压 exe,密码写在某个配置文件里,但 exe 本身不让你看。用 binwalk 扫一下,能直接定位到 zip 数据段的起始偏移,然后用 dd 切出来,当成普通 zip 处理。我试过一个公司内部的驱动包,密码是“company2023”,但安装程序把密码硬编码在资源段里。用 strings 一搜就出来了,根本不用逆向。这算不上绕过,叫“密码泄露”更准确。
说回那个婚礼视频。朋友后来问我怎么搞的,我说“zip 的加密像个挂锁,锁的是抽屉把手,但抽屉本身能从侧面抽出来”。他似懂非懂。其实关键就一点:别把 zip 当保险箱。它设计之初是为了节省拨号上网的流量,加密是后来硬塞进去的补丁。真要藏东西,用 7z 的 AES-256 加加密文件名,或者直接上 VeraCrypt。zip 那点保护,防君子不防小人,更防不住命令行。
最后提醒一句:以上操作仅适用于你拥有合法权限的文件。拿它去搞别人东西,性质就变了。我帮朋友是因为硬盘是他的,视频是他的,密码忘了也是他的。技术本身没立场,用的人有。