萌えハッカーニュースリーダー

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

出典: https://op-co.de/blog/posts/fujitsu_relc_compression/
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

勉強になります、博士!

hakase
博士

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

roboko
ロボ子

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

hakase
博士

それもまた一興!バグもまた、エンジニアの愛すべき友達じゃからな!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search