Skip to content

Latest commit

 

History

History
100 lines (73 loc) · 4.4 KB

File metadata and controls

100 lines (73 loc) · 4.4 KB

言語: English | 简体中文 | 繁體中文 | 日本語 | 한국어 | Français | Deutsch | Español | Italiano | Русский | العربية

← NeverC サンプル

Android カーネル関数フック

neverc_krt_interpose_register を使用して do_faccessat のエントリポイントをフックします。デモ内容:

  • 自動チェーン:同一ターゲットに複数のハンドラを優先度順に実行
  • オリジナル呼び出しパターン:ハンドラは orig ポインタを受け取り、元の関数を呼び出し可能
  • 優先度制御:値が小さいほど先に実行。負の値で他のフックより先に実行
  • 共存:ターゲットが既に他のモジュールにフックされていても動作

API

int neverc_krt_interpose_register(void *target, void *handler, int priority,
                             void **orig, struct neverc_krt_interpose_ref *ref);
int neverc_krt_interpose_unregister(struct neverc_krt_interpose_ref *ref);

ハンドラシグネチャ:

long my_interpose(void *orig, void *a0, void *a1, void *a2, void *a3, void *a4, void *a5);

ビルド

cd examples/android-kernel-inline-interpose
neverc make          # debug: -g(初回ビルドの既定値)
neverc make release  # release: -O2 --strip
neverc make debug    # debug に戻す

別のカーネルプリセットは、たとえば neverc make KERNEL=612 release で選択します。neverc make release は -O2 --strip を選びます。Makefile は選択した KERNEL と PROFILE を .nvk-build-flags に記録するため、以後の make push、make run、 ターゲットなしの make は同じ成果物を使います。この状態ファイルがなければ、 make の既定値は debug です。make debug または明示的な PROFILE=... は 保存済みのプロファイルを更新し、make clean は状態ファイルを削除して次の ビルドを debug に戻します。

NeverC は、IDA に着想を得つつ予約接頭辞を使わないリリース名を 5 種類 書き込みます。関数は fn_HEX、実行可能な無型ラベルは code_HEX、オブジェクトは obj_HEX、その他の無型ラベルは sym_HEX、絶対シンボルは abs_HEX です。 通常の割り当て済み定義では、HEX は最終的な SHF_ALLOC セクション配置から 決定的に算出した analysis EA です(abs_HEX は代わりに絶対 st_value を 使います)。これは hash(ハッシュ)、encryption(暗号化)、file offset (ファイルオフセット)、ELF virtual address(ELF 仮想アドレス)、runtime kernel address(実行時カーネルアドレス)のいずれでもありません。NeverC は予約済みの sub_/loc_ 形式も、意図的に空にした通常名も保存しません。

正確に保持する名前、IDA の合成 extern 表示、セキュリティ境界、最終処理と署名の 順序については、 リリースとストリップ方針を参照してください。

デプロイと実行

neverc make run

または手動:

adb push nvk_interpose_demo.ko /data/local/tests/
adb shell su -c 'insmod /data/local/tests/nvk_interpose_demo.ko'
adb shell su -c 'dmesg | grep neverc_krt_interpose_demo'

カーネルログ(リアルタイム)

デバイスで cat /proc/kmsg を実行すると、カーネル ring buffer をリアルタイムに追跡できます。Windows の DbgView に近い使い方です。insmod が曖昧なエラーだけを返すときや、vermagic・modversions・section サイズなど本当の拒否理由を確認するときに使います。

端末 1(そのまま実行):

adb shell
su
cat /proc/kmsg

端末 2:

adb shell su -c 'insmod /data/local/tests/nvk_interpose_demo.ko'

ロード直後の新しい行が端末 1 に流れます。Ctrl+C で停止します。

補足:Android によっては dmesg -w が使えません。/proc/kmsg は root が必要ですが、モジュール読み込みのデバッグには安定しています。

アンロード

neverc make rmmod