Android アプリの強制デバッグ

リリースビルドでしか発生しない不都合調査用

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 でデバッガ接続できるのでデバッグが可能になる

アプリ側として防ぐには

経過時間などあわせ技が必要だが誤爆の危険性あり…

This entry was posted in Android, Android Device, NEXUS7 2013 LTE. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>