Welcome to Yumao′s Blog.
FFxivARR SqPack 拆包記錄 2
, 2014年04月18日 , Java Language , 评论 0 ,

繼上一個拆包記錄之後
我們談談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
关键字:, , , , ,

评论已关闭