IPyIDA の紹介: リバース エンジニアリング ツールキット用の Python プラグイン

ESET Research は、IPython と Jupyter Notebook を IDA に統合する Python プラグインである IPyIDA 2.0 を発表しました。

Hex-Rays の IDA Pro は、おそらく今日最も人気のあるリバース エンジニアリング ソフトウェアのツールです。 ESET の研究者にとって、このツールはお気に入りの逆アセンブラーであり、IPython カーネルを IDA Pro に埋め込む IPyIDA プラグインの開発に影響を与えました。 2014 年からの継続的な開発の下、バージョン 2.0 のリリースを発表できることをうれしく思います。 IPyIDA は、IDA IPython と呼ばれる別のプラグインと同様の目的を果たしますが、ねじれがあります。IDA IPython は Windows のみをサポートしますが、IPyIDA は macOS、Linux、および Windows をサポートします。

既に IDA Pro と IPython に精通している場合は、IPyIDA に関するこの記事の最後のセクションに進んでください。 IPython に慣れていない場合は、中間セクションにスキップしてください。 最後に、IDA Pro の簡単な紹介があれば、読み進めてください。

IDAプロとは?

IDA Pro は、マシン コードをアセンブリ コードに変換する逆アセンブラーです。 ファイルをロードした後、IDA Pro はファイルを逆アセンブルし、分析結果をデータベース ファイルに保存します。 IDA Pro はデータベースにさまざまなウィンドウを提供し、それぞれが研究者が関心のあるコードを見つけてよりよく理解するのに役立ちます。

これらのウィンドウのいくつかを見てみましょう。 MathLibrary.dll ファイルこれは、DLL ファイルの作成に関する Microsoft のチュートリアルでビルドできます。

出力ウィンドウ

出力ウィンドウには、ファイルの分析ステータスに関するメッセージ、ユーザーが要求した操作のエラー メッセージ、および一部のプラグインからの出力が表示されます。 図 1 は、最初の読み込み後の出力ウィンドウを示しています MathLibrary.dll.

図 1. IDA 出力ウィンドウ

このウィンドウの下部には、コマンドを受け入れる入力フィールドがあります。 図 2 は、バージョン 7.3 以降の IDA に付属する 2 つのデフォルトのコマンド言語プロバイダーを示しています。IDA ネイティブの C に似た言語で記述されたコマンド用の IDC と、Python で記述されたコマンド用の IDAPython プラグインです。

図 2. IDA で Python コマンドを入力するための入力フィールド

IDA ビュー ウィンドウ

逆アセンブリ ウィンドウとも呼ばれる IDA ビュー ウィンドウには、グラフ ビューとテキスト ビューの 2 つの表示形式があります。 グラフ ビューは、関数を 1 つの入口と 1 つの出口点を持つブロックに分割することで、プログラム フローを視覚化します。 図 3 にグラフ ビューを示します。

図 3. IDA 逆アセンブリ グラフ ビュー

テキスト ビューには、仮想アドレス、アセンブリ コード、およびコメントを表示する逆アセンブリの線形ビューが表示されます。 図 4 にテキスト ビューを示します。

図 4. IDA 逆アセンブル テキスト ビュー

IDA が提供するこれらのウィンドウやその他の多くのウィンドウに加えて、IDA では、その機能を拡張し、実用的なリバース エンジニアリングの問題を解決するカスタム プラグインを作成できます。 IPython と、IDA で Python スクリプトを使用するリバース エンジニアに提供されるいくつかの魅力的な機能に目を向けましょう。

IPython の概要

IDAPython は、IDA で Python スクリプトとコマンドを実行するための基本的なニーズを満たしますが、Python 愛好家は IPython 熱に取りつかれています。 IPython は、Python でよりインタラクティブなエクスペリエンスを提供するツールキットです。 IPython は、カーネルとクライアントで構成される 2 プロセス モデルを使用します。 カーネルは、クライアントからコマンドを受信して​​実行し、結果を返すプロセスです。 クライアントは、Jupyter コンソール、Jupyter Qt コンソール、Jupyter Notebook などの任意の対話型コンソールにすることができます。

これらのクライアントのインタラクティブな性質は、従来の Python シェルに追加された多数の機能に由来します。 図 5 は、複数行のコード ブロックを使用して IPython で関数を定義する方法を示しています。

図 5. 複数行のコード ブロックを使用して IPython で関数を定義する

整数、キーワード、組み込み関数、および文字列の構文が強調表示されていることに注意してください。

を押すことで、 タブ キーとして、IPython は、コードを完成させることができる関連する属性、オブジェクト、または関数のリストを提供します。 図 6 は、文字列オブジェクトに関連するタブ補完リスト関数を示しています。

図 6. IPython でのタブ補完

Jedi がインストールされている場合、タブ補完はよりリッチになります。

IPython にはマジック関数も用意されています。これは通常、 %%% 接頭辞を付けて、コマンドライン スタイルの構文で引数を取ります。 図 7 に、 %timeit Python 式の実行時間を計測する魔法の関数。

図 7. IPython のマジック関数

を使用して ! コマンド ラインの先頭に文字があると、IPython コンソールはそのコマンドを基になるシステム シェルに渡して実行します。 たとえば、人気のあるコマンドは pip です。これは、Python Package Index (PyPi) からパッケージをインストールおよび管理します。 図 8 に、 ピップ コマンドは IPython から実行されます。

図 8. IPython からシステム シェル コマンドを実行する

IPython は、公式ドキュメントで調べることができる、より多くのインタラクティブな機能を提供します。

IPyIDA: IPython を IDA に導入する

IPyIDA 2.0 のリリースにより、次の利点により、IDA での Python スクリプトの記述がより使いやすくなりました。

  • Windows、Linux、および macOS での IDA のサポート
  • 仮想環境でも簡単にセットアップできるインストールスクリプト
  • IDA ウィンドウで実行されている Jupyter Qt コンソール
  • IDA の外部から、Jupyter コンソールなどのフロント エンドに接続できる IPython カーネル。
  • を使用して IPython カーネルに接続する Jupyter Notebook を開くことをサポートする Jupyter カーネル プロキシ。 %open_notebook 魔法の機能

図 9 は、IPyIDA から Jupyter Notebook を開くプロセスを示しています。

図 9. %open_notebook IPyIDA のマジック関数

図 10 は、IDA の IPython カーネルに接続する IDA 外部のターミナル セッションで実行されている Jupyter コンソールを示しています。

図 10. IDA の IPython カーネルに接続する IDA の外部の Jupyter コンソール

IPyIDA 用の Jupyter Qt コンソールを選択すると、インライン グラフィックス、現在のセッションの保存と印刷、完全な構文の強調表示など、従来の IPython コンソールに追加のインタラクティブな機能がもたらされます。 これらは、Jupyter Qt コンソールの公式ドキュメントに示されています。

IPyIDA は、IDA に触発された独自のインタラクティブ機能も提供します。 図 11 は、IPython コンソールでアドレスまたは変数名を Ctrl キーを押しながらクリック (macOS では Cmd キーを押しながらクリック) すると、ビューが逆アセンブリ ウィンドウの仮想アドレスにジャンプすることを示しています。

図 11. IPyIDA で変数またはアドレスを Ctrl キーを押しながらクリックすると、IDA の逆アセンブリ ウィンドウのアドレスにジャンプする

図 12 は、非 ASCII コンテンツを含むバイト配列の 16 進ダンプを示しています。

図 12. IPyIDA が 16 進ダンプを表示

IDA Pro を初めて使用する場合、IPyIDA は IDA API に慣れるのに非常に役立ちます。 あなたがベテランであれば、IPyIDA は Python スクリプト作成をはるかに簡単にするので、リバース エンジニアリングに費やす時間はより集中的で実り多いものになるでしょう。

Leave a Comment

Your email address will not be published. Required fields are marked *