Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
ghidra_kernelcache — iOS kernelcache リバースエンジニアリングのための Ghidra フレームワーク | Kitploit
ツール/GitHubGitHub/0x36/ghidra_kernelcache
iOSセキュリティリバースエンジニアリングバイナリ解析ファームウェア解析
GitHub0x36/ghidra_kernelcache

ghidra_kernelcache

iOS kernelcache リバースエンジニアリングのための Ghidra フレームワーク

リポジトリを見る
37037164年前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

ghidra_kernelcache: リバースエンジニアリングのためのGhidra iOS kernelcacheフレームワーク

このフレームワークは、Kernelcacheのリバースエンジニアリングにおける私の経験の最終成果物です。私は通常、カーネルとその拡張機能を手動で監査して脆弱性を探し、リバースのプロセスを高速化するためにGhidraで本当に欲しかったもののほとんどを自動化してきました。これは効果的であり、多くの時間を節約することが証明されています。 このフレームワークはiOS 12/13/14/15およびmacOS 11/12(kernelcacheと単一のKEXTの両方)で動作し、自分の環境を準備する苦労なしにiOSカーネルの研究を始めたい人々を助ける目的で公開されました。 私の考えでは、このフレームワーク(提供するツールセットとIOKitの基本的な知識があれば)は、Kernelcacheへのハッキングを開始するのに十分です。

このフレームワークは完全にPythonで書かれており、拡張して他のツールを構築することもできます。ほとんどすべてのプロジェクトで使用でき、冗長なマニュアルを読む時間を節約する基本的なAPIを提供しています。コア機能については、utils/ ディレクトリを自由に参照してください。

GhidraはKernelcacheの解析に優れていますが、他のリバースエンジニアリングツールと同様に手作業が必要です。ghidra_kernelcacheは、開始時やリバースエンジニアリング中に問題を修正するための良いエントリポイントを提供し、その結果、見栄えの良いデコンパイラ出力を提供します。

IDAProで@_bazadによって作成されたida_kernelcacheという類似のプロジェクトがあります。これはIDAでカーネルイメージを扱いたい研究者に良いエントリポイントを提供します。私のフレームワークはBrandonの作品と少し似ていますが、kernelcacheを扱うプロセスをより快適にするためにさらに多くの機能を提供しています。

機能 :

  • *OS kernelcache シンボリケーション。
  • C++ クラス階層の再構築と仮想テーブル。
  • 仮想メソッド呼び出しの参照。
  • ::externalMethod() と ::getTargetAndMethodForIndex() の両方の外部メソッドのディスパッチテーブルを自動修正。
  • クラスメソッドへの名前空間の適用。
  • 関数の引数に対するシンボル名と型の伝播。
  • 既知のカーネル関数に対する関数シグネチャの適用。
  • 古いプロジェクトから新しいプロジェクトへの古い構造体とクラスのインポート。

これらの機能は、キーボードショートカットまたはツールバーのアイコンをクリックして実行できる個別のツールとして作成されています。

インストール

リポジトリをクローンする :```sh git clone https://github.com/0x36/ghidra_kernelcache.git

**重要な注意**: 本プロジェクトは Ghidra 10.1_PUBLIC および 10.2_DEV でテストされており、下位互換性はありません。

*`Windows → Script Manager`* に移動し、 *`script Directory`* をクリックして、ディレクトリパスリストに *`ghidra_kernelcache`* を追加します。
*`Windows → Script Manager`* に移動し、*scripts* リスト内で *`iOS→kernel`* カテゴリを探し、そこにあるプラグインをチェックすると、それらが GHIDRA ツールバーに表示されます。

[logos/](https://github.com/0x36/ghidra_kernelcache/tree/master/logos) ディレクトリには、各ツール用の独自のロゴを配置できます。

## iOS カーネルキャッシュのシンボリケーション

`ghidra_kernelcache` は最初の段階で [iometa](https://github.com/Siguza/iometa/) ([@s1guza](https://twitter.com/s1guza) 作) を必要とします。これはカーネルバイナリ内の C++ クラス情報を提供する強力なツールです。素晴らしい点は、スタンドアロンバイナリとして動作するため、出力を解析するだけでお気に入りの RE フレームワークにインポートできることです。私のフレームワークは iometa の出力を受け取り、解析してシンボリケーションと仮想テーブルの修正を行います。

### 使用方法
カーネルを展開した後、次のコマンドを実行します:```sh
$ iometa -n -A /tmp/kernel A10-legacy.txt > /tmp/kernel.txt
# if you want also to symbolicate using jtool2
$ jtool2 --analyze /tmp/kernel

Ghidra でカーネルキャッシュをロードします。バッチインポートは使用しないでください。Mach-O イメージとしてロードしてください。 カーネルキャッシュがロードされ、自動解析が完了したら、ツールバーに表示されているアイコンをクリックするか、Meta-Shift-K を押して、iometa の出力のフルパス(この例では /tmp/kernel.txt)を入力します。

jtool2 シンボルを使用したい場合は、iOS→kernel カテゴリにある jsymbol.py も使用できます。

iOS kernelcache API

完全な API の例は ghidra_kernelcache/kc.py にあります。

→ ここではクラスオブジェクトを操作する例をいくつか示します:```py from utils.helpers import * from utils.class import * from utils.iometa import ParseIOMeta

ff = "/Users/mg/ghidra_ios/kernel.txt" iom = ParseIOMeta(ff) Obj = iom.getObjects() kc = kernelCache(Obj)

symbolicate the kernel

kc.process_all_classes()

symbolicate the classes under com.apple.iokit.IOSurface bundle

kc.process_classes_for_bundle("com.apple.iokit.IOSurface")

symbolicate the classes under kernel bundle

kc.process_classes_for_bundle("kernel")

Process one class (including its parents)

kc.process_class("IOGraphicsAccelerator2")

Clears the content of the class structures (vtables are excluded)

kc.clear_class_structures()

Overwrite the old vtable structure definition and resymbolicate it again

kc.update_classes_vtable()

Reconstructing function call trees by enumerating all pac references and find their corresponding virtual method call

kc.explore_pac()

ご覧のとおり、kernelcache を完全または部分的にシンボル化できます。部分的なシンボル化を選択した場合、`ghidra_kernelcache` は自動的にすべてのクラス依存関係を構築してから処理を進めます。スクリプトを kernelcache 全体に対して実行すると(完全なシンボル化)、`ghidra_kernelcache` はカーネルイメージの分析に数分かかります。

完了すると、Ghidra は以下を提供します:

→ ブックマークフィルターに「iOS」という新しいカテゴリが追加されました:

<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image1.png" alt="image1" width="200"/>
                    
                    
→ IOKit クラスの仮想テーブルが「iOS」ブックマークに追加され、仮想テーブルのルックアップがより良く高速になります。検索バーに文字、単語、または kext バンドルを入力して kext やクラスを検索するだけで済みます。

<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image2.png" alt="image2"/>


→ 仮想テーブルの修正:未知のコードを逆アセンブル/コンパイルし、名前空間を修正し、クラスメソッドを再シンボル化し、各メソッドに関数定義を適用します:

<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image3.png" alt="image3"/>

→ クラス名前空間の作成と、各メソッドをそれぞれ対応する名前空間に配置:

<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image4.png" alt="image4"/>

→ クラス階層を尊重したクラス構造の作成:

<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image5.png" alt="image5"/>

→ クラス vtable の作成。各メソッドは独自のメソッド定義を持ち、逆コンパイル出力が向上します:

<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image6.png" alt="image6"/>

完全な実装は [`utils/class.py`](https://github.com/0x36/ghidra_kernelcache/blob/master/utils/class.py) にあります。

以下は、`ghidra_kernelcache` を使用したシンボル化前後のスクリーンショットです:

<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image7.png" alt="image7"/>

<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image8.png" alt="image8"/>




## macOS Kext のシンボル化
---
`ghidra_kernelcache` の macOS サポートは、ARM64e および x86_64 アーキテクチャ向けの kernelcache と単一 KEXT のシンボル化の両方に対応しています。
**重要:** 本稿執筆時点では、Ghidra は macOS の kernelcache 全体を解析できませんが、IDA にロードして初期分析を行い、その後データベース(idb から xml)を Ghidra にインポートすることが可能ですが、これは範囲外です。もしそれができた場合、`ghidra_kernelcache` が残りの処理を行います。

macOS カーネル拡張機能をシンボル化する前に、いくつかの手順を踏む必要があります。`ghidra_kernelcache` の主な目的は、クラス階層を再構築し、すべてのクラス構造を単一のデータベースに管理することであり、カーネル拡張機能だけではこれらの要件を満たしていないからです。つまり、単一の KEXT のシンボル化には、カーネルおよび依存する他のカーネル拡張機能のシンボル化が必要となるため、ここでは追加の作業が必要です。
`ghidra_kernelcache` は現在、Ghidra の強力な *DataType Project Archive* を介してクラス構造と仮想メソッド定義を管理・共有することにより、カーネルを含むカーネル拡張機能をシンボル化する強力な方法を提供しています。

### カーネル拡張機能をシンボル化する手順
- Ghidra プロジェクトに新しいフォルダを作成し、` /System/Library/Kernels/kernel.release.XXXXX` をそのフォルダにロードして、Ghidra に分析させます。
- 新しい *Project Archive* を作成します: `DataType Provider` に移動 → ウィンドウ右上の矢印をクリック → `New Project Archive` → 新しく作成したフォルダ内に配置 → 適当な名前を付けます (例: macOS_12.1)。
- 次に、`ghidra_kernelcache` を使用してカーネルをシンボル化します。このプロセスは iOS *kernelcache* のシンボル化と非常に似ています。```bash
$ iometa -n -A /System/Library/Kernels/kernel.release.t8101 > /tmp/kernel.txt
  • Pythonコンソールで、または完全なスクリプト実装をKM.pyスクリプトで見つけることができます :```py

from utils.helpers import * from utils.kext import * iom = ParseIOMeta("/tmp/kernel.txt") Obj = iom.getObjects() kc = Kext(Obj,shared_p="macOS_12.1") kc.process_kernel_kext()

- 完了すると、カーネルのアーカイブと`macOS_12.1`アーカイブの間にデータベース関連付けが作成されます。次に、`kernel.release.t8001`を右クリック → `Commit DataTypes To` → `macOS_12.1`を選択します。
- そして`Right Click` →`Select All` → `Commit`を選択します。
- プロジェクトアーカイブを保存します:`Right click` → `Save Archive`。

これで、すべてのカーネル拡張機能間で共有可能なプロジェクトアーカイブが作成されました。
例として、Apple Silicon用の`IOSurface` Kextを見てみましょう:```bash
$ lipo /System/Library/Extensions/IOSurface.kext/Contents/MacOS/IOSurface -thin arm64e -output /tmp/iosurface.arm64e
$ iometa -n -A /tmp/iosurface.arm64e > /tmp/iosurface.txt
  • カーネルデータベースとプロジェクトアーカイブが配置されている同じフォルダパスにKextをロードし、Ghidraに解析を完了させます。
  • 以前に作成したプロジェクトアーカイブmacOS_12.1をロードします:データ型マネージャ → プロジェクトアーカイブを開く に進み、macOS_12.1を選択します。
  • 以下のメソッドを実行します。完全なスクリプトはKM.pyにあります:```python from utils.helpers import * from utils.kext import *

kc = Kext(Obj,shared_p="macOS_12.1")

This method fixes LC_DYLD_CHAINED_FIXUPS for M1 Kernel extension

kc.depac()

This method reconstructs class hierarchy and builds virtual table for each class

kc.process_kernel_kext()

ツールをダウンロード