Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
ida_kernelcache — iOSカーネルキャッシュを解析するためのIDA Toolkit | Kitploit
ツール/GitHubGitHub/bazad/ida_kernelcache
組み込みシステムセキュリティ静的分析iOSセキュリティ脆弱性分析リバースエンジニアリングデバッガモバイルセキュリティバイナリ解析ファームウェア解析
GitHubbazad/ida_kernelcache

ida_kernelcache

iOSカーネルキャッシュを解析するためのIDA Toolkit

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

人気

すべて見る →

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

すべてのツールを探索

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

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

ida_kernelcache: iOS kernelcache 解析のための IDA Toolkit

ida_kernelcache は、IDA Pro で iOS kernelcache を扱いやすくするための IDAPython モジュールです。 このモジュールは以下の機能を提供します:

  • iOS 12 の新しい静的タグ付きポインタを通常のカーネルポインタに変換します。
  • カーネルの __PRELINK_INFO セグメントを Python 辞書にパースします。
  • カーネル拡張名、Mach-O セグメント、Mach-O セクションに従って、IDA 内のセグメントをリネームします。
  • 一部のセグメント内の識別可能なポインタを IDA オフセットに変換します。
  • OSMetaClass 情報に基づいて C++ クラス階層を再構築します。
  • C++ 仮想メソッドテーブル(vtable 自体とそのメソッドの両方)をシンボル化します。
  • __got セクションのオフセットと __stubs セクションのスタブ関数をシンボル化します。
  • C++ 仮想メソッドテーブルを表す IDA struct を自動生成します。
  • 観測されたアクセスパターンに基づいて、kernelcache 内の C++ クラスを表す IDA struct を自動生成します。

メインの処理関数は、手動での解析やリバースエンジニアリングの前に実行するように設計されています。デフォルトの設定では、IDA は kernelcache 内の多くの有用な情報を見逃しがちです。これらのスクリプトは、kernelcache の既知の構造を活用して有用な情報を自動的に伝播することで、IDA を支援します。

モジュールの標準機能に加えて、ida_kernelcache には iOS kernelcache の解析を容易にするためのスクリプトがいくつか含まれています。たとえば、関数が使用する C struct を自動生成するスクリプトを使用できます。

ida_kernelcache で使用されているテクニックの多くは、memctl のために開発され、そこから直接借用されています。

バージョン

ida_kernelcache は、IDA Pro 6.95 で、iOS 10.1.1、11.0、11.2、11.3.1、12.0 beta の kernelcache に対してテストされています。現在、iOS 10 以降の Arm64 kernelcache のみがサポートされています。

はじめに

すでに IDA に解凍された kernelcache ファイルが読み込まれている必要があります。Apple のオンラインから特定の IPSW をダウンロードするための URL を見つけることができ、memctl を含む多くの公開ツールが kernelcache を解凍できます。

IDA で、メニューバーから "File" -> "Script file..." を選択し、メインディレクトリにある ida_kernelcache.py スクリプトを選択します。これにより、ida_kernelcache モジュールが ida_kernelcache および kc という名前で IDAPython インタプリタにロードされます。IDAPython プロンプトで kc.kernelcache_process() と入力し、Enter キーを押して kernelcache の解析を開始します。この関数は、ida_kernelcache がサポートする主要な解析をすべて実行します。IDA が新しい関数を識別して解析するため、この関数は数分間実行されます。

ida_kernelcache は、アドレスのユーザー名を上書きしないようにします。つまり、kernelcache_process による初期化の前に kernelcache が手動で解析されている場合、ユーザー指定の名前が自動的な名前伝搬をブロックする可能性があるため、結果が十分に得られない可能性があります。ただし、ida_kernelcache が以前の解析を台無しにしない保証もないため、すでに解析済みの kernelcache ファイルで kernelcache_process を実行する場合は、最初にバックアップを作成してください。

ida_kernelcache モジュール

ida_kernelcache は ida_kernelcache.py を介してロードされることを意図しています。ida_kernelcache ディレクトリ内のサブモジュールは直接ロードされることを意図していません。ただし、ida_kernelcache はこれらのサブモジュールの機能の多くを公開しています。以下にそれぞれの機能を示します:

  • ida_utilities: このモジュールは、IDA の関数の一部をラップして、より使いやすい API を提供します。特に便利なのは、is_mapped、read_word、read_struct、force_function、ReadWords です。is_mapped はアドレスがマッピングされているかどうか、またオプションで既知の値を含むかどうかをチェックします。read_word はアドレスから可変サイズのワードを読み取ります。read_struct は構造体型を Python 辞書または Python アクセサオブジェクトに読み取り、データ構造の解析をはるかに容易にします。force_function は、アドレスを IDA 内の関数の開始位置に変換するためのいくつかのトリックを試みます。ReadWords は、範囲内のデータワードとそのアドレスを反復処理するジェネレータです。

  • build_struct: この内部モジュールには、構造体への一連のアクセスに基づいて IDA struct を自動的に入力するためのユーティリティが含まれています。

  • class_struct: このモジュールは、C++ 仮想メソッドテーブルとクラスを表す IDA struct を生成する関数を提供します。initialize_vtable_structs は(シンボル化された)仮想メソッドテーブルをスキャンし、仮想メソッドポインタを保持する IDA struct を作成します。initialize_class_structs は仮想メソッドのデータフロー解析を実行して各クラスのフィールドへのアクセスを特定し、クラスを表す IDA struct を構築します。フィールドを参照しているように見える命令は、構造体オフセット参照に変換されます。詳細については、モジュールの docstring を参照してください。

その他のスクリプト

ida_kernelcache_reload.py スクリプトは、ida_kernelcache.py と同一ですが、ida_kernelcache モジュールとすべてのサブモジュールを強制的にリロードする点が異なります。これは主に開発に役立ちます。

scripts ディレクトリには、ida_kernelcache を使用して何らかの解析を実行するスクリプトが含まれています。これらのスクリプトは、メインの ida_kernelcache モジュールの一部にするには特化しすぎていますが、kernelcache のリバースエンジニアリングに役立ちます。次のものが含まれます:

  • find_virtual_method_overrides.py: 指定された文字列を含む仮想メソッドをオーバーライドするクラスの子孫を見つけるスクリプト。一致するオーバーライドがコンソールに出力されます。

  • populate_struct.py: 現在のアドレスからデータフロー解析を実行して、C++ クラスまたは C struct のフィールドを設定します。

  • process_external_methods.py: IOExternalMethod または IOExternalMethodDispatch 配列を、ファジングツールで使用するための標準形式に処理します。

クラス再構築

Hex-Rays デコンパイラを使用している場合、ida_kernelcache のより興味深い機能の 1 つは、自動 C++ クラス再構築です。これは、OSMetaClass 情報とデータフロー解析を使用して、kernelcache 内のクラスを表す IDA struct を作成します。これらの表現により、疑似コード表現の可読性が大幅に向上します。詳細については、投稿 Reconstructing C++ classes in the iOS kernelcache using IDA Pro を参照してください。

新しい iOS 12 kernelcache 形式

iOS 12 で、Apple は一部のデバイスで新しい kernelcache 形式を導入しました。変更点の中には、この新しい kernelcache のカーネルポインタがタグ付けされてリスト内でリンクされていることがあり、おそらく iBoot がプリリンク辞書内の _PrelinkLinkKASLROffsets データなしでカーネルをスライドできるようにするためのものです。この形式のストック kernelcache を IDA で解析しようとすると、クロスリファレンスが欠落しているため困難です。詳細については、記事 Analyzing the iOS 12 kernelcache's tagged pointers を参照してください。

追加の処理を行わずに kernelcache 内のポインタのタグを解除するだけの場合は、kc.tagged_pointers.untag_pointers() を実行してください。

一般化に関する注意

これらの機能の一部は、Apple の kernelcache よりも広く適用できる可能性があります(たとえば、vtable 解析とシンボル伝搬、または ida_utilities.py のほとんどの関数)。それでも、インポート範囲を ida_kernelcache モジュールのみに制限しています。これは、他の種類のバイナリでこれらをテストしていないためです。

ライセンス

ida_kernelcache は MIT ライセンスの下で公開されています。

ida_kernelcache の機能の多くは memctl から借用されており、これも MIT ライセンスの下で公開されています。その他のソースは、対応するファイルのコメントに記載されています。


Brandon Azad

ツールをダウンロード
  • classes: このモジュールは、kernelcache 内の C++ クラスに関する情報を保持する ClassInfo 型を定義し、関数 collect_class_info を提供して kernelcache 内のクラスをスキャンし、クラス名から ClassInfo オブジェクトへのマップを格納したグローバルな class_info 辞書を設定します。ClassInfo 型は、各 C++ クラスについて、クラス名、OSMetaClass インスタンス、仮想メソッドテーブル、スーパークラス名を記録します。さらに、各 ClassInfo オブジェクトはスーパークラスの ClassInfo とすべての直接サブクラスの ClassInfo への参照を保存し、クラス階層の調査と走査を容易にします。collect_class_info はまた、すべての仮想メソッドテーブルのセットをグローバルな vtables セットに格納します。

  • data_flow: この内部モジュールには、ida_kernelcache の残りの部分で使用されるデータフロー操作が含まれています。

  • kernel: このモジュールは、グローバル変数 base と prelink_info を提供します。base はカーネルイメージのベースアドレス(カーネルの Mach-O ヘッダの開始位置)です。prelink_info はパースされた __PRELINK_INFO 辞書です。

  • kplist: このモジュールは、カーネル形式の plist をパースするための kplist_parse 関数を提供します。

  • metaclass: このモジュールは、既知の各 OSMetaClass インスタンスにシンボルを追加する関数 initialize_metaclass_symbols を提供します。

  • offset: このモジュールは、関数 initialize_data_offsets と initialize_offset_symbols を提供します。前者はセグメントをスキャンしてオフセットに変換できるポインタを探します。後者は、オフセットのターゲットにシンボルがある場合、各 kext の __got セクション内のオフセットをシンボル化します。

  • segment: このモジュールは、IDA のセグメントをより有用にリネームするための関数 initialize_segments を提供します。デフォルトでは、IDA はバンドル識別子の推測と領域を記述する Mach-O セクションを組み合わせてセグメント名を作成するようです。initialize_segments は __PRELINK_INFO 辞書から真のバンドル識別子を抽出し、各セグメントをバンドル識別子、Mach-O セグメント、Mach-O セクションを含むようにリネームします。これにより、たとえば __TEXT.__const と __DATA_CONST.__const を区別できるようになります。このモジュールはまた、指定されたアドレスを含む kext を特定するための関数 kernelcache_kext(トップレベルで再エクスポート)を提供します(古い iOS 11 の分割 kext kernelcache 形式のみ)。

  • stub: kernelcache 内の多くの kext には、カーネル本体の関数にジャンプする __stubs セクションにスタブ関数が含まれています。残念ながら、これらのスタブはクロスリファレンスと型情報の伝搬の障壁となります。このモジュールはこれらの問題を解決しませんが、スタブ関数を自動的にリネームしてターゲット関数名を表示できるようにすることで、スタブの調査を少し容易にします。スタブとそのターゲットは強制的に IDA 内の関数に変換され、IDA 内の関数が元のソースコードの関数と一致するのに役立ちます。

  • tagged_pointers: 新しい iOS 12 マージ kernelcache 形式では、各ポインタの上位 2 バイトがオフセットでタグ付けされ、ポインタがリスト内でチェーンされるようになっています。このモジュールには、これらのタグ付きポインタを処理および復元するための関数が含まれています。

  • vtable: このモジュールは、vtable_length、convert_vtable_to_offsets、vtable_overrides、initialize_vtable_symbols、initialize_vtable_method_symbols など、仮想メソッドテーブルを扱うための多くの便利な関数を提供します。vtable_length は、指定されたアドレスが vtable である可能性があるかどうかをチェックし、vtable の長さを返します。ジェネレータ vtable_overrides は、スーパークラスが使用する仮想メソッドをオーバーライドするクラスの仮想メソッドを列挙します。関数 initialize_vtable_symbols は、識別された各 vtable の開始位置にシンボルを追加します。initialize_vtable_method_symbols は、各 vtable 内のオーバーライドされたメソッドを反復処理し、スーパークラスからサブクラスにシンボルを伝搬します。これは、IOKit のほとんどの基底クラスが XNU で定義されており、比較的完全なシンボル情報があるため可能です。サブクラスの vtable 内の各メソッドオーバーライドは、スーパークラスのメソッドと同じインターフェースに準拠する必要があるため、スーパークラスの仮想メソッドシンボル内のスーパークラス名をサブクラス名に置き換えることで、オーバーライドのシンボルを生成できます。たとえば、AppleKeyStore クラスのインデックス 7 の仮想メソッドに名前がない場合でも、そのスーパークラス IOService のインデックス 7 の仮想メソッドが __ZNK9IOService12getMetaClassEv と呼ばれていることがわかっていれば、インデックス 7 はサブクラスでは __ZNK13AppleKeyStore12getMetaClassEv と呼ばれるべきであると推測できます。この手法を使用して、ほとんどのクラスのほとんどの仮想メソッドをシンボル化できます。