リリースビルドでしか発生しない不都合調査用
Nexus7 などの /system が書き換え可能なターゲットでしか使用できません。
AndroidManifest のデバッグフラグ
frameworks/base/core/java/android/content/pm/PackageParser.java
if (sa.getBoolean( com.android.internal.R.styleable.AndroidManifestApplication_debuggable, false)) { ai.flags |= ApplicationInfo.FLAG_DEBUGGABLE; }
を
if (sa.getBoolean( com.android.internal.R.styleable.AndroidManifestApplication_debuggable, false)) { ai.flags |= ApplicationInfo.FLAG_DEBUGGABLE; } ai.flags |= ApplicationInfo.FLAG_DEBUGGABLE;
に変更することで AndroidManifest の debuggable が true として認識されます。
android.os.Debug#isDebuggerConnected 形骸化
frameworks/base/core/java/android/os/Debug.java
から dalvik.system.VMDebug#isDebuggerConnected を呼び出しているので
dalvik.system.VMDebug で形骸化
dalvik/vm/native/dalvik_system/VMDebug.cpp
isDebuggerConnected で false を返すようにすると android.os.Debug#waitForDebugger が正常稼動しなくなる
android.os.Debug#waitForDebugger カスタム
waitForDebugger が正常稼動するように dalvik.system.VMDebug#isDebuggerConnected オリジナルの機能は別名で残す
libcore/dalvik/src/main/java/dalvik/system/VMDebug.java の isDebuggerConnected の行をこぴぺして別名とし宣言を追加
デバッガ待ちをカスタムした android.os.debug#waitForDebugger へ向ける
frameworks/core/java/android/app/ActivityThread.java で
android.app.ActivityThread#handleBindApplication から Debug.waitForDebugger を呼び出している箇所を修正
am start -D したときにデバッガ待ちが完了しないのでこれらの準備が必要
ソースをビルド
make するときに WITH_DEXPREOPT=true をつける必要がある@Nexus7 2013 KOT49H
/system/lib/libdvm.so /system/framework/core.* /system/framework/framework.* /system/framework/framework2.*
理科張りモードで起動して上記ファイルを置き換える
(/dev/block/platform/msm_sdcc.1/by-name/system から dd でイメージを作成して後付 mount では /init.rc などに勝てないので差し替え)
通常起動すると /cache の再生成が走るので少し待つ
置き換えた元に戻すときは FactoryImage から system.img を焼きこめば元に戻ります。
(mv か cp -a でバックアップするのも可)
デバッガ接続
リリース版の APK であってもシステムに問い合わせをかけると
ApplicationInfo.FLAG_DEBUGGABLE が ON になっているので
run-as や am start -D が可能
android.os.Debug#isDebuggerConnected でデバッガの制御下にあるかどうかを検出している箇所はすり抜けれる
jwdp でデバッガ接続できるのでデバッグが可能になる
アプリ側として防ぐには
経過時間などあわせ技が必要だが誤爆の危険性あり…