【问题标题】:Unauthorized Caller Error未经授权的调用者错误
【发布时间】:2012-08-09 15:55:02
【问题描述】:

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

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

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

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

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

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

谢谢!

【问题讨论】:

  • 至于为什么说app没有安装,我觉得可能需要0644权限?

标签: android root vpn avd


【解决方案1】:

我有同样的问题,在 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

(class Vpn),在接口IConnectivityManager中没有定义。

我也在startLegacyVpnInfo() 函数中找到,但我看不到任何涉及异常的东西

“未经授权的调用者”,所以我想知道为什么startLegacyVpnInfo()函数会抛出这个异常?

有什么解决办法吗?

【讨论】:

    【解决方案2】:

    我正在尝试拨打相同的电话。到目前为止,我可以确认 root 设备并将 apk 复制到 /system/app 不起作用,它不会在系统 uid 下启动。

    另外,这不起作用:

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

    这些调用成功了,但它们似乎不影响 SYSTEM_UID 字段,该字段可能在编译时已优化。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 2015-04-19
        相关资源
        最近更新 更多