最近一直需要研究星际争霸二的信息格式。。15093补丁的更新让我纠结的欲仙欲死……
以前的分析全没用了,该死的暴雪改变了整个录像信息存储格式……好吧……我们来看看暴雪有多YD……
一般来说,在文件里保存一段数据,肯定会在字节之前某个位置储存数据的长度……恩,一直以来暴雪也是这样……
15093更新之前也是这样……
15093更新放弃了replay.info文件,而是把信息存放在了一个新文件replay.details里面。。令人诧异的是,在一些明文信息比如玩家名称、地图名称等字符串的前面我找不到长度在那……这是很令人沮丧的事情,毕竟没有长度我的程序就不知道应该读多少个字节,不知道何时停止………………在我N+1次欲仙欲死后……终于发现了一点端倪,数据长度不是明文表示的……它的数据长度是真实长度*2保存在文件里………………!比如MiniMap.tga总共11个字节,16进制则为0×0B,该死的暴雪竟然把它储存为0×0B*2=0×16……好吧……虽然这时我已经可以保证读取出正确的数据了……但是真的是一点愉悦的心情都没有……深深折服在暴雪的YD里……长度*2储存……难道这是暴雪的加密?我只感觉它在玩人……
另外暴雪这次位运算使用的很多,记录时间用的是位运算,新版的颜色信息也用的位运算。新版的颜色也耗掉了我不少时间,不过主要分析不是我在做……终于还算轻松了……逆向的哥们儿把星际拖得一丝不挂,却也看了半个多钟头才看明白暴雪怎么储存的颜色……也很YD……不过感觉没有那么玩人。在每个玩家的种族数据后,必定可以看到两个字节0×00,0×09,而之后百分之九十九是0xFE,0×03……在旧版的录像格式里我们知道暴雪的玩家颜色是由四个数据段组成的,分别是透明通道和RGB信息,一般是调整不了透明通道的,所以第一个肯定是0xFF……这里0xFE,0×03对应的其实就是0xFF。跳过0xFE,0×03后我们会看到[0x02,0x09,0x??,0x??,0x04,0x09,0x??,0x??,0x06,0x09,0x??,0x??]看到这里大家想必已经看出点规律了,每个0×09后面的两个数据应该就是RGB数值了……好吧,你猜对了,但是他们的算法却没有这么简单。暴雪将0×09后的第一位数据右移两位,将第二个数据左移16位,然后将结果位或,得到的才是真实的结果……
举例[0xFE,0x03],0xFE右移两位得0×3F,0×03左移十六位得到0xFF,0xFF OR 0×3F = 0xFF = 255,其他数据亦是此算法…………恩。。你想到了吗?我反正是囧了……不逆向估计没多少人能看出来……
恩……纠结的暴雪…………
附个replay.details颜色数据图
回复 (0)