以github下載連結後直接以命令
- 代碼: 選擇全部
make
編譯,正常編譯後在根目錄下應會有 X3FwSplit二進制檔
將要解包的x3.fw檔案放在 /home/<USER NAME>/ 目錄下 (目前路徑為寫死,視需求自行修改)
理論上檔案格式X1/X3/X5都可以通用
回到二進制檔的位置執行
- 代碼: 選擇全部
./X3FwSplit
成功執行後在同目錄下的 OutputX3 資料夾就是解包出來的檔案
Source code
Github 連結:
https://github.com/iKarosStudio/X3FwSplit
<打包工具>
編譯方式同解包工具,
須在二進制檔同層目錄建立 InputX3 作為打包.fw檔案的根目錄 (輸入輸出名稱現階段寫死,視需求修改)
將要打包的檔案放入 InputX3 資料夾後執行
- 代碼: 選擇全部
./X3FwMerge
打包完成後會在同層資料夾輸出一個 x3out.fw 檔案,這個就是打包生出來的檔案。
在這邊要注意的是,這支打包工具雖然可以按照檔案格式做正確打包的動作,
但是產出的檔案是不能用來給你的機器刷機的 (會刷機失敗,稍後說明)
為什麼呢? FiiO Xn系列的fw檔案基本上照IHFS檔案格式走,
但並不完全,有興趣研究者請參照上連結
IHFS File fomate
<刷機失敗的原因分析>
所謂的刷機失敗只的並不是直接讓你的機器變磚(FiiO在這部分有做好保護,謝天謝地)
使用這支工具產出的fw刷機只會得到 Update file corrupted.
由fw檔案格式的File Table部分開始看,以file table sector開始會用每個檔案64 bytes的資料告知檔案路徑、sector起始位置、檔案大小(bytes)
直接看到File table的最後一個檔案告知
檔案名為 'user.ini'
檔案位址在0x2487400 (一個sector有512 bytes)
檔案大小 4k byte
這是一個4k的空檔案(內容全0x00),我直接以我發現與IHFS格式異樣的地方開始看,
也就是檔案開始位址加上4k位移,來到0x2488400,我得到來源不明的4 bytes數值。
想要驗證的朋友可以用官方x3.fw 3.0版本做驗證,這是我一直用來測試的版本。
做hexdump動作:
- 代碼: 選擇全部
hd x3.fw -s 0x2488400
得到4 bytes資料為
0x2488400 : EC 29 6A 62
即0x626A29EC,我確信這是某種File table而不含raw file的驗證碼,
以工具檔案刷機時進行到約1/3時機器就會報錯,若這組驗證碼必須加入raw file運算,
那我推測應該在刷機的進度條必須到接近尾聲才報錯,而file table已經包含檔案位址及大小的資訊,
可以直接運算出檔尾位置,所以在讀完table後機器直接查找檔尾發現沒有驗證碼而報錯。
至於這組驗證碼要怎麼算個人也沒有頭緒,
已經嘗試過的部分有:
Header + Table 全區做crc32/checksum
Table 全區做 crc32/checksum
Table內每個檔案Index/Size做crc32/checksum
都沒有找到相應的數值,估計FiiO官方也不會提供算法,
所以我在這裡將所有原始碼公開,讓各位有興趣的朋友一起研究
Source code
Github 連結:
https://github.com/iKarosStudio/X3FwMerge
如果你有任何疑問或想法請發信到我的email,謝謝