得,今天唠唠那个叫的玩意儿。这东西当初可把我折腾得够呛。
初遇这玩意儿
那还是好几年前,公司接个老系统的维护迁移活儿。系统老掉牙,文档几乎没有,就扔过来一堆文件和数据。翻腾的时候,就碰上这个文件,还不止一个,好几个目录里都有。看名字像是某种目录或者索引文件,后缀.wci
也没见过,搜也搜不到啥有用信息。
头疼的开始
这下麻烦。不知道这文件是干嘛的,系统里具体哪个功能在用它,心里就没底。直接用文本编辑器打开?试,全是乱码,偶尔蹦出几个能看懂的词,但连不成句子,没啥用。用二进制编辑器看看,稍微好点,能看到一些规律性的数据头,但具体啥意思,还是两眼一抹黑。
问客户?客户那边负责的人也换好几茬,也是一问三不知,就说系统以前能跑,让咱们看着办。得,皮球踢回来。
瞎折腾过程
没办法,只能硬着头皮上。我当时琢磨着:
- 关联性分析: 我把所有找到的文件都列出来,看它们所在的目录结构,发现它们通常跟一堆图片或者文档放在一块儿。这更印证我的猜想,这玩意儿八成就是这些资源的索引文件。
- 动态调试?太难: 想着能不能把那老系统跑起来,看看它读写这文件的时候是啥情况。但这老系统依赖的环境太古老,虚拟机搭起来都费劲,还缺这少那的,跑不起来。这条路基本堵死。
- 暴力猜解: 我找个最小的文件,也就几KB,对着二进制编辑器硬看。配合着同目录下的资源文件,比如图片名、文档名啥的,去文件里找对应的十六进制串。你还别说,真让我蒙着点儿。发现里面确实存储文件名、好像还有文件大小和修改时间之类的信息,但格式很怪,不是常见的那种。
找到点门道
搞差不多两天,对着那个二进制文件看得眼睛都快瞎,总算摸清一点点门道。它大概是这么个结构:
- 一个文件头,记录索引多少个文件之类的基本信息。
- 后面跟着一堆记录条目,每个条目对应一个资源文件。
- 每个条目里包含加密(或者说就是简单异或处理过)的文件名、文件在某个大资源包里的偏移量、大小等。
那个所谓的“加密”很简单,就是跟一个固定的字节做异或。试出来之后,文件名就能正确显示。
最终解决
搞明白结构就好办。我赶紧用手头顺手的脚本语言(好像是Python,记不清),写个小程序,专门读取这种文件。程序逻辑很简单:
- 读取文件头,获取信息。
- 循环读取每个记录条目。
- 对文件名部分进行解密(异或还原)。
- 把提取出来的信息,比如文件名、路径、大小啥的,整理成咱们需要的格式,存到一个新的文本文件或者数据库里。
跑一下,成!把那堆老系统里的资源信息都给扒出来。有这些信息,后面的数据迁移工作就好做多,至少知道那些散乱的文件都是干嘛的。
一点感想
搞这种没文档的、奇奇怪怪的文件格式,真是又烦人又有点小兴奋。 烦的是过程太痛苦,跟猜谜似的;兴奋的是搞定,有种解开谜题的成就感。这回对付的经历,也算是给我提个醒,以后再碰到类似情况,别怕麻烦,多观察、多尝试,总能找到突破口。有时候最笨的办法,比如对着二进制硬看,反而能有奇效。要是能一开始就有文档,谁愿意费这劲儿,