← 回到文章列表

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

在这里找找

输入关键词,找一篇过去的记录。