0 TL;DR
Root | APK改変 | DevTools 可能? | ベスト手段 | ワンライナー例 |
---|---|---|---|---|
✖ | ✖ | 不可 | MITM + scrcpy で推測 | mitmproxy -p 8080 / scrcpy |
✖ | ✔ | 可 | LSPatch / Objection patchapk / Frida Gadget | objection patchapk --enable-webview-debugging |
✔ | ✖ | 可 | Magisk + LSPosed(+WebViewDebugHook) / Frida server | frida -U -f <pkg> -l enable_webview.js --no-pause |
✔ | ✔ | 可 (最強) | smali 改変 + あらゆるフック | apktool d → smali edit → apktool b |
1 APK 改変とは?
項目 | 詳細 |
---|---|
定義 | APK を 展開 → ファイル追加/修正 → 再ビルド → 署名し直す 一連作業。オリジナル署名が失われる。 |
主ツール | apktool , apksigner , LSPatch, Objection patchapk, Frida Gadget 手動埋込 |
メリット | - Root 不要。- 任意コード(Frida Gadget, LSPosed DEX)を注入し自由度大。 |
デメリット | - Play Protect 警告、本家アップデート停止。- アプリ側署名検証・Play Integrity 反応でクラッシュする恐れ。 |
2 判定フローチャート
Root 可能?
├─ YES → 表4 (Magisk/Frida)
└─ NO
├─ APK 改変できる? → 表3 (LSPatch/patchapk)
└─ できない → 表5 (MITM + scrcpy)
3 Root なし + APK 改変あり
3‑A LSPatch (非Root LSPosed)
java -jar LSPatch.jar -m WebViewDebugHook.apk app_orig.apk -o patched.apk
apksigner sign --ks my.keystore patched.apk
adb install -r patched.apk
⇒ 起動後 chrome://inspect
で WebView 出現。
3‑B Objection patchapk
objection patchapk --source app_orig.apk \
--enable-webview-debugging --save patched.apk
adb install -r patched.apk
objection explore -g com.example.app
3‑C Frida Gadget 手動
apktool d app_orig.apk -o out
cp libfrida-gadget.so out/lib/arm64-v8a/
# AndroidManifest.xml に <meta-data android:name="frida-gadget" android:value="@string/libgadget"/>
apktool b out -o mod.apk
apksigner sign --ks my.keystore mod.apk
adb install -r mod.apk
frida -UG com.example.app -l enable_webview.js
4 Root あり + APK 無改変
4‑A Magisk + LSPosed + WebViewDebugHook
# Magisk app → Modules → "LSPosed"
# Settings → Zygisk = ON
# LSPosed Manager → Enable WebViewDebugHook (all apps)
reboot
→ 再起動後は全アプリが DevTools 対応。
4‑B Frida server 直挿し
adb push frida-server-android-14 /data/local/tmp/
adb shell "su -c 'chmod 755 /data/local/tmp/frida-server; /data/local/tmp/frida-server &'"
cat > enable_webview.js <<'EOF'
Java.perform(function() {
var WebView = Java.use('android.webkit.WebView');
WebView.setWebContentsDebuggingEnabled(true);
console.log('[+] WebView debugging enabled');
});
EOF
frida -U -f com.target.app -l enable_webview.js --no-pause
4‑C ptrace インジェクター(上級)
adb shell su -c './Injector -n com.target.app -so /data/local/tmp/libHook.so &'
# libHook.so 内 JNI_OnLoad で setWebContentsDebuggingEnabled(true) を呼ぶ。
5 Root なし & APK 無改変(DevTools 不可)
DevTools は使えないが「通信・画面・UI 階層」から推測はできる。
5‑A 具体ワークフロー
観測対象 | 推奨ツール | コマンド例 / メモ |
---|---|---|
HTTPS を含む通信内容 | mitmproxy / Charles | mitmproxy -p 8080 + 端末 Wi‑Fi プロキシ設定。ルート CA を端末へインストールし TLS 復号。証明書ピンニングに遭遇したら Frida の SSL バイパススクリプトを併用。 |
画面 (描画) とレスポンス遅延 | scrcpy (リアルタイム) / adb shell screenrecord (動画) | scrcpy --record file.mp4 --show-touches で操作&遅延タイムライン収録。レスポンス速度は mitmproxy ログのタイムスタンプと比較。 |
ビュー階層 | UIAutomator dump | adb shell uiautomator dump /sdcard/view.xml → adb pull 。WebView 要素は 1 ノードのみ=DOM 不可。 |
JavaScript 挙動推測 | 上記 3 つの突合 | ① mitmproxy のリクエスト/レスポンス (時刻, URL, Payload) ② scrcpy 動画のフレームタイム ③ UIAutomator のレイアウト変化 を時系列で並べる→ XHR → DOM 変化までの遅延 が読める。 |
例:検索フォームに入力 → XHR
/api/search?q=foo
(T+0 ms) → 画面リスト更新 (T+320 ms)。JS 処理/RecyclerDiff のボトルネックなどが逆算可能。
5‑B 実効性と限界
- メリット:Root 権限不要、公式 APK のままでも実行可。通信経路が全て分かるため バックエンド依存 の不具合洗出しには十分。
- 限界:DOM 構造そのものは見えず、クライアント JS のステート管理 までは把握できない。また証明書ピンニング強固なアプリではパケット観測が制限される。
Tips:Android 14 端末では developer options → enable screen record HEVC を ON にすると scrcpy の遅延が ~80 ms 改善。
6 Root あり + APK 改変あり Root あり + APK 改変あり
smali 改変で Activity#onCreate に直接
invoke-static { v0 }, Landroid/webkit/WebView;->setWebContentsDebuggingEnabled(Z)V
を埋め込むだけで恒久的に DevTools 可。LSPosed すら不要。
7 Play Integrity / Root 検出対策
カテゴリ | モジュール / 手法 | 対象API・検出ロジック | 特徴 / 注意点 |
---|---|---|---|
Root 隠蔽 (Zygisk) | Shamiko | SuFile , access("/sbin/su") など基本チェック | Zygisk 層で Magisk 痕跡を unmount。Magisk v28.0+ 公式対応継続。(xdaforums.com) |
Zygisk‑Assistant | Magisk / KernelSU 両対応の完全 root hide | FOSS。設定 UI なし。zygisk‑assistant cfg で対象 app 指定。Android 5–14 対応。(xdaforums.com) | |
ZygiskNext | Zygisk 自体を置き換え | 一部銀行アプリが Zygisk を直接検出 ⇒ swap 実装で回避。要 Magisk 設定 Zygisk off 。(xdaforums.com) | |
Play Integrity スプーフ | PlayIntegrityFix‑NEXT (PIF NEXT) | deviceIntegrity / basicIntegrity | A14 以降の API v3 対応。TrickyStore と併用で Play Store もカバー。(github.com) |
Universal SafetyNet Fix fork | 旧 SafetyNet エミュレーション | A12 以前向けレガシー。新端末では PIF 系推奨。(xdaforums.com) | |
アプリリスト/ブートローダ検出 | Hide My Applist (HMA) | pm list packages , /data/app スキャン | LSPosed モジュール。対象アプリ毎にホワイトリスト/ブラックリスト設定。(github.com, xdaforums.com) |
BootLoaderSpoofer | getprop ro.boot.flash.locked など | LSPosed モジュールでブートローダ unlock 情報を偽装。(reddit.com) | |
Kernel Hook | susfs (KernelSU + TrickyStore) | /proc/mounts パス伏せ / syscall hook | Reddit で“現行最強”と話題。要 KernelSU 対応カスタムカーネル。(reddit.com) |
Property Spoof CLI | ih8sn | ro.build.* 系の build.prop 判定 | system/vendor prop を tmpfs でマスク。Pixel系カスタムROMで実績。(reddit.com) |
組み合わせ指針
- まず PIF‑NEXT で Play Integrity を通す →
MEETS_DEVICE_INTEGRITY
を取得。- 追加で HMA / BootLoaderSpoofer / Zygisk‑Assistant をアプリ単位で適用。
- それでも検出される場合は susfs + KernelSU ルートへ移行(要カスタムカーネル)。
実務では PIF‑NEXT + Zygisk‑Assistant + HMA の 3 点セットで 2025 年時点の主要銀行 / 配達 / 動画配信アプリをクリアした報告が多い。