QQ2003III表情文件格式分析

/ns/ld/softld/data/20040208183226.htm

  QQ作为一款国产优秀网络即时通讯软件,它的功能之强大是毋庸置疑的。每次更新都为我们带来大的惊喜,比如这次QQ2003III build0115的更新,就加入了自定义表情的功能,使原本已经非常丰富的图片表情功能更贴合用户的需要。
  在测试过程中发现,虽然QQ允许使用自己的图片导入并生成表情文件,但此项功能只能在线使用,而且没有专用工具,不开QQ2003III Build0115就没法制作表情,而新版QQ占用资源之大实在使我的老机不堪重负,对于我们这种受过良好的DIY教育的网虫,这是不能容忍的。于是,我来到了腾讯官方网站,看到了有表情包下载,但都是些cfc文件,我莫名,cfc是什么文件?我想当然地把它和WINAMP的wsz文件联系到了一起,把扩展名改成zip,试着解压,失败。然后又试着在Google上搜索,未果。
  不甘心,便给Tencent的客服发了Email,请他们将此文件的结构发给我。发完信我就后悔了,以前我是QQ会员的时候,他们回个信也得几星期,而且还总是无关痛痒的自动回复,现在让他们透露文件格式?真是做梦,木子工作室和珊瑚虫工作室的修改早已经让Tencent把所以的外来DIY当成商业侵权。
  一日后,看信箱果然无信,不理我?好……便又打开了尘封已久的UltraEdit,打开那几个网上下载的表情包。嗯!?其中有一段文字是“GIF89a”,很明显是gif文件的头部,呵呵,看来图片没有加密,太好了。接着继续往下看,又发现了“bm?”,凭经验知道这是bmp文件头部,又连续看了其他几个cfc文件,发现内部的图片都是一个gif一个bmp的放,这就比较奇怪了。于是,把里面两个连续的gif和bmp采用二进制复制的方式分别导出,发现两个文件是同一幅图像,可是bmp的边缘色彩不同。查看0115版本的bug修正表,发现“修正了自定义表情边缘不透明的bug”。哈哈哈,同时又在cfc文件中发现了“fixed.bmp”的字段,凭我多年的游戏开发经验判断,bmp文件是掩模文件,使用掩模是为了使图片显示时边缘透明的一种方法,题关外话,不作详述。
  心中大爽,成功了一半,可是在每个gif,bmp组之前的那一段到底是什么,几个间隔的数字以及一大堆乱码,让我又陷入了沉思。试着算内部图片存储的偏移量,发现符合其中几个数字。闲来无聊,便将那几个cfc再次导入QQ,可是QQ提示“文件已存在”,嗯?他是怎么知道这个cfc已经导入过了呢!?顿时眼前一亮,作为一个程序员,判断文件是否唯一的最好方法就是使用MD5(信息-摘要算法)算法,马上将刚才导出的两个gif和bmp用MD5算出了唯一识别码。成功!是GIF的MD5码,经过分析得知,刚才使我极为头痛的那段乱码结构是“MD5 + 快捷键 + 表情名称 + MD5 + “.gif” + MD5 + “fixed.bmp””,为什么要存放三遍MD5我想可能是为了保证数据的完整性。只剩下最头上那三个间隔的数字了,第一个是20H,经过我分析n个cfc发现是固定的,估计是一对gif/bmp组的头部标志。另外两个每对gif/bmp组都不同,肯定是变量,最后通过反复的试验发现分别是表情名称和快捷键字段的长度,值得注意的是,两个字段都是以ANSI而非Unicode存放的,也就是说,中文每字两字节,英文每字一字节,在运算的时候需要多加注意。

现在给出整个文件的结构:
1.第一对GIF/BMP组
1字节20H 头部标志,固定
3字节00H
1字节 快捷键字长
3字节00H
1字节 表情名称字长
3字节00H
1字节24H 文件长度变量开始标志,固定
3字节00H
2字节 GIF文件体长度(字节)
2字节00H
1字节29H GIF/BMP长度字段分隔标志位
3字节00H
2字节 BMP掩模文件体长度(字节)
2字节00H
1字节 未知标志位,一般为01H,修改后发现不影响导入
3字节00H
32字节 GIF文件的MD5码
不定长 快捷键ASC码(依先前定义字长决定)
不定长 表情名称ASC码(依先前定义字长决定)
32字节 GIF文件的MD5码
4字节 “.gif” “.gif”的ASC码
32字节 GIF文件的MD5码
9字节 “fixed.bmp” “fixed.bmp”的ASC码
不定长 GIF文件体
不定长 BMP掩模文件体
2.第二对GIF/BMP组
3.……

  从一名程序员的角度讲,这种文件结构存在着很多不合理之处,另外此功能的系统资源占用也十分严重,可能和这是一项新功能有关,相信Tencent会在不久后推出更先进的结构。我也将在不久后推出我的QQ自定义表情包制作工具,希望Tencent能在我的软件开发完以前将不能离线制作表情包的bug修正或发布独立的制作工具。
  如果有疑问,请到我的BBS提出,或加我QQ,我愿与各位高手共同讨论。

BBS: http://bbs.ee67.com
QQ: 13454071
===============================================
本文版权属20CN网络安全小组及其作者所有,如有转载,请保持文章完整性并注明出处
文章类型:原创 提交:Frankiez 核查:NetDemon