Linux平台的X3固件打包/解包工具 原始碼公開

所有形式耳機與耳機驅動器相關討論,耳機系統專區.

版主: aeolusyung, zhang230631, suzumiyaminami

Linux平台的X3固件打包/解包工具 原始碼公開

文章aires317 發表於 週四 10月 02, 2014 3:24 pm

<解包工具>
以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,謝謝
aires317
SR40
SR40
 
文章: 1
註冊時間: 週三 8月 27, 2014 6:19 pm
來自: Taiwan

回到 新耳機系統討論版

誰在線上

正在瀏覽這個版面的使用者:Google [Bot] 和 84 位訪客