ghidra
フレームワークNationalSecurityAgency/ghidra
Ghidra は、コンパイルされたコードを分析するためのソフトウェアリバースエンジニアリングフレームワークです。
概要
Ghidra は米国家安全保障局によって開発されたソフトウェアリバースエンジニアリングフレームワークであり、逆アセンブル、逆コンパイル、グラフィカル分析、スクリプト機能を備え、多様なプロセッサアーキテクチャと実行可能ファイル形式をサポートし、Java または Python によって拡張することができます。
README プレビュー
\n\n# Ghidra Software Reverse Engineering Framework\nGhidra is a software reverse engineering (SRE) framework created and maintained by the \n[National Security Agency][nsa] Research Directorate. This framework includes a suite of \nfull-featured, high-end software analysis tools that enable users to analyze compiled code on a \nvariety of platforms including Windows, macOS, and Linux. Capabilities include disassembly, \nassembly, decompilation, graphing, and scripting, along with hundreds of other features. Ghidra \nsupports a wide variety of processor instruction sets and executable formats and can be run in both \nuser-interactive and automated modes. Users may also develop their own Ghidra extension components \nand/or scripts using Java or Python.\n\nIn support of NSA's Cybersecurity mission, Ghidra was built to solve scaling and teaming problems \non complex SRE efforts, and to provide a customizable and extensible SRE research platform. NSA has \napplied Ghidra SRE capabilities to a variety of problems that involve analyzing malicious code and \ngenerating deep insights for SRE analysts who seek a better understanding of potential \nvulnerabilities in networks and systems.\n\nIf you are a U.S. citizen interested in projects like this, to develop Ghidra and other \ncybersecurity tools for NSA to help protect our nation and its allies, consider applying for a \n[career with us][career].\n\n## Security Warning\n**WARNING:** There are known security vulnerabilities within certain versions of Ghidra. Before \nproceeding, please read through Ghidra's [Security Advisories][security] for a better understanding \nof how you might be impacted.\n\n## Install\nTo install an official pre-built multi-platform Ghidra release: \n* Install [JDK 21 64-bit][jdk]\n* Download a Ghidra [release file][releases]\n - **NOTE:** The official multi-platform release file is named \n `ghidra___.zip` which can be found under the "Assets" drop-down.\n Downloading either of the file
FAQ (5)
トラブル対応Ghidraがオペコード`8E D8`に対して`MOV DS, AX`ではなく`MOV AX, DS`と表示する問題を修正する方法
これは、コミット GP-7018 に起因する Ghidra 12.1.3 および 12.1.4 におけるリグレッションです。x86 SLEIGH 仕様では、MOV オペコード 0x8e に対してセグメントレジスタと汎用レジスタが誤った順序で表示されます。
ローカルで修正するには、Ghidra/Processors/x86/data/languages/ia.sinc を編集し、該当するコンストラクタ名を次の記述から:
:MOV Rmr16,Sreg ... { Sreg = Rmr16; }
:MOV Rmr32,Sreg ... { Sreg = Rmr32(0); }
:MOV Rmr64,Sreg ... { Sreg = Rmr64(0); }
次のように変更します:
:MOV Sreg,Rmr16 ... { Sreg = Rmr16; }
:MOV Sreg,Rmr32 ... { Sreg = Rmr32(0); }
:MOV Sreg,Rmr64 ... { Sreg = Rmr64(0); }
変更されるのは表示されるオペランドの順序のみで、セマンティックアクションは Sreg = ... のままにする必要があります。
次に、Ghidra のインストールルートから x86 SLEIGH バイナリを再ビルドします:
support/sleigh -a Ghidra/Processors/x86
Ghidra を再起動してプログラムを開き直してください。バイト列 8e d8 の命令は、正しく MOV DS,AX として逆アセンブルされるはずです。この修正は PR #9637 で提出されているため、その修正を含むリリースへアップグレードすることが恒久的な解決策となります。
トラブル対応命令に8つを超えるオペランドがある場合の Sleigh デコンパイラのエラー "Index 8 out of bounds for length 8" の修正方法
Ghidra 11.0 以降にアップグレードしてください。このリリースにはコミット 0e9c36b513c4d744fe6c6f7559c049ce1d65266f が含まれており、Sleigh/Pcode オペランドの最大数が従来の上限である 8 を超えて拡張されています。古いバージョンの Ghidra を使用しなければならない場合は、回避策として疑似オペコードの定義のオペランド数を最大 8 個に減らしてください。
トラブル対応Ghidra デコンパイラのエラー「Low-level Error: Forced merge caused intersection」が 16 バイトの RDX:RAX 戻り値で発生する場合、どのように修正すればよいですか?
これは Ghidra 12.1.2 において、被呼び出し側関数がデフォルトの void シグネチャを持ちながら、実際には RDX:RAX に16バイトの値を返し、呼び出し側がその値を1つの条件パスでのみアドレスに紐付けられたスタックスロットに格納する場合に発生します。デコンパイラはそのスタックスロットを呼び出しの出力として再利用し、既存の INDIRECT varnode と競合します。
恒久対応: GP-7136 を含むビルド(コミット bb33bad196、master で修正済み)にアップグレードしてください。この問題が報告された時点では、この修正は 12.1.2~12.1.4 および 12.2 ブランチには含まれていませんでした。
影響を受けるバージョンでの回避策:
1. ret_pair などの被呼び出し側関数を開きます。
2. その関数シグネチャ/戻り値の型を編集します。
3. ロックされた16バイトの構造体の戻り値型を定義して割り当てます。例:
struct Pair16 {
undefined8 a;
undefined8 b;
};4. 呼び出し規約を
__stdcall に設定し、シグネチャを適用します。5. 呼び出し側を Decompiler で開き直します。
戻り値が不要な場合は、被呼び出し側の戻り値の型を void に変更してもクラッシュを回避できます。呼び出し箇所のみで "Override Signature" により void(void) に変更する方法では不十分です。
トラブル対応6809 や H8/300H などのビッグエンディアンターゲットで、Ghidra デコンパイラが 'Removing unreachable block' というメッセージとともに到達可能なコードを誤って削除してしまう問題を修正するにはどうすればよいですか?
これは Ghidra 12.1.2 のビッグエンディアン splitflow バグです。レジスタが 6809 の D(A/B)のように独立して使用される 2 つの半分に分割される場合、デコンパイラが各ピースの consume マスクを入れ替えてしまうことがあります。その結果、生存しているピースが未使用として扱われ、ゼロに置き換えられ、その分岐が畳み込まれ、到達可能なコードが削除されます。
一時的な回避策:デコンパイラの splitflow 単純化ルールを無効にして、再デコンパイルしてください。警告が消え、生存しているレジスタの半分と条件付きコードが復元されるはずです。
恒久的な修正:PR「Preserve consume masks for big-endian register splits.」を適用してください。TransformVar::createReplacement() では、変換済みのビッグエンディアン・ストレージオフセットは置き換え varnode のアドレスを構築する際にのみ使用し続け、元の論理/有意性オフセットを transferVarnodeProperties() に渡してください。その後、ネイティブデコンパイラをリビルドするか、その修正を含む Ghidra リリースにアップグレードしてください。
生存している半分が変数のまま残っていること、データ依存の分岐が保持されていること、ループ後の STA ストアのようなコードが到達不能として報告されなくなったことを確認して、結果を検証してください。
トラブル対応なぜGhidraのエラーダイアログは '<' 文字を隠し、スタックトレースとは異なるテキストを表示するのですか?
Ghidra 9.1 では、展開可能なエラーダイアログが、プレーンテキストのメッセージを事前にエスケープすることなく HTML としてレンダリングします。ErrLogExpandableDialog.getHTML() は、ダイアログのメッセージと各 Throwable.getMessage() を addHTMLContent() を介して挿入しますが、addBR() は改行を <br> に変換するだけです。そのため、<= 64 のようなテキストが HTML タグとして解釈され、レンダリングされたダイアログから消えてしまう可能性があります。基となるメッセージ自体は、スタックトレースやログの中では正しいままです: Bit length must be >= 1 and <= 64
回避策: レンダリングされたダイアログのメッセージに依存するのではなく、完全なスタックトレース/ログをコピーまたは参照してください。
恒久対策: すべてのプレーンテキストメッセージをダイアログに挿入する前に HTML エスケープし、その後で改行を <br> に変換します:
private static String escapePlainText(String s) {
return s.replace("&", "&")
.replace("<", "<")
.replace(">", ">");
}
この処理を ErrLogExpandableDialog.getHTML() 内のメインメッセージと Throwable.getMessage() の両方に適用し、Ghidra をリビルドするか、「Escape plain-text messages in the expandable error dialog」というタイトルの修正を含むビルドを使用してください。