1

IConnectivityManager.startLegacyVpnを呼び出すリフレクションを使用するコードの記述に行き詰まっています

私が得るエラーはjava.lang.SecurityException:Unauthorized Caller

Androidのソースを見ると、これが私をハングアップさせているコードであることがわかります。

if(Binder.getCallingUid()!= Process.SYSTEM_UID){上記の例外を発生させる}

私の質問は、AVDをルート化し、アプリをシステム/アプリにインストールする場合、このエラーを回避するにはこれで十分ですか?

もしそうなら、これを行う方法のヒント(apkをsystem / appフォルダーに移動しようとするたびに、アプリアイコンをクリックしたときにアプリがインストールされていないと表示されます。

ありがとう!

4

3 に答える 3

2

Android 4.01オープンソースに続いて、同じ問題があります。次のようなものがあります。

public synchronized LegacyVpnInfo getLegacyVpnInfo() {
    // Only system user can call this method.

    if (Binder.getCallingUid() != Process.SYSTEM_UID) {
        throw new SecurityException("Unauthorized Caller");
    }
    return (mLegacyVpnRunner == null) ? null : mLegacyVpnRunner.getInfo();
}

または、

// Only system user can revoke a package.
if (Binder.getCallingUid() != Process.SYSTEM_UID) {
    throw new SecurityException("Unauthorized Caller");
}

または、

public void protect(ParcelFileDescriptor socket, String interfaze) throws Exception {
    PackageManager pm = mContext.getPackageManager();

    ApplicationInfo app = pm.getApplicationInfo(mPackage, 0);

    if (Binder.getCallingUid() != app.uid) {
        throw new SecurityException("Unauthorized Caller");
    }

    jniProtect(socket.getFd(), interfaze);
}

ただし、上記のコード ブロックは com.android.server.connectivity.Vpn に属します。

(クラス Vpn)、これは interface で定義されていませんIConnectivityManager

startLegacyVpnInfo()関数にもありますが、例外が含まれているものは何も表示されません

「不正な呼び出し元」なので、なぜstartLegacyVpnInfo()関数がこの例外をスローするのだろうか?

これに対する解決策はありますか?

于 2012-08-24T03:35:34.753 に答える
0

私は同じ電話をかけようとしています。これまでのところ、デバイスのルート化と apk の /system/app へのコピーが機能しないことを確認できます。システム uid で起動しません。

また、これは機能しません:

Field uidField = Process.class.getDeclaredField("SYSTEM_UID");
uidField.setAccessible(true);
uidField.set(null, Process.myUid());

これらの呼び出しは成功しますが、SYSTEM_UID フィールドには影響しないようです。フィールドはおそらくコンパイル時に最適化されます。

于 2012-08-30T21:46:28.903 に答える