Ghidraドキュメント「Developer's Guide」の日本語訳です。
2021-04-17更新版の訳です。
もくじ
References
依存関係のカタログ
Catalog of Dependencies
以下は、順不同の依存関係のリストです。このガイドには、関連した手順で、これらの多くを取得するための説明が含まれています。あなたは、構築する、あるいは、開発する部分に応じて、これらすべてが必要でない場合があります。
少なくとも、次のすべてが必要になります。
- Java JDK 11 (64-bit)-JDK 11の無料のロング・ターム・サポート(LTS)バージョンは、以下によって提供されます。:
- Gradle 5.0以降-私たちは、バージョン5.0を使用し、最高6.8.3.でテストします。
- C/C++コンパイラ - 私たちは、LinuxではGCC、macOSではXcode(Clang)、WindowsではVisual Studio(2017以降)を使用しています。
開発のためのオプション
- Eclipse - JDK 11をサポートする必要があります。Eclipse 2018-12以降が機能するはずです。他のIDEも機能する可能性がありますが、私たちは、テストを行っていません。
ghidraリポジトリの「zipスナップショットをダウンロードする」が使用されていない限り必要です。
- Git-私たちは、Windowsの公式インストーラを使用します。Windowsのために、あなたは、(WSL - LinuxのためのWindowsサブシステム)を持つ、githubのCLIやGitを使用もできます。ほとんどのLinuxディストリビューションは、それらのリポジトリに、Gitを持っています。Xcodeは、macOSで、Gitを提供します。あなたが、ghidraリポジトリの.zipファイルをダウンロードする場合、あなたは、Gitをスキップすることができます。
手動ダウンロードの指示に従わない限り、オプション
- Bashは、LinuxとmacOSでは、議論の余地があります。Windowでは、私たちは、MinGWを使用します。これは、Window用のGitで、配布されるかもしれません。自動ビルドを使用している場合、これはスキップできます。
Ghidraの開発とビルドに必要です。これら、および、その他は、自動、あるいは、手動の指示中にダウンロードされます。
- dex2jar. 私たちは、バージョン2.0を使用します。
- AXMLPrinter2
- HFS Explorer. 私たちは、バージョン0.21を使用します。
- さらに、もう一つのJavaサービス・ラッパ。私たちは、Ghidraパッケージをビルドするためだけに、バージョン12.12を使用します。
- Eclipse PDE - GhidraDevプラグインを開発するための環境。
- Eclipse CDT. 私たちは、バージョン8.6.0に対して、ビルドします。-GhidraDevプラグインの依存関係を構築します。
- PyDev. 私たちは、バージョン6.3.1に対して、ビルドします。-GhidraDevプラグインの依存関係を構築します。
開発環境を、構築、および/または、設定するとき、Gradleによって、自動的に、Maven CentralとBintray JCenterからダウンロードされるものは他にもたくさんあります。あなたが、これらのオフラインを必要とする場合、理にかなった一連の行動は、開発環境をオンラインで設定することであり、おそらく、構造を実行し、続いて、Gradleのキャッシュをスクレイプします。
開発とビルドツールをインストールする
Install Development and Build Tools
あなたが、Windowsを使用している場合、あなたが、ghidraリポジトリの.zipクローンをダウンロードしない限り、Gitをインストールします。あなたが、手動ルートを使用する場合、Bashで、以下に示すコマンドの多くを、実行する必要があります。(LinuxのためのWindowsサブシステム(WSL)、あるいは、MinGWのためのgit-bashやMSYSを使用する)。
OpenJDK 11をインストールし、それが、デフォルトのJavaであることを確認してください。
Eclipseをインストールします。あなたは、どんな、JRE/JDKでも、Eclipseを起動することができますが、あなたは、Eclipseが、JDK11のインストールを認識していることを確認する必要があります。Eclipseでは、[ウィンドウ]-> [設定]([Eclipse]-> [macOSの設定])を選択し、[Java]-> [インストール済みJRE]に移動して、JDK11が構成されていることを確認します。
Gradleをインストールし、あなたのPATHに、追加し、JDK 11を使用して、起動されていることを確認してください。
ソース・リポジトリの設定
Setup Source Repository
あなたは、作業用コピーのために、どんなディレクトリでも選択する場合があります。しかしながら、これらの説明は、あなたが、~/git/ghidraに、ソースのクローンをつくったと仮定します。提案と異なる場合、選択した作業ディレクトリに、一致するようにコマンドを調整してください。:
mkdir ~/git
cd ~/git
git clone git@github.com:NationalSecurityAgency/ghidra.git
あるいは、ghidraリポジトリのスナップ撮影された.zipを解凍します。
ビルド依存関係リポジトリの設定
Setup Build Dependency Repository
可能な場合、Ghidraの構造は、Maven CentralとBintray JCenterで利用できるように、名前を付けられアーティファクトを使用します。残念ながら、場合によっては、アーティファクトや希望する特定のバージョンは、利用できません。そのため、mavenCentralとjcenterに加えて、手作業でダウンロードされた依存関係のために、あなたは、平らなディレクトリ・スタイルのリポジトリーを設定する必要があります。
平らなディレクトリ・スタイルのリポジトリーを、作成することができ、自動的に提供されたスクリプトによって、あるいは、手作業で、必要な依存関係をダウンロードすることによって、データを読み込むことができます。2つの次のメソッドの1つを選択します。:
自動スクリプトの説明
Automatic Script Instructions
平らなディレクトリ・スタイルのリポジトリは、単純なGradleスクリプトを実行することで自動的に設定できます。~/git/ghidraに移動して、以下を実行します:
gradle -I gradle/support/fetchDependencies.gradle init
実行されるGradle作業、この場合、init、は、重要ではありません。重要なのは、Gradleに、fetchDependencies.gradleスクリプトを実行させることです。それが、正しく実行される場合、あなたは、次のファイルが入力された、新しい~/git/ghidra/dependencies/ディレクトリを持っています。:
- flatRepo/AXMLPrinter2.jar
- flatRepo/csframework.jar
- flatRepo/dex-ir-2.0.jar
- flatRepo/dex-reader-2.0.jar
- flatRepo/dex-reader-api-2.0.jar
- flatRepo/dex-tools-2.0.jar
- flatRepo/dex-translator-2.0.jar
- flatRepo/dex-writer-2.0.jar
- flatRepo/hfsx.jar
- flatRepo/hfsx_dmglib.jar
- flatRepo/iharder-base64.jar
- cdt-8.6.0.zip
- PyDev 6.3.1.zip
- yajsw-stable-12.12.zip
- fidb/*.fidb
あなたが、これらを見たら、おめでとうございます!構築、あるいは、開発にスキップします。そうではない場合、以下の手動ダウンロード手順に進んでください...
手動ダウンロードの説明
Manual Download Instructions
手作業でダウンロードされた依存関係を格納するために、~/git/ghidra/dependencies/ディレクトリと必要なサブディレクトリを作成します。:
mkdir ~/git/ghidra/dependencies
mkdir ~/git/ghidra/dependencies/flatRepo
mkdir ~/git/ghidra/dependencies/fidb
mkdir ~/git/ghidra/dependencies/GhidraServer
mkdir ~/git/ghidra/dependencies/GhidraDev
FileFormatsの依存関係を取得します。:
GitHubのdex2jarプロジェクトのリリースページから、dex-tools-2.0.zipをダウンロードします。libディレクトリから、~/git/ghidra/dependencies/flatRepoまでdex-*.jarファイルを解凍します:
cd ~/Downloads # Or wherever
curl -OL https://github.com/pxb1988/dex2jar/releases/download/2.0/dex-tools-2.0.zip
unzip dex-tools-2.0.zip
cp dex2jar-2.0/lib/dex-*.jar ~/git/ghidra/dependencies/flatRepo/
code.google.comの"android4me"アーカイブから、AXMLPrinter2.jarをダウンロードします。 ~/git/ghidra/dependencies/flatRepoに、それを配置します。:
cd ~/git/ghidra/dependencies/flatRepo
curl -OL https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/android4me/AXMLPrinter2.jar
DMGの依存関係を取得します。:
Get Dependencies for DMG:
www.catacombae.orgからhfsexplorer-0_21-bin.zipをダウンロードします。http://www.catacombae.org/ libディレクトリを ~/git/ghidra/dependencies/flatRepoに解凍します。:
cd ~/Downloads # Or wherever
curl -OL https://sourceforge.net/projects/catacombae/files/HFSExplorer/0.21/hfsexplorer-0_21-bin.zip
mkdir hfsx
cd hfsx
unzip ../hfsexplorer-0_21-bin.zip
cd lib
cp csframework.jar hfsx_dmglib.jar hfsx.jar iharder-base64.jar ~/git/ghidra/dependencies/flatRepo/
GhidraServerのために依存関係を取得します。
Get Dependencies for GhidraServer
GhidraServerをビルドするには、「さらにもう一つのJavaサービス・ラッパ」(yajsw)バージョン12.12が必要です。www.sourceforge.netのプロジェクトから、yajsw-stable-12.12.zipを~/git/ghidra/dependencies/GhidraServer/にダウンロードし、以下に配置します。:
cd ~/Downloads # Or wherever
curl -OL https://sourceforge.net/projects/yajsw/files/yajsw/yajsw-stable-12.12/yajsw-stable-12.12.zip
cp ~/Downloads/yajsw-stable-12.12.zip ~/git/ghidra/dependencies/GhidraServer/
GhidraDevのために依存関係を取得します。
Get Dependencies for GhidraDev
Eclipse用のGhidraDevプラグインをビルドするには、Eclipse用のCDTおよびPyDevプラグインが必要です。Eclipse Foundationから、cdt-8.6.0.zipをダウンロードし、次の場所に配置します。: ~/git/ghidra/dependencies/GhidraDev/:
cd ~/Downloads # Or wherever
curl -OL 'https://archive.eclipse.org/tools/cdt/releases/8.6/cdt-8.6.0.zip'
curl -o 'cdt-8.6.0.zip.sha512' -L --retry 3 'https://www.eclipse.org/downloads/sums.php?type=sha512&file=/tools/cdt/releases/8.6/cdt-8.6.0.zip'
shasum -a 512 -c 'cdt-8.6.0.zip.sha512'
cp ~/Downloads/cdt-8.6.0.zip ~/git/ghidra/dependencies/GhidraDev/
www.pydev.orgから、PyDev 6.3.1.zipをダウンロードします。そして、同じディレクトリに、それを配置します。:
cd ~/Downloads # Or wherever
curl -L -o 'PyDev 6.3.1.zip' https://sourceforge.net/projects/pydev/files/pydev/PyDev%206.3.1/PyDev%206.3.1.zip
cp ~/Downloads/'PyDev 6.3.1.zip' ~/git/ghidra/dependencies/GhidraDev/
Ghidra関数IDデータセットを取得する
Get Ghidra Function ID datasets
ghidra-data GitHubリポジトリから、Ghidra関数のIDデータセット・ファイルをダウンロードし、それらを、~/git/ghidra/dependencies/fidbに配置します。:
cd ~/Downloads # Or wherever
curl -L -o 'vs2012_x64.fidb' https://github.com/NationalSecurityAgency/ghidra-data/raw/master/FunctionID/vs2012_x64.fidb
curl -L -o 'vs2012_x86.fidb' https://github.com/NationalSecurityAgency/ghidra-data/raw/master/FunctionID/vs2012_x86.fidb
curl -L -o 'vs2015_x64.fidb' https://github.com/NationalSecurityAgency/ghidra-data/raw/master/FunctionID/vs2015_x64.fidb
curl -L -o 'vs2015_x86.fidb' https://github.com/NationalSecurityAgency/ghidra-data/raw/master/FunctionID/vs2015_x86.fidb
curl -L -o 'vs2017_x64.fidb' https://github.com/NationalSecurityAgency/ghidra-data/raw/master/FunctionID/vs2017_x64.fidb
curl -L -o 'vs2017_x86.fidb' https://github.com/NationalSecurityAgency/ghidra-data/raw/master/FunctionID/vs2017_x86.fidb
curl -L -o 'vs2019_x64.fidb' https://github.com/NationalSecurityAgency/ghidra-data/raw/master/FunctionID/vs2019_x64.fidb
curl -L -o 'vs2019_x86.fidb' https://github.com/NationalSecurityAgency/ghidra-data/raw/master/FunctionID/vs2019_x86.fidb
curl -L -o 'vsOlder_x64.fidb' https://github.com/NationalSecurityAgency/ghidra-data/raw/master/FunctionID/vsOlder_x64.fidb
curl -L -o 'vsOlder_x86.fidb' https://github.com/NationalSecurityAgency/ghidra-data/raw/master/FunctionID/vsOlder_x86.fidb
cp ~/Downloads/*.fidb ~/git/ghidra/dependencies/fidb/
Ghidraを構築する
Building Ghidra
ビルドする前に、バージョンを更新して、名前を公開するといいかもしれません。これらのプロパティは、~/git/ghidra/Ghidra/application.propertiesに保持されています。
完全なパッケージをビルドするために、Gradleを使用します。:
gradle buildGhidra
出力は、~/git/ghidra/build/dist/に配置されます。それは、バージョン、リリース名、ビルド日、プラットフォームによって名前を付けられます。それをテストするために、あなたが好きな場所で、それを解凍し、./ghidraRunを実行します。
手作業で、前もってビルドしておかない限り、Eclipse GhidraDevプラグインは、構造に含まれていません。加えて、他のいくつかのサポートデータも欠落します。これらのコンポーネントの製造方法については、以下のセクションを参照してください。あなたは、以前の公式ディストリビューションから、これらの既にビルドされたコンポーネントの一部をコピーできる場合もあります。
Ghidraを開発する
Developing Ghidra
環境を準備する
Prepare the Environment
プロジェクト・ルートから、以下を実行します。:
gradle prepDev
prepDevタスクには、主に、いくつかのソースを生成する、私たちの組み込みのヘルプにインデックスを付け、いくつかの依存関係をアンパックすることが含まれています。
Eclipseプロジェクトをインポートする
Import Eclipse Projects
Ghidraを開発して/変更するために、あなたは、最初に、Eclipseプロジェクトを生成するために、Gradleを使用する必要があります。プロジェクト・ルートから:
gradle eclipse
[ファイル]-> [インポート]を選択し、[全般]を展開して、[既存のプロジェクトをワークスペースに]を選択します。ソースリポジトリのルートを選択し、[ネストされたプロジェクトの検索]を選択します。すべて選択し、終了します。以下で説明するように、環境が、適切に準備されるまで、ビルド・パス・エラーが、表示される場合があります。
ネイティブを構築する
Building the natives
Ghidraのコンポーネントの一部は、ネイティブ・プラットフォームのために構築されます。私たちは、現在、Linux、macOS、Windowsの64bitのx86システムをサポートしています。他の可能性もあるはずですが、テストは行っていません。
次に、Gradleを使用してビルドします。:
gradle buildNatives_linux64
gradle buildNatives_osx64
gradle buildNatives_win64
これにより、逆コンパイラ、GNUツールチェーンのデマングラ、そりコンパイラ、および(Windowsの場合のみ)PDBパーサが構築されます。
言語モジュールのプリコンパイル(オプション)
Pre-compile Language Modules (optional)
オプションとして、すべての言語モジュールをプレコンパイルするために、あなたは、実行もするかもしれません。:
gradle sleighCompile
言語モジュールが、プレコンパイルされていない場合、Ghidraは、必要に応じて、実行時に、それらをコンパイルします。
GhidraDevプロジェクトのインポートし、ビルドします。(オプション)
Import and Build GhidraDev project (optional)
GhidraDev Eclipseプラグインを開発することは、EclipseマーケットプレイスからインストールできるEclipse PDE(プラグイン開発環境)が必要です。それは、RCPとRAP開発者のためのEclipse IDEにも含まれています。GhidraDev Eclipseプロジェクトを生成するために、以下を実行します。:
gradle eclipse -PeclipsePDE
新しく生成されたGhidraDevプロジェクトをEclipseにインポートします。
PyDevとCDTに関連するコンパイル・エラーが発生した場合、[ターゲット・プラットフォーム]の下のEclipseの設定に移動します。/Eclipse GhidraDevPlugin/GhidraDev.targetをアクティブ化します。
GhidraDevプラグインを、どのように構築するかについての説明のための~/git/ghidra/GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevPlugin/build_README.txtを参照してください。
実行して、EclipseからGhidraをデバッグする
Run and Debug Ghidra from Eclipse
EclipseからGhidraを実行、あるいは、デバッグするために、(通常、"Run"や"Debug"ボタンの下にある)提供されている起動構成を使用します。ランチャーが表示されない場合、それは、おそらく、お気に入りとして、マークされていません。[実行]ボタンの横にあるドロップダウンをクリックして、[構成の実行]を選択します。続いて、左側の[Javaアプリケーション]を展開して、[Ghidra]ランチャーを見つけます。
テストの実行
Running tests
単体テストを実行するために、以下を実行します。
gradle unitTestReport
より複雑な統合テストを実行する場合、以下を実行します。
gradle integrationTest
単体テストと統合テストを実行するために、そして、使用するレポートを生成します。
gradle combinedTestReport
CIのビルド設定
Setup build in CI
Linux、CI環境、Docker内のヘッドレス・モードで、ビルドを実行する場合、テストを実行する前に、以下を実行します。
Xvfb :99 -nolisten tcp &
export DISPLAY=:99
これは、幸せなAWTを作成するために必要です。
サポートするデータを構築する
Building Supporting Data
Ghidraの一部の機能では、かなり大規模なデータベースのキュレーションが必要です。これらは、データ型アーカイブと関数IDのデータベースが含まれています。どちらも、関連するSDKとプラットフォームのヘッダーファイルとライブラリを収集する必要があります。この作業の多くは、手作業で、行われます。公式ビルドが含まれているアーカイブは、ghidra-dataリポジトリにあります。
データ型のアーカイブを構築する
Building Data Type Archives
このタスクは、多くの場合、Ghidra GUIから手作業で行われます。そして、私たちの公式ビルドに含まれるアーカイブは、かなりの微調整が必要です。CodeBrowserウィンドウから、[ファイル]-> [Cソースの解析]を選択します。ここから、ヘッダーとプリプロセッサーのオプションを一覧に示す解析プロファイルを作成および構成できます。続いて、データ型アーカイブを作成するために、[ファイルに解析]をクリックします。結果は、~/git/ghidra/Ghidra/Features/Base/data/typeinfoへコピーすることによって、インストール、あるいは、ソースのツリーに追加できます。
FIDデータベースを構築する
Building FID Databases
このタスクは、多くの場合、Ghidra GUIから手作業で行われます。そして、私たちの公式ビルドに含まれるアーカイブは、かなりの微調整が必要です。あなたは、最初に、関連したライブラリをインポートし、そこから、あなたが好きなFIDデータベースを作成する必要があります。これは、多くの場合、SDKからの一連のライブラリです。私たちは、公式ビルドには、さまざまなVisualStudioプラットフォームを同包しています。公式の.fidbファイルは、https://github.com/NationalSecurityAgency/ghidra-data/tree/master/FunctionIDのghidra-dataリポジトリ内で、見つけることができます。
CodeBrowserウィンドウから、[ファイル]->[構成]を選択します。[関数ID]プラグインを有効にし、ダイアログを閉じます。次に、CodeBrowserウィンドウから、[ツール]-> [関数ID]-> [新しい空のFidDbを作成]を選択します。宛先ファイルを選択します。次に、[ツール]-> [関数ID]-> [プログラムからFidDbにデータを入力]を選択します。オプションを適切に入力し、[OK]をクリックします。
あなたが、微調整の詳細が必要な場合、 ~/git/ghidra/Ghidra/Features/FunctionID/data/building_fid.txtをご覧ください。
デバッガーのハッキング
Hacking on the Debugger
デバッガーは、独自のユーティリティ、フレームワーク、機能のコレクションで構成される複数のモジュールで構成されています。壊すべき新しい境地は、たくさんあります。深く入り込む前に、私たちの専用のデバッガ開発者ガイドを参照してください。