当前位置: 首页 > 知识库问答 >
问题:

检测到Android root?立即卸载应用程序

江浩慨
2023-03-14

我正在开发一个包含敏感数据(加密密钥)的应用程序,这些数据不应该泄露。该应用程序应该能够在任何时候脱机工作,所以我不能在云中存储密钥。

当用户有一个扎根的设备时,他可以提取apk并获得密钥。我想阻止这一切。

一旦检测到根用户访问权限,有没有办法在没有用户确认的情况下立即强制卸载我的应用程序?

(或者是否有其他方法防止钥匙泄漏??)

我看了一下Samsung Knox,它对数据进行加密,并使用一个硬件位检测根访问,一旦设备被篡改,应用程序和数据就无法访问。它工作得非常好,但我正在寻找一种适用于更广泛设备(不仅仅是三星设备)的解决方案。

共有2个答案

壤驷乐邦
2023-03-14

我认为立即卸载应用程序不是解决方案,你必须找出根目录在哪里,并小心magisk管理器应用程序,可以绕过根检测,你可以尝试使用Rootbeer根检测,根工具,或创建根类

//root example you can call this class.
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/",
                "/system/app/Superuser.apk", "/sbin/su", "/sbin/su/", "/system/bin/su","/system/bin/su/",
                "/system/xbin/su", "/system/xbin/su/", "/data/local/xbin/su", "/data/local/bin/su", "/system/sd/xbin/su",
                "/system/bin/failsafe/su", "/data/local/su", "/su/bin/su", "/su/",
                "/data/local/xbin/",
                "/system/bin/.ext/",
                "/system/bin/failsafe/",
                "/system/sd/xbin/",
                "/su/xbin/",
                "/su/bin/",
                "/magisk/.core/bin/",
                "/system/usr/we-need-root/",
                "/system/xbin/",
                "/system/su","/system/bin/.ext/.su","/system/usr/we-need-root/su-backup",
                "/system/xbin/mu",
                "/system/su/","/system/bin/.ext/.su/","/system/usr/we-need-root/su-backup/",
                "/system/xbin/mu/"};
        for (String where : places) {
            if (new File(where + binaryName).exists()) {
                found = true;
                break;
            }
        }
    }
    return found;
}
private static boolean isRooted() {
    return findBinary("su");
}

将此用于卸载应用程序(已测试)

Intent intent=new Intent(Intent.ACTION_DELETE);
String packageName = "yourpackagename";
intent.setData(Uri.parse("package:"+packageName));
startActivity(intent);
闾丘照
2023-03-14

编辑:你试图实现的那些事情(保存加密密钥的存储空间,...)不是很容易。你应该看看这个,它可能会对你帮助最大。

要卸载你的应用,你可以试试这个(未测试!):

Uri packageURI = Uri.parse("package:"+MyMainActivity.class.getPackage().getName());
Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
startActivity(uninstallIntent);

当涉及到根检测时,不仅存在“最佳”解决方案。有多种方法,以下是一些帮助您入门的方法:

/** @author Kevin Kowalewski */
public class RootUtil {
    public static boolean isDeviceRooted() {
        return checkRootMethod1() || checkRootMethod2() || checkRootMethod3();
    }

    private static boolean checkRootMethod1() {
        String buildTags = android.os.Build.TAGS;
        return buildTags != null && buildTags.contains("test-keys");
    }

    private static boolean checkRootMethod2() {
        String[] paths = { "/system/app/Superuser.apk", "/sbin/su", "/system/bin/su", "/system/xbin/su", "/data/local/xbin/su", "/data/local/bin/su", "/system/sd/xbin/su",
                "/system/bin/failsafe/su", "/data/local/su", "/su/bin/su"};
        for (String path : paths) {
            if (new File(path).exists()) return true;
        }
        return false;
    }

    private static boolean checkRootMethod3() {
        Process process = null;
        try {
            process = Runtime.getRuntime().exec(new String[] { "/system/xbin/which", "su" });
            BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
            if (in.readLine() != null) return true;
            return false;
        } catch (Throwable t) {
            return false;
        } finally {
            if (process != null) process.destroy();
        }
    }
}
 类似资料:
  • 问题内容: 罐的价值有多种变化方式,包括: 按键 复制粘贴 用JavaScript修改 通过浏览器或工具栏自动完成 我希望我的JavaScript函数在每次更改时都能被调用(使用当前输入值)。我希望立即调用它,而不仅仅是输入失去焦点时。 我正在寻找最干净,最可靠的方法来在所有浏览器中做到这一点(最好使用jQuery)。 问题答案: 不幸的是,我认为赢得了大奖: 这是最干净的解决方案,只需一行代码。

  • 全部 我有一个JPanel(比如JTabbedPane容器),它包含一个设计面板和一个预览面板。 预览面板包含一个JME3画布。 我试图实现的是,每当用户移动到应用程序中的另一个面板时,我就可以捕获容器Jpanel的卸载并关闭JME3应用程序, 我找到了以下线程, 谢谢米希尔

  • 我们的应用程序有DB14版本,并使用android sqllite帮助器。现在我们正在使用房间数据库,并将所有数据库的东西迁移到房间。我们已经定义了从1_2,2_3的所有迁移。到13_14,并给出所有这些int构建 这是正确的做法吗。如果我用DB14版本安装了非房间版本的应用程序,并且我试图用相同的DB14版本更新它到房间版本的应用程序,我会得到错误: IllegalStateException:

  • 使用 Creative Cloud 桌面应用程序卸载 Creative Cloud 应用程序。 卸载 Creative Cloud 应用程序 如果您不再需要某个应用程序,则必须使用 Adobe Creative Cloud 桌面应用程序卸载该应用程序。 注意:不要将应用程序文件和文件夹拖到“废纸篓”或“回收站”中,因为这样做无法将其正确卸载。 单击位于任务栏 (Windows) 或 Apple 菜

  • Adobe Creative Cloud 桌面应用程序对于 Creative Cloud 功能(如安装 Creative Cloud 应用程序、同步、字体同步、资料库等)至关重要。Adobe 强烈建议不要卸载此应用程序。 但是在某些情况下,如 Creative Cloud 桌面应用程序已损坏或安装某些 Creative Cloud 应用程序时出现问题,您可以卸载 Creative Cloud 桌面

  • 问题内容: 我有一个加载DLL来执行处理的特定部分的应用程序 Process.dll 使用反射 在运行时动态加载 ,并且未在应用程序中引用。 处理完成后,需要在服务器上重新编译DLL,然后稍后再次加载。 为此,我需要释放它,否则会收到以下消息:“无法将文件“ Process.dll”复制到“ Process.dll”。该进程无法访问文件“ Process.dll”,因为被另一个进程使用。” 因此,