リバースエンジニア向けヘックスエディタ ImHex
(github.com/WerWolv)- ImHexは、リバースエンジニア、プログラマー、深夜作業者向けのヘックスエディタで、ファイル内容の解析・修正・可視化機能を1つのツールに集約
- 中核機能は、Cライクなパターン言語で構造とデータ型を定義し、ファイル内容をパース・ハイライトできることと、MIMEタイプおよびmagic値ベースの自動ロードをサポートする点
- ローカルファイル、raw disk、GDB Server、UDPパケット、プロセスメモリ、SSH/SFTPリモートファイルなど、複数のデータソースを開くことができ、Capstoneベースの逆アセンブラとYARA ruleスキャンも含む
- 利用条件としてOpenGL 3.0以上対応GPUが基本で、
-NoGPUソフトウェアレンダリング版はGPUなしでも使えるが、GPUアクセラレーション版よりかなり遅くなる可能性がある - プラグインは
libimhex、ImHex API、Content Registryを通じて開発し、大半はGPLv2-onlyだが、/lib/libimhexと/plugins/uiはLGPLv2.1で提供されるため、proprietaryプラグイン開発を許可
ImHexが提供する基本的な役割
- ImHexは、リバースエンジニア、プログラマー、そして午前3時の作業でも目が疲れにくいツールを求める人のためのヘックスエディタ
- 最新リリースのダウンロード、nightly pre-release、Web版、ドキュメントが別途提供されている
ヘックスビューとデータ編集
- ヘックスビューは、byte patching、patch management、無制限のundo/redoをサポート
- バイトコピーは複数形式で可能
- bytes
- hex string
- C、C++、C#、Rust、Python、Java、JavaScript配列
- ASCII-Art hex view
- HTML self-contained div
- 検索と移動機能は、単純なstring/hex search、先頭・末尾・現在カーソル基準のgotoを含む
- ハイライトは、前景ルール設定、パターン・検索結果・ブックマークベースの背景ハイライトをサポート
- データ表示は複数の型をサポート
- 8/16/32/64ビット hexadecimal integer
- 8/16/32/64ビット signed/unsigned decimal integer
- 16/32/64ビット float
- RGBA8 color、HexII、binary
- エンコーディングはASCIIとユーザー定義エンコーディングを扱い、UTF-8、UTF-16、ShiftJIS、ほとんどのWindowsエンコーディングなどを標準サポート
- paged data viewを提供
パターン言語とデータ構造の解釈
- Pattern Languageは、ImHex向けに開発された完全なカスタムプログラミング言語
- Cに似た構文で構造とデータ型を定義し、それを使ってファイル内容をパースし、ハイライトできる
- パターン言語はMIMEタイプとmagic値に基づく自動ロードをサポート
- サポート要素には、arrays、pointers、structs、unions、enums、bitfields、namespaces、little/big endian、conditionalsなどが含まれる
- エラーメッセージ、syntax highlighting、error markingを提供
- データ可視化の対象には、images、audio、3D models、coordinates、time stampsなどが含まれる
- 関連資料:
- Pattern Language Source Code
- Pattern Language Documentation
- ImHex-Patterns: format patterns、libraries、magic、constant files のリポジトリ
データ検査、前処理、検索
- Data Inspectorは、endianness、decimal、hexadecimal、octal、bit inversionを含め、データをさまざまな型として解釈
- unsigned/signed integer: 8/16/24/32/48/64ビット
- float: 16/32/64ビット
- signed/unsigned LEB128
- ASCII、Wide、UTF-8 characters and strings
time32_t、time64_t、DOS date/time- GUID、RGBA8、RGB65 colors
- inspector経由でbyteのコピーと修正が可能で、パターン言語で新しいデータ型を追加できる
- node-based data pre-processorは、ヘックスエディタに表示される前にデータを修正・復号・デコードできる
- underlying sourceに触れずにデータを変更可能
- custom nodeの追加をサポート
- データ検索は、ファイル全体または選択領域を対象に実行できる
- 文字列抽出は最小長、文字セット、エンコーディングオプションを提供
- sequence searchはbyteまたはcharacter sequenceを探し、大文字小文字を無視するオプションを提供
- regex search、binary pattern wildcard search、numeric value/range searchをサポート
- numeric searchはsize、endianness、unaligned value無視オプションを含む
データソースと分析機能
- ImHexは複数のデータソースからデータをロードできる
- ローカルファイル: 大容量ファイルの高速かつ効率的なロードをサポート
- raw disks: raw diskとpartitionのロード
- GDB Server: 実行中プロセスまたはembedded deviceのRAMにアクセス
- Intel Hex、Motorola SREC
- Base64 encoded data
- UDP packets
- process memory: 実行中プロセスの全address spaceを検査
- SSH/SFTPリモートファイル
- データ解析・可視化は、file magicベースのfile parserとMIME type databaseを含む
- グラフと統計は、byte type distribution、entropy graph、highest/average entropy、digram、layered distribution graphを提供
- encrypted/compressed file detection機能がある
- diffingは、異なるデータソース同士を比較し、差分ハイライトとtable viewを提供
逆アセンブリ、YARA、ハッシュ
- 内蔵逆アセンブラは、Capstoneが対応するすべてのアーキテクチャをサポート
- ARM32、ARM64、MIPS、x86 16/32/64-bit、PowerPC、SPARC、IBM SystemZ、xCORE、M68K、TMS320C64X、M680X、Ethereum、RISC-V、WebAssembly、MOS65XX、Berkeley Packet Filter
- 独自アーキテクチャ向けのcustom disassembler作成もサポート
- YARA Ruleサポートでは、official yara rulesでファイルをスキャンし、matchをヘックスエディタ内でハイライトし、matchへ移動でき、複数ruleを一度に適用できる
- ハッシュは、特定のデータ領域と任意の文字列を対象に計算できる
- 対応ハッシュには、CRC8/16/32、MD5、SHA-1/SHA-224/SHA-256/SHA-384/SHA-512、Adler32、Murmur、SipHash、XXHash、Tiger、Blake2B、Blake2Sなどが含まれる
UI、テーマ、インポート・エクスポート
- テーマは、デフォルトでdark modeを提供し、light modeも利用可能
- 共有可能なtheme fileで全UI要素の色とスタイルをカスタマイズでき、custom fontもサポート
- modern interfaceは、multiple workspaces、custom layouts、detachable windowsをサポート
- import/exportは、Base64 files、IPS/IPS32 patches、Markdown reports、複数プログラミング言語向けbinary arraysをサポート
- bookmarksは、custom name/color、ヘックスエディタ内のregion highlight、jump、新しいタブでbookmark contentを開く機能、comment追加をサポート
- 内蔵content updaterは、データベース内のファイルをImHex内部からダウンロードできる
- pattern files
- pattern language libraries
- magic files
- custom data processor nodes
- custom encodings
- custom themes
- Yara rules
ツールとオンボーディング
- Helpful toolsには、LLVMベースのItanium、MSVC、Rust、D-Lang demanglerが含まれる
- その他のツールには、ASCII table、regex replacer、mathematical expression evaluator、graphing calculator、hexadecimal color picker、base converter、byte swapper、UNIX permissions calculator、Wikipedia term definition finderなどが含まれる
- file utilitiesは、file splitter、file combiner、file shredderを提供
- TCP Client/Server、HTTP Requests、IEEE754 Float visualizer、Euclidean algorithm calculatorなども含まれる
- 導入を助ける機能として、多言語サポート、初心者向けsimplified mode、充実したドキュメント、データベース内のexample files、achievements、interactive tutorialsがある
システム要件とビルド条件
- GPUは通常、OpenGL 3.0以上が必要
-NoGPUsuffix付きリリースはsoftware rendered方式のためGPUなしで実行できるが、GPU accelerated版よりかなり遅くなる可能性がある- 可能であればintegrated GPUではなくdedicated GPUの利用が推奨される
- Windowsの一部Intel HD GPU driverではgraphical artifactsが発生することが知られている
- OSサポート:
- Windows 7以降、Windows 10/11推奨
- macOS 15 Sequoia以降
- それ未満のバージョンでも自前でコンパイルすれば動作する可能性はあるが、GitHubにmacOS 15未満のCI runnerがないため、release binaryは動作しない
- macOS buildは署名されていないため、Security & Privacy設定で手動許可が必要
- LinuxはUbuntu/Debian、Fedora、RHEL/AlmaLinux、Arch Linux向けofficial releaseがあり、その他のdistroはAppImage、Flatpak、Snapでサポート
- FreeBSD 14.3でテスト済み
- CPUはx86、AMD64、ARM64を公式サポートし、Little Endian CPUであれば動作するはず
- RAMは約50MiBが必要で、より複雑な解析にはさらに多くのメモリが必要
- ストレージ容量は約100MiBが必要
- コンパイルにはC++23以上をサポートするGCCまたはClangが必要
- WindowsとLinuxのreleaseは最新のavailable GCCでビルドされる
- macOSのreleaseは最新のavailable LLVM Clangでビルドされる
- MSVCとAppleClangはサポートされない
- インストールとコンパイルのドキュメント:
プラグイン開発とライセンス
- プラグイン開発はtemplate projectから始められ、
libimhex、ImHex API、Content RegistryにアクセスしてImHexと連携したり、新しいcontentを追加したりできる - プラグインをビルドするにはSDKが必要
- ローカルSDKビルド手順:
cmake -G Ninja -DIMHEX_BUNDLE_PLUGIN_SDK=ON -B buildcd buildDESTDIR=install ninja install- SDKパスは
install/usr/local/share/imhex/sdkになり、IMHEX_SDK_PATHをそのabsolute pathに設定する必要がある
- GitHub Actions CIでは、imhex-download-sdk actionでSDKを自動ダウンロードできる
- プラグインの出発点としてImHex Plugin Templateが提供される
- ライセンスの大半はGPLv2-only
/lib/libimhexはLGPLv2.1/plugins/uiはLGPLv2.1- この例外はproprietary plugin開発を許可するためのもの
- code signing policyでは、ユーザーが明示的に要求するか、インストール・運用管理者が要求しない限り、他のネットワークシステムへ情報を送信しないと明記している
1件のコメント
Hacker Newsのコメント
ImHexは、これまで使った中で最高のヘックスエディタだった
理由はいくつかあって、ほかのエディタにも一部はあるが、全部を兼ね備えているものは珍しい。ファイルテンプレートで既知のファイル形式のセクションを自動でハイライトし、選択したバイト列を一般的なデータ型のほとんどとして同時に解釈して表示でき、大きなファイルを扱うときもほかのエディタよりずっと高速
欠点はimgui UIに時々バグがあることだが、HexFiendやhexaのようなほかのビューアを置き換える存在になっている
このエディタがASCIIバイトをCP437グリフで表示できるのか気になる
DOSでバイナリファイルをそうやって読んで育ったので、16進値そのものよりグリフのほうがずっと速く読める。逆に、表示できない文字を点で示されてもあまり情報にならない
一覧にCP437は見当たらないが、エンコーディングファイル形式は単純なのでマッピングは簡単に作れそう
https://github.com/WerWolv/ImHex-Patterns/tree/master/encodi...
それに、ドイツ語のsharp Sなのかベータなのか曖昧な文字もある
ImHexは使ってみたが、自分がやりたかった作業の大半には複雑すぎた
macOSでは今でもHex Fiendが好き。シンプルで高速で、やりたいことをやってくれる。Windowsではまだ完璧な「シンプルな」ヘックスエディタを見つけられていない
macOSではHex Fiendを使っているが、ウィンドウを広げると行を再フローする理由がわからない。視覚的な邪魔を減らすために最大化しても、行の長さは16バイトや32バイトのままにしたいし、整列を壊す変なサイズにはしてほしくない
ImHexも少し使ってみたし、プロジェクト自体は本当に尊敬しているが、自分の用途にはハエを撃つのに大砲を使うような感じだった
当面は010 Editorを使い続けるつもり[1]。これまで一生の中で使ったヘックスエディタの中で最も優れていた
この新しいプロジェクトが使っているGUIフレームワークのDear ImGuiはまったく好きになれない。小さい画面やウィンドウマネージャのない組み込みシステム向けに近く、完全なデスクトップ環境で使うには、小さな要素やUI統合の欠如のせいでかなりちぐはぐに感じる
[1] https://www.sweetscape.com/010editor/
「ImHex requires a GPU with OpenGL 3.0 support in general」とあるが、なぜヘックスエディタにOpenGLが必要なんだろう? それでGPUも必要になるのか?
OpenGLが必要なもっともな理由があるのか、それとも見栄えのためだけなのか気になる
特に複雑な書式をピクセル単位で描いていた時代のやり方は、目に見えて遅い。たとえばこの記事を見るといい
[1] https://www.sublimetext.com/blog/articles/hardware-accelerat...
ただし、OpenGL要件が必ずしもGPUを意味するわけではない。OpenGLのソフトウェア実装もあるが、性能はたいていよくない。それに最近の多くのプラットフォームは何らかの形でGPUがあることを前提にしている。GPUなしでGUIツールが必要なケースはまれだし、そういうニッチな環境でヘックスエディタやツールをローカル実行する可能性も低い
本当に素晴らしいプロジェクト。PhilipsのスマートウォッチのROMをいじってかなり楽しく遊べた
Rustのように見える組み込みDSLがあり、メモリ管理もなく非常に軽量だが、それでバイナリストリームの構造化データを可視化して抽出できる。本当に楽しくてクール
コードなしで簡単な計算を作るビジュアルエディタもあるが、使ったときはまだ洗練されていない感じだった。不思議なことに、DSLでコードを書くほうがむしろ直感的で簡単だった
関連記事:
ImHex – A Hex Editor - https://news.ycombinator.com/item?id=32287902 - 2022年7月、コメント70件
ImHex – A Hex Editor - https://news.ycombinator.com/item?id=25353965 - 2020年12月、コメント78件
かなり良さそう。プロジェクトとしてヘックスエディタを開発してみるのはいいアイデアだろうか?
単純な版はそれほど難しくなさそうだが、実行ファイルイメージからDoom WAD、独自ファイル形式まで、あらゆるファイル形式をパースしようとすると練習の余地が多い。リバースエンジニアリングを助けるツールを作る余地も大きそう
ファイル処理、GUI、テキスト配置、メモリ管理など、いろいろな項目を一度に練習できると言っていた
良さそう。普段はワイルドカード検索のために010 Editorを使い続けていたが、ImHexもその機能以上のことをしてくれるので気持ちが傾いている。もう少し試してみるつもり
この手のコンピュータ文化は本当にいい。リバースエンジニアリング、カーネルモジュールの作成、物事がどう動くのかを理解し、本来想定されていないことをさせるのが魅力的
ただ、合法的にできる道は多くなく、膨大な時間と仲間の助けが必要
趣味の面では、自分の住む国では、自分が所有するものを自分のシステムで動かす目的のリバースエンジニアリングは明示的に合法。たとえばWindows XPのゲームをWindows 10で動くように直す場合。この例外はかなり広く、「合法であるべきだ」と思える大半のケースでリバースエンジニアリングが可能になる
実名と結びつかない仮名で公開し、DMCA削除要請を無視する専用コミュニティを使えばいい。これで金を稼ぐつもりがないなら、最悪でも対象が成果物に気づいて次のリリースでvmprotectを適用する程度だろう
固定長レコードだと気づき、タイトル直後の2バイトがアプリに表示されるレコード番号の16進値のように見えた。チェックボックスをクリックすると1バイトが0x00から0x01に変わり、十分に実験したあと、全体構造をコードの構造体にマッピングして、元のアプリでは対応していなかったレポートを作れるようになった
そこに違法なことは何もなかった。ベンダーは私たちにレポート作成費用を払ってほしかっただろうが、法的に禁じられていたわけではない
何かを作ったり学んだりしたからといって、必ずしも放送のように広く知らせる必要はない。学ぶこと自体が報酬になり得る