
IDA Pro用対話型バイナリパッチプラグイン

既存のプログラムの動作を変更するためにアセンブリコードにパッチを当てることは、マルウェア解析、ソフトウェアリバースエンジニアリング、およびセキュリティ研究の広範な分野では珍しくありません。このプロジェクトは、人気のIDA Pro 逆アセンブラを拡張し、迅速な反復作業のために設計されたより堅牢なインタラクティブバイナリパッチングワークフローを作成します。
このプロジェクトは現在、広く利用されているKeystone Engineのマイナーなフォークを利用しており、x86/x64およびArm/Arm64のパッチングをサポートし、将来のリリースで残りのKeystoneアーキテクチャを有効にする予定です。
このプラグインの開発を支援してくださったHex-Raysに特別な感謝を捧げます。
このプラグインにはIDA 7.6とPython 3が必要です。Windows、Linux、macOSをサポートしています。
注意:古いバージョンのIDA(8.2以下)はPython 3.11以降と互換性がありません。
次の行をIDAコンソールで実行して、プラグインを自動的にインストールします。
import urllib.request as r; exec(r.urlopen('https://github.com/gaasedelen/patching/raw/main/install.py').read())
import urllib.request as r; exec(r.urlopen('https://github.com/gaasedelen/patching/raw/main/install.py', cafile='/etc/ssl/cert.pem').read())
あるいは、リリースページからお使いのプラットフォーム用の配布可能なプラグインパッケージをダウンロードし、プラグインフォルダに解凍することで手動でインストールすることもできます。
このプラグインはIDAのユーザープラグインディレクトリにインストールすることを__強く__お勧めします。
import ida_diskio, os; print(os.path.join(ida_diskio.get_user_idadir(), "plugins"))
パッチプラグインは、サポートされているアーキテクチャ(x86/x64/Arm/Arm64)で自動的にロードされ、IDA逆アセンブリビューの右クリックコンテキストメニューに関連するパッチアクションを注入します。

コンテキストパッチアクションの完全な一覧は、以下のセクションで説明します。
メインのパッチダイアログは、右クリックコンテキストメニューの「Assemble」アクションから起動できます。これは、1つまたは複数の命令を連続して編集するために使用できる基本的なIDA逆アセンブリビューをシミュレートします。

アセンブリ行は、命令をリアルタイムで変更するために使用できる編集可能なフィールドです。Enterキーを押すと、入力された命令がデータベースにコミット(パッチ)されます。
現在の位置(カーソル)は常に緑色でハイライトされます。パッチ/編集の結果として上書きされる命令は、パッチをコミットする前に赤色でハイライトされます。

最後に、編集可能なアセンブリテキストフィールドにフォーカスがある状態でUPキーとDOWNキーを使用すると、マウスを使わずに逆アセンブリビューの上下にカーソルをすばやく移動できます。
最も一般的なパッチアクションは、1つ以上の命令をNOPに置き換えることです。このため、NOPアクションは常に右クリックメニューに表示され、すばやくアクセスできます。

個々の命令、および選択した範囲の命令をNOPにすることができます。
条件付きジャンプを常に「良い」パスを実行するように強制することも、もう1つの一般的なパッチアクションです。このプラグインは、条件付きジャンプ命令を右クリックした場合にのみ、このアクションを表示します。

条件付きジャンプを絶対に実行させたくない場合は、代わりにNOPにすることもできます。
パッチは、いつでもパッチサブメニューから選択した実行可能ファイルに保存(適用)できます。クイック適用アクションを使用すると、同じ設定で後続のパッチをさらに速く保存できます。

また、プラグインは元の実行可能ファイルのバックアップ (.bak) を保持するよう積極的に努め、保存時にデータベースの現在のパッチセットを「クリーンに」適用するために使用します。
最後に、パッチに満足できない場合は、パッチが適用された(黄色の)命令ブロックを右クリックするだけで、元の値に戻すことができます。

バイトを元の値に戻すのは「簡単」ですが、解析を以前の状態に復元するのは「難しい」場合があります。パッチを元に戻すには、場合によっては追加の手動修正が必要になることがあります。
cpp::like::symbols(...) / IDB に対する「より良い」動作を定義(現状非常に不安定)時間とやる気があれば、今後の作業には以下が含まれる可能性があります。
xor eax, eax; ret;)Pretty: mov [rsp+48h+dwCreationDisposition], 3
Raw: mov [rsp+20h], 3
外部からのコントリビューション、問題報告、機能要望を歓迎します。プルリクエストは、将来のリリースで検討されるように、このリポジトリのdevelopブランチに送ってください。