1

我被困在编写一些使用调用 IConnectivityManager.startLegacyVpn 的反射的代码

我得到的错误是 java.lang.SecurityException: Unauthorized Caller

查看android源代码,我看到这是让我挂断的代码:

if (Binder.getCallingUid() != Process.SYSTEM_UID) { 引发上述异常 }

我的问题是,如果我根我的 AVD 并在系统/应用程序中安装我的应用程序,这足以解决这个错误吗?

如果是这样,有关如何执行此操作的任何提示(每次我尝试将我的 apk 移动到系统/应用程序文件夹时,当我单击应用程序图标时,它都会说应用程序未安装。

谢谢!

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

如果您包含android: sharedUserId="android.uid.system"在清单标记中(而不仅仅是清单),那么这应该将应用程序作为系统运行。现在应该可以让您运行代码了。

至于推送到/system/app,你需要运行adb root后跟adb remount. 现在,这将让您推送到 /system/app。

于 2013-10-03T08:01:41.780 回答
0

我正在尝试打同样的电话。到目前为止,我可以确认 root 设备并将 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 回答