gpt4 book ai didi

android - 如何以编程方式找到 Root设备?

转载 作者:行者123 更新时间:2023-11-29 16:01:14 25 4
gpt4 key购买 nike

在安装我的应用程序之前,我希望它检查设备是否已root。我使用了以下代码

private static boolean isRooted()

return findBinary("su");
}
public static boolean findBinary(String binaryName) {

boolean found = false;
if (!found) {

String[] places = {"/sbin/", "/system/bin/", "/system/xbin/", "/data/local/xbin/",
"/data/local/bin/", "/system/sd/xbin/", "/system/bin/failsafe/", "/data/local/"};
for (String where : places) {
if ( new File( where + binaryName ).exists() ) {

found = true;
break;
}
}
}
return found;
}

它工作正常。但我听说可以更改文件名“su”,也可以在非根设备中创建一个名为“su”的文件。在那种情况下,这个来源是不可靠的。所以我想知道除了搜索“su”之外的其他方法来找到 Root设备。 我使用了以下代码

   Public static boolean checkRootMethod1()

{
String buildTags = android.os.Build.TAGS;

if (buildTags != null && buildTags.contains("test-keys")) {

return true;
}

return false;
}

它不能正常工作。对于 Root设备,它按预期工作。但对于一些没有开启Root的设备,它也显示为有根。由于输出因不同设备而异,我找不到解决方案..任何帮助将不胜感激

最佳答案

如果你想限制你的应用程序在 root 设备上的使用,那么你必须考虑两点:
1) 限制在 root 设备中下载应用程序。
2) 限制 root 设备中应用的旁加载

按照以下步骤限制从 Play 商店下载:
1) 去玩商店控制台。
2) 在左侧菜单中,转到发布管理。
3) 在那里,转到设备目录。
4) 然后你会得到 3 个选项卡选项,转到排除的设备。
5) 您将获得指定排除规则的选项。点击管理排除规则。
6) 您可以看到 SafetyNet 排除的选择器。选择选项:排除未通过基本完整性测试的设备,以及未经 google 认证的设备。

按照以下步骤限制应用的侧载:
1) 使用以下命令获取 API key :https://developer.android.com/training/safetynet/attestation.html#obtain-api-key

2) 在你的 gradle 文件中添加 safetynet 依赖。
实现 'com.google.android.gms:play-services-safetynet:17.0.0'

3) 我在我的其他 Activity 扩展的 BaseActivity 中放置了下面的代码,所以如果拥有 root 设备的黑客试图侧载并尝试进入任何 Activity ,那么下面的代码将执行。

    private void ifGooglePlayServicesValid() {
if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(getApplicationContext())
== ConnectionResult.SUCCESS) {
// The SafetyNet Attestation API is available.
callSafetyNetAttentationApi();

} else {
// Prompt user to update Google Play services.
}
}

private void callSafetyNetAttentationApi() {
SafetyNet.getClient(this).attest(generateNonce(), SAFETY_NET_CHECK_API_KEY)
.addOnSuccessListener(this,
response -> {
// Use response.getJwsResult() to get the result data.
String jwsResponse = decodeJws(response.getJwsResult());
try {
JSONObject attestationResponse = new JSONObject(jwsResponse);
boolean ctsProfileMatch = attestationResponse.getBoolean("ctsProfileMatch");
boolean basicIntegrity = attestationResponse.getBoolean("basicIntegrity");
if (!ctsProfileMatch || !basicIntegrity) {
// this indicates it's rooted/tampered device
}
} catch (JSONException e) {
// json exception
}
})
.addOnFailureListener(this, e -> {
// An error occurred while communicating with the service.
});
}

public String decodeJws(String jwsResult) {
if (jwsResult == null) {
return null;
}
final String[] jwtParts = jwsResult.split("\\.");
if (jwtParts.length == 3) {
return new String(Base64.decode(jwtParts[1], Base64.DEFAULT));
} else {
return null;
}
}

private byte[] generateNonce() {
byte[] nonce = new byte[16];
new SecureRandom().nextBytes(nonce);
return nonce;
}

SAFETY_NET_CHECK_API_KEY is the key obtained in the 1st step.

Attestation API 返回一个 JWS 响应,如下所示:

{
"timestampMs": 9860437986543,
"nonce": "R2Rra24fVm5xa2Mg",
"apkPackageName": "com.package.name.of.requesting.app",
"apkCertificateDigestSha256": ["base64 encoded, SHA-256 hash of the
certificate used to sign requesting app"],
"ctsProfileMatch": true,
"basicIntegrity": true,
}

JWS 响应包含指示设备状态的 ctsProfileMatchbasicIntegrity

enter image description here
编号:https://developer.android.com/training/safetynet/attestation.html

关于android - 如何以编程方式找到 Root设备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24523606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com