setodaNote

忘れる用のメモ書き for Cybersecurity

ImHex:午前3時にがんばる人のためのバイナリエディタ

ImHex という Hex エディタを Ubuntu 20.04 にインストールしたときのメモ書きです。

ImHex

ImHex は2020年の12月に公開された比較的新しい、午前3時にがんばる人のための Hex エディタです。 *1

  • GitHub - WerWolv/ImHex: A Hex Editor for Reverse Engineers, Programmers and people that value their eye sight when working at 3 AM.
    https://github.com/WerWolv/ImHex

f:id:soji256:20210124021303p:plain:w520
GitHub - WerWolv/ImHex

f:id:soji256:20210124021847p:plain:w520
ImHex の画面例 https://github.com/WerWolv/ImHex より

ImHex を Ubuntu 20.04 にインストールする

公式の手順をベースに、ImHex を Ubuntu 20.04 にインストールしていきます。

なお、手元の環境では make 時に 6GB 程度のメモリを消費していたので、8GB 程度のメモリを搭載した環境で実行することを推奨します。 4GB の環境では make 時に端末がフリーズし処理が完了しませんでした。

# 必要に応じてパッケージを最新化
sudo apt update && sudo apt upgrade
# ImHex のソースを取得
git clone https://github.com/WerWolv/ImHex.git

# コンパイルに必要な環境準備
cd ImHex
sudo ./dist/get_deps_debian.sh

mkdir build
cd build

# 環境によるエラー防止のための cmake ファイル修正パッチ
cat <<EOL >> cmakepatch.txt
55,56c55,61
<     list(REMOVE_AT PYTHON_VERSION_MAJOR_MINOR 2)
<     list(JOIN PYTHON_VERSION_MAJOR_MINOR "." PYTHON_VERSION_MAJOR_MINOR)
---
>     list(LENGTH PYTHON_VERSION_MAJOR_MINOR PYTHON_VERSION_LENGHT)
>     if(PYTHON_VERSION_LENGHT GREATER 2)
>         list(REMOVE_AT PYTHON_VERSION_MAJOR_MINOR 2)
>         list(JOIN PYTHON_VERSION_MAJOR_MINOR "." PYTHON_VERSION_MAJOR_MINOR)
>     else()
>         set(PYTHON_VERSION_MAJOR_MINOR \${Python_VERSION})
>     endif()
EOL

# cmake ファイルに修正パッチを適用
patch ../cmake/build_helpers.cmake cmakepatch.txt

# 公式の案内している cmake コマンドだとエラーが出るので代替コマンド
CC=gcc-10 CXX=g++-10 cmake ..

# ==【注意】=================================================
# 8GB 以上の環境を推奨
# 試した環境ではメモリが6GB程度ないと make -j により端末がフリーズしました。
#=========================================================
make -j

無事に make まで完了したら公式サイトにあるとおり ImHex の実行準備をします。

# 動作に必要なライブラリを適切な場所にコピー
cp -r ../python_libs/lib ./

# パターンファイルなどを取得
git clone https://github.com/WerWolv/ImHex-Patterns.git
mv ImHex-Patterns/includes ./
mv ImHex-Patterns/magic ./
mv ImHex-Patterns/patterns ./

これで起動するはずです。

./imhex

うまくいくと空っぽの ImHex が起動します。

f:id:soji256:20210124012646p:plain:w520
ImHex 初回起動時

ImHex の画面設定

メニューにある「View」から必要な画面を追加できます。

f:id:soji256:20210124012957p:plain:w301
メニュー:View

画面はドラッグ&ドロップすることで組みなおすことができます。

f:id:soji256:20210124013125p:plain:w520
各画面はドラッグ&ドロップで組み上げられる

また、メニューの「File」にある「Load pattern...」からパターンファイルをロードすることで、ファイル形式の構造に合わせた色付き表示が可能になります。 なお、ファイルタイプに合わせた自動適用といった動かし方は見つけられませんでした。 *2

f:id:soji256:20210124013229p:plain:w275
パターンのロード

公式サイトの画像に近い感じに組み上げた例は以下の通りです。

f:id:soji256:20210124010541p:plain:w520
ImHex

動かしてみた感想

見た目が綺麗なのがいい感じです。 発展途上のツールということもあり、環境のせいか若干動作が不安定で普段に使うのにはまだちょっと先になりそうという印象を受けましたが、いろんな機能があるようで楽しい感じがするツールでした。

参考文献

ImHex 公式

cmake 周り

参考にしたトラブルシューティング

付録

concepts が見つけられないというエラーについて

github に記載の通りに cmake をした場合、make 時に <concepts> が見つけられないとエラーが発生する場合がありました。

/home/user/ImHex/include/window.hpp:3:10: fatal error: concepts: No such file or directory
    3 | #include <concepts>
      |          ^~~~~~~~~~
compilation terminated.

以下のコマンドで cmake してあげるとこれを回避できるようです。

CC=gcc-10 CXX=g++-10 cmake ..

上記コマンドでもうまくいかない場合は cmake を実行しているディレクトリにある残骸ファイルを削除してから実行してみるとうまくいくかもしれません。

「CMake Error at cmake/build_helpers.cmake:55」について

cmake 時に以下のようなエラーが表示される場合があります。

CMake Error at cmake/build_helpers.cmake:55 (list):
  list index: 2 out of range (-2, 1)
Call Stack (most recent call first):
  CMakeLists.txt:22 (findLibraries)


-- Configuring incomplete, errors occurred!
See also "/home/user/ImHex/build/CMakeFiles/CMakeOutput.log".

示されている cmake ファイルの55行目付近を確認すると以下の通り Python のバージョンを処理している部分のようでした。

    find_package(Python COMPONENTS Development REQUIRED)
    if(Python_VERSION LESS 3)
        message(STATUS ${PYTHON_VERSION_MAJOR_MINOR})
        message(FATAL_ERROR "No valid version of Python 3 was found.")
    endif()

    string(REPLACE "." ";" PYTHON_VERSION_MAJOR_MINOR ${Python_VERSION})
    list(REMOVE_AT PYTHON_VERSION_MAJOR_MINOR 2)  # 55行目
    list(JOIN PYTHON_VERSION_MAJOR_MINOR "." PYTHON_VERSION_MAJOR_MINOR)

    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_C_FLAGS} -DPYTHON_VERSION_MAJOR_MINOR=\"\\\"${PYTHON_VERSION_MAJOR_MINOR}\"\\\"")

パッと読めるほど詳しくないので「message(STATUS ${変数})」を使って printf デバッグをしていくと、処理の書かれ方が python のバージョン表記として 3.8.5 など3桁目の patch 部まであることを想定しているのに対して、実際には 3.8 など2桁目の minor 部までしか返されていないため、55行目の patch 部を決め打ちで取得する処理で配列の範囲外を参照してしまいエラーが発生しているようだと分かりました。 *3

その後の処理を追うと、結局は patch 部がある場合にそれを除外して minor 部までの書式に変更することが目的の処理のようなので、最初から patch 部がなければ特に処理しなくてもよさそうに見えます。

ということで、バージョンに patch 部が含まれている場合のみ当該処理がされるよう修正しました。

55,56c55,61
<     list(REMOVE_AT PYTHON_VERSION_MAJOR_MINOR 2)
<     list(JOIN PYTHON_VERSION_MAJOR_MINOR "." PYTHON_VERSION_MAJOR_MINOR)
---
>     list(LENGTH PYTHON_VERSION_MAJOR_MINOR PYTHON_VERSION_LENGHT)
>     if(PYTHON_VERSION_LENGHT GREATER 2)
>         list(REMOVE_AT PYTHON_VERSION_MAJOR_MINOR 2)
>         list(JOIN PYTHON_VERSION_MAJOR_MINOR "." PYTHON_VERSION_MAJOR_MINOR)
>     else()
>         set(PYTHON_VERSION_MAJOR_MINOR ${Python_VERSION})
>     endif()

上記修正の結果、エラーが出ることなく cmake が完了するようになりました。 *4

更新履歴

  • 2021/01/25 新規作成

*1:直訳すると「16進数エディタ」になりそうですが、日本では「バイナリエディタ」という呼び方が多く使われているように思います。

*2:Load pattern をクリックしてもファイルダイアログが表示されない場合もありました。画面表示をいくつか設定すると表示されるようになりましたが再現性の有無は未確認です。

*3:バージョンの呼び方として [major].[minor].[patch] というのがあるのでそれに基づき記述しています。

*4:major 部のみの場合には対応していませんが、処理を確認する範囲が広くなり大変そうなので無視しました。