約6か月前、私はそのようなデバイスの所有者になり、非常に満足しています。 しかし、私はそれを少し洗練したかった-個性を与えるために。 この考えは、レジストラが贈り物としての文脈で生まれました。 最低限のタスクは、開始および最終スクリーンセーバーを独自のものに置き換えることでした。 このタスクは正常に解決されましたが、まだ創造的な検索の余地がありました。
技術的な詳細を読むことに興味がない人のために- ソースコードとバイナリがGitHubに投稿されています(.Net 4.0が必要)
開始する
これらのリンクは、ファームウェアの構造を調べるための出発点になりました。
pixeldoc.kicks-ass.net/projects/goprohdhero/firmware/v02.05.11
goprouser.freeforums.org/search.php?author_id=4914&sr=posts
chdk.setepontos.com/index.php?topic=5890.0
ファームウェアの全体と一部を個別にバックアップするレジストラの能力。
受け取ったファイルの内容を16進エディターで確認し、UARTのレコーダーの出力と比較すると、このファームウェアの配置が明らかになりました。
ファームウェア構造
レジストラファームウェアは5つのセクションで構成されています(正確な目的は不明です)。
[Bst] [Bld] [Pri] [Rom] [Dsp]
Romセクションには、レジストラのリソースが含まれています-私たちにとって最大の関心事です。
ファームウェアファイルの構造は次のとおりです。
[Bst] [Bld] [Pri] [Rom] [Dsp]
ファイルヘッダーは、次の構造で記述されます。
unsafe public struct FileHeader { public Int32 BstStart; public Int32 BstEnd; public Int32 BldStart; public Int32 BldEnd; public UInt64 Empty0; public Int32 PriStart; public Int32 PriEnd; public UInt64 Empty1; public Int32 RomStart; public Int32 RomEnd; public Int32 DspStart; public Int32 DspEnd; public UInt32 Magik; public fixed byte Const[0x19F - 0x03C + 1]; public fixed byte Empty2[0x7FF - 0x1A0 + 1]; }
いずれかのタイプのStartセクションとEndセクションがゼロに等しい場合、レジストラはこのセクションがファイルにないと見なします。
[Const]フィールドには、目的が不明ですが、現在のファームウェアバージョンのファームウェアファイル内のセクションの任意の組み合わせに対して一定です。
各セクションは、独自のタイトルで始まります。
unsafe public struct SectionHeader { public UInt32 CRC32; public UInt32 Version; public UInt32 Date; public Int32 ImgLen; public UInt32 Mem; public UInt32 Flags; public UInt32 Magik; public fixed byte Empty0[0x8FF - 0x81C + 1]; }
CRC32フィールドは、最も単純なアルゴリズムを使用して、セクションデータ(ヘッダーおよびアライメントバイトなし)に対して計算されます 。
ImgLenは、セクションデータの実際の長さです。
セクションRom
Romセクションには、レジストラリソースが単純なファイルシステムに編成されて保存されます。
ROMセクションデータの形式は次のとおりです。
Rom { } { }
ヘッダーROM
unsafe public struct RomHeader { public Int32 FilesCount; public Int32 Magik; public fixed byte Empty0[0x10FF - 0x0908 + 1]; }
ファイルヘッダーの構造は次のとおりです。
unsafe public struct RomFileHeader { public fixed byte FileNameBuf[Const.RomFilenameLength]; public Int32 FileOffset; public Int32 FileLength; public UInt32 Magik; }
リソース交換
レジストラのリソースを置き換えるには、レジストラが1つのセクションのみを含むファイルを個別にフラッシュできるという事実を使用すると便利です。 したがって、Romセクションのみを含むファイルを生成します。 これを行うには:
1. FileHeaderを変更し、Romセクションのみを残します
2.各ファイルの先頭を0x800に揃えてRomを再パックします。 番号とファイル名は元のままにしておく必要があります。
3.セクションヘッダーのチェックサムを再計算します。
4.これらすべてを出力ファイルに書き込みます。
最終的に、 github.com / magnitudo / F500Toolのようなプログラムができました 。
次は?
Romセクションには次のファイルがあります。
bitmaps.bin
fonts.bin
名前によって、それらに保存されているものが明確になります。 フォーマットはまだソートされていません。
誰でも助けたいですか?