言語: English | 简体中文 | 繁體中文 | 日本語 | 한국어 | Français | Deutsch | Español | Italiano | Русский | العربية
neverc_krt_interpose_register を使用して do_faccessat のエントリポイントをフックします。デモ内容:
- 自動チェーン:同一ターゲットに複数のハンドラを優先度順に実行
- オリジナル呼び出しパターン:ハンドラは
origポインタを受け取り、元の関数を呼び出し可能 - 優先度制御:値が小さいほど先に実行。負の値で他のフックより先に実行
- 共存:ターゲットが既に他のモジュールにフックされていても動作
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