FFxivARR SqPack 拆包记录 2
继上一个拆包记录之后 我们谈谈index的目录列表 我们随意的取一段index的目录就可以看出一点规律 (2048 = 0x800)
继上一个拆包记录之后
我们谈谈index的目录列表
我们随意的取一段index的目录就可以看出一点规律
(2048 = 0x800)
000800: 60 68 0e 00 0f 71 8e 08 30 76 0a 00 00 00 00 00
000810: 4d 75 27 01 0f 71 8e 08 80 5c 0a 00 00 00 00 00
000820: 26 20 e3 05 0f 71 8e 08 00 60 0a 00 00 00 00 00
由列举的hex字符串可以得到一点结论
每条目录文件的长度为16字节
将16位字节以4字节一组划分为4组
第一组完全不一样
个人猜想是文件的标示
例如文件名一样
(不过羽毛在ffxiv反编译中有找到文件名列表
所以这里的前一组不认为是文件名
可能是特殊的文件标识
第二组字节大量重复
但是又有不同的内容
猜想可能是文件类型或者同一个文件夹
待验证
第三组个人猜测就是文件的地址了
但是在列表hex中没有查询到文件长度
所以应该是记录在dat0文件内部
(经测试将第三组地址拿来查询dat0文件
可以查询到一段hex的起始句例
所以认定为文件地址
第四组数据看到都为空
暂时无任何认定
老样子 放出文件地址获取代码
private static void getFIleSegment(byte[] hexBytes) throws Exception{
//輸入的壹定是16個字節的hex
//第三組字節代表的是對應的dat0的地址位置
byte[] tmp = new byte[4];
int co=0;
for(int i=11;i>7;i--){
tmp[co++]=hexBytes[i];
}
//進行地址操作 以2^7對齊(原因可以查看dat0文檔)
tmp = HexUtils.HexString2Bytes(Long.toHexString((Long.parseLong(HexUtils.Bytes2HexString(tmp).replace(" ", ""),16)*0x80)));
System.out.print("文件塊地址爲: "+HexUtils.Bytes2HexString(tmp));
//進行文件提取
getFileContent(Long.parseLong(HexUtils.Bytes2HexString(tmp).replace(" ", ""),16),filePath);
}
插入break语句测试 运行结果如下:
文件塊地址爲: 53 B1 80
文件塊地址爲: 18
文件塊地址爲: 64 00
然后寻找0a0000.win32.dat0文件
在53B180位置寻找到以下内容
所以确认第三点为文件地址
53b160: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
53b170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
53b180: 80 00 00 00 02 00 00 00 8c 1a 00 00 16 00 00 00
53b190: 13 00 00 00 01 00 00 00 00 00 00 00 80 09 8c 1a