2025/05/05 16:41 Reverse-engineering Fujitsu M7MU RELC hardware compression

ロボ子、今日のITニュースはSamsungのカメラファームウェア解析の話じゃぞ!

Samsungのカメラファームウェアですか、博士。具体的にはどのような内容なのでしょうか?

どうやら、NX miniとかNX3000とか、Galaxy K Zoomのファームウェアに使われてる独自のLZSS圧縮を解析したらしいのじゃ。

独自のLZSS圧縮ですか。なぜ解析する必要があったのでしょう?

それは記事には書いてないのじゃ。でも、不明な圧縮アルゴリズムを解明するのは、リバースエンジニアリングの基本じゃからな!

なるほど。それで、そのLZSS圧縮はどのようなものだったのですか?

それが面白いことに、FujitsuのRELC(Rapid Embedded Lossless data Compression)というアルゴリズムだと判明したのじゃ!ARM SoC上の組み込みハードウェアIPブロックらしいぞ。

FujitsuのRELCですか。知りませんでした。LZSS圧縮の仕組みも教えてください。

基本的には、各ブロックがビットマスクで始まって、リテラルバイトとトークンを識別するのじゃ。トークンはオフセットと長さのタプルで構成されていて、オフセットは参照データの位置、長さはコピーするバイト数を示すぞ。

オフセットと長さのタプルですね。一般的なLZSS圧縮と同じような仕組みなのですね。

そうじゃな。ただ、このRELCは、2011年のARM Cortex Design Supportのファクトシートで言及されてるくらいじゃから、組み込み向けに最適化されてるのかもしれんの。

なるほど。ファイル構造についても解説されていますね。1024バイトのM7MUヘッダーがあって、7つの(非)圧縮セクションファイルがあるとのことですが。

そうそう。圧縮フラグビットと15ビット長のサブセクションがあって、RELC/LZSS圧縮ストリームが続くのじゃ。最後は0x0000で終わるらしい。

結構複雑な構造ですね。解析に使われたツールも紹介されていますね。m7mu.pyとm7mu-decompress.pyですか。

その通り!ファームウェアファイルダンパーとデコンプレッサじゃ。GitHubで公開されてるから、試してみるのも良いかもな。

興味深いですね。ところで、記事には「offset=-1 は「ウィンドウから最後のバイトを繰り返す」ことを意味する」とありますが、これはどういうことでしょうか?

ふむ、それは、直前のバイトを繰り返すことで、同じ文字が連続する場合に圧縮率を上げるテクニックじゃな。例えば、'AAAA'という文字列があったら、'A'の後にoffset=-1、length=3のトークンを使えば、'AAA'を表現できるぞ。

なるほど、効率的な圧縮方法ですね。offset=0 (token=0x0000) が特殊なケースというのも気になります。

それについては詳細が書かれてないのじゃ。何か特別な意味があるのかもしれん。

今後の展望として、カメラ上で実行されている実際のコードの理解を目指すとありますね。

そうじゃな。ファームウェア解析は、セキュリティ研究とかにも繋がるから、非常に重要な分野じゃぞ。

勉強になります、博士!

ところでロボ子、このファームウェア解析、まるで宝探しみたいじゃな!圧縮されたデータの中からお宝を見つけ出す、って感じじゃ!

そうですね、博士。でも、見つけたお宝がバグだったりしたら、ちょっと残念ですね。

それもまた一興!バグもまた、エンジニアの愛すべき友達じゃからな!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。