【问题标题】:How to get icc authentication?如何获得icc认证?
【发布时间】:2018-10-02 20:04:22
【问题描述】:

我在 telephonyManager 类中发现了一些有趣的方法,例如关闭/打开移动数据,但是当尝试使用它们时,它显然会引发安全异常。(“无运营商特权”)。我用谷歌搜索了它,但没有找到任何有用的解决方案。 因为它是运营商特权,所以我认为可以通过telephonyManager.getIccAuthentication(int appType, int authType, String data) 获得它的许可,但是我在输入参数方面遇到了问题,因为我不知道应该传递什么才能使其工作。

从文档到第一个参数将传递TelephonyManager.APPTYPE_SIM 或/和TelephonyManager.APPTYPE_USIM,这取决于使用setDataEnabled(boolean) 是否具有重要意义。 如果我将TelephonyManager.APPTYPE_SIM 作为第一个参数传递,我认为我应该将TelephonyManager.AUTHTYPE_EAP_SIM 作为第二个参数传递(如果我错了,请纠正我),反之亦然,当TelephonyManager.APPTYPE_USIM 作为第一个参数时,TelephonyManager.AUTHTYPE_EAP_AKA 作为第二个参数。

然后是第三个参数。必须将 Base64 编码为字符串。我在 TelephonyProvider 中找到了这行代码: String base64Challenge = Base64.encodeToString(byteParam, Base64.NO_WRAP); 其中 byteParam 是来自另一个方法的输入字节,该方法在数千个其他方法之前。如果我将“”作为第三个参数传递给 getIccAuthentication 方法,我会再次得到 securityException(这显然是错误的参数),但它会让我缺少getIccSimChallengeResponse。我担心它可能是无限循环的方法,但也许有人有任何想法或帮助我突破这个?

我的示例代码:

public class MainActivity extends AppCompatActivity {


private static final String TAG = MainActivity.class.getSimpleName();

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button button = (Button) findViewById(R.id.buttonPanel);
    button.setOnClickListener(new View.OnClickListener() {
        @RequiresApi(api = Build.VERSION_CODES.O)
        @Override
        public void onClick(View view) {
            try {
                Process p = Runtime.getRuntime().exec("su");
                tel();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    });

}

@RequiresApi(api = Build.VERSION_CODES.O)
private void tel(){
//        String base64Challenge = Base64.encodeToString(, 
Base64.NO_WRAP);
    TelephonyManager telephonyManager = (TelephonyManager)
            getSystemService(Context.TELEPHONY_SERVICE);
    boolean isCarrier = telephonyManager.hasCarrierPrivileges();
    String authentication = 
telephonyManager.getIccAuthentication(TelephonyManager.APPTYPE_SIM, 
TelephonyManager.AUTHTYPE_EAP_SIM, "");
    Log.v(TAG, authentication);
    if (isCarrier) {
        Log.v(TAG, "privs granted");
        telephonyManager.setDataEnabled(false);
    } else {
        Log.v(TAG, "no privilegies");
    }
}


}

【问题讨论】:

  • 请添加一些代码块。

标签: java android permissions carrier mobile-data


【解决方案1】:

来自文档:

需要权限:READ_PRIVILEGED_PHONE_STATE 或调用 应用拥有运营商权限(请参阅 hasCarrierPrivileges())。

其中第一个要求您安装为特权系统应用程序(需要根或拥有系统证书)。第二个要求您的 UID 是运营商的。没有它,参数组合将不起作用。

【讨论】:

  • 好的,我已经root了设备,只需执行“su”命令即可获得root权限。但还有什么?
  • 该应用不需要root,它需要安装在系统privlidged apps目录中(卸载它,adb将apk推送到正确的位置,重启设备)。然后它可以调用该函数,只要请求 READ_PRIVLIDGED_PHONE_STATE 权限。然而,这可能还不够,因为看起来第三个参数是一个 base64 密码,由设备中的物理 SIM 卡验证。
  • 好的,谢谢您的解释。所以我所需要的只是生成由 sim 卡验证的 base64 密码,是吗?此密码是常量还是每个设备的生成方式不同?
  • 不确定。我的猜测是设备或电信帐户特定的,SIM 使用它在设置时下载的数据对其进行验证。常量太容易破解了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
相关资源
最近更新 更多