記事一覧はこちら

非Root化実機で/data/data/[packeage]/以下のファイルをPCに転送しようとして失敗した話

非root化状態のandroid端末だと/data/data/以下はパーミッションエラーで見れないんだけど、run-as [packeageName]というコマンドを叩くとデバッグ状態のアプリに限って権限を得ることが出来る。

indows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\20150902-android-run-as-test\sharedPreferenceApp>adb shell shell@SO-03F:/ $ run-as org.fushihara.sp run-as org.fushihara.sp shell@SO-03F:/data/data/org.fushihara.sp $ ls -la ls -la drwxrwx--x u0_a12 u0_a12 2015-09-02 23:26 cache lrwxrwxrwx install install 2015-09-02 23:25 lib -> /data/app-lib/org.fushihara.sp drwxrwx--x u0_a12 u0_a12 2015-09-02 23:26 shared_prefs shell@SO-03F:/data/data/org.fushihara.sp $ cd shared_prefs/ shell@SO-03F:/data/data/org.fushihara.sp/shared_prefs $ ls -la ls -la -rw-rw---- u0_a12 u0_a12 106 2015-09-02 23:26 dataTest.xml shell@SO-03F:/data/data/org.fushihara.sp/shared_prefs $ cat dataTest.xml <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <int name="number" value="3" /> </map> shell@SO-03F:/data/data/org.fushihara.sp/shared_prefs $ pwd pwd /data/data/org.fushihara.sp/shared_prefs

shell@SO-03F:/data/data/org.fushihara.sp/shared_prefs $ cat /data/data/org.fushihara.sp/shared_prefs/dataTest.xml at /data/data/org.fushihara.sp/shared_prefs/dataTest.xml < <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <int name="number" value="3" /> </map>

shell@SO-03F:/ $ id id uid=2000(shell) gid=2000(shell) groups=1004(input),1007(log),1011(adb),1015(sdcard_rw),1026(drmrpc),1028(sdcard_r),2991(removable_rw),2993(trimarea),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats) context=u:r:shell:s0

shell@SO-03F:/ $ run-as org.fushihara.sp run-as org.fushihara.sp shell@SO-03F:/data/data/org.fushihara.sp $ id id uid=10012(u0_a12) gid=10012(u0_a12) groups=1004(input),1007(log),1011(adb),1015(sdcard_rw),1026(drmrpc),1028(sdcard_r),2991(removable_rw),2993(trimarea),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats) context=u:r:untrusted_app:s0

ユーザーidが2000(shell)から10012(u0_a12)に変わってる。 自動化すれば非root状態の端末で、/data/data/packageName以下のファイルをPCから読み書き出来るのではと思って試した。

まずプログラム上からadbコマンドを叩く必要がある。そこで以下のソフトを使った。 adakoda/android-screen-monitor これはandroidのキャプチャツールだけど、ソースを追いかけるとソケット通信にバイト列を流し込んでコマンドを送信している。 pullFile(remote,local)というメソッドがあるから、組み合わせればバイナリファイルも取れるかもと期待した。

String remoteFilePath="/data/data/org.fushihara.sp/shared_prefs/dataTest.xml";
String localFilePath="C:\\remote.xml";
AndroidDebugBridge.init(false);
AndroidDebugBridge mAndroidDebugBridge = AndroidDebugBridge.createBridge("adb", true);
while(mAndroidDebugBridge.hasInitialDeviceList()==false){}
IDevice[] mDevices = mAndroidDebugBridge.getDevices();
final IDevice device = mDevices[0];
System.err.println(device);
device.executeShellCommand("run-as org.fushihara.sp",null);
device.pullFile(remoteFilePath, localFilePath);

これを叩き込んだのだが、駄目。idコマンドで値を確認したら、run-asコマンドを叩いてもユーザーidは2000(shell)で固定のようだった

//run-asコマンドの戻り値はいい感じになっているのだが
u0_a12@SO-03F:/data/data/org.fushihara.sp $
//idコマンドはshellのままだった
uid=2000(shell) gid=2000(shell) groups=1004(input),1007(log),1011(adb),1015(sdcard_rw),1026(drmrpc),1028(sdcard_r),2991(removable_rw),2993(trimarea),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats) context=u:r:shell:s0
ソースを追いかけても、コマンドの直前に毎回接続しなおしてる とかも無いっぽいからとりあえずここまで。 上記のandroid-screen-monitorはソケット通信のバイト列までソースが追えるから、純正adbでの処理をキャプチャして比較するともう一歩近づけるかも。 adbをwifi経由で繋いで、パケットキャプチャ仕込んで、その状態でrun-asをする と。 デバッグ状態のアプリの/data/data/以下くらいandroidStudioから直接見れるようにして欲しいわーマジで。 run-asコマンド知らなかった時よりは進歩だけどさ。