执行等效于Runtime.getRuntimeexeccmd;的命令行在JNI C中

问题描述

我正在开发一个需要实现根检测逻辑的应用程序,因此通过研究,我在JAVA中发现了一些检测逻辑并实现了以下类。

class RootDetection {

    public boolean isDeviceRooted() {

        return checkForBinary("su") || checkForBinary("busyBox") || checkForMalicIoUsPaths() || checkSUonPath()
                || detectRootManagementApps() || detectpotentiallyDangerousApps() || detectRootCloakingApps()
                || checkForDangerousProps() || checkForRWPaths()
                || detectTestKeys() || checkSuExists();
    }

    private boolean detectTestKeys() {
        String buildTags = android.os.Build.TAGS;
        String buildFinger = Build.FINGERPRINT;
        String product = Build.PRODUCT;
        String hardware = Build.HARDWARE;
        String display = Build.disPLAY;
        System.out.println("Java: build: " + buildTags + "\nFingerprint: " + buildFinger + "\n Product: " + product + "\n Hardware: " + hardware + "\ndisplay: " + display);
        return (buildTags != null) && (buildTags.contains("test-keys") || buildFinger.contains("genric.*test-keys") || product.contains("generic") || product.contains("sdk") || hardware.contains("goldfish") || display.contains(".*test-keys"));
    }


    private boolean detectRootManagementApps() {
        return detectRootManagementApps(null);
    }


    private boolean detectRootManagementApps(String[] additionalRootManagementApps) {


        ArrayList<String> packages = new ArrayList<>();
        packages.addAll(Arrays.asList(kNownRootAppsPackages));
        if (additionalRootManagementApps != null && additionalRootManagementApps.length > 0) {
            packages.addAll(Arrays.asList(additionalRootManagementApps));
        }

        return isAnyPackageFromListInstalled(packages);
    }


    private boolean detectpotentiallyDangerousApps() {
        return detectpotentiallyDangerousApps(null);
    }

    private boolean detectpotentiallyDangerousApps(String[] additionalDangerousApps) {


        ArrayList<String> packages = new ArrayList<>();
        packages.addAll(Arrays.asList(kNownDangerousAppsPackages));
        if (additionalDangerousApps != null && additionalDangerousApps.length > 0) {
            packages.addAll(Arrays.asList(additionalDangerousApps));
        }

        return isAnyPackageFromListInstalled(packages);
    }


    private boolean detectRootCloakingApps() {
        return detectRootCloakingApps(null);
    }


    private boolean detectRootCloakingApps(String[] additionalRootCloakingApps) {


        ArrayList<String> packages = new ArrayList<>();
        packages.addAll(Arrays.asList(kNownRootCloakingPackages));
        if (additionalRootCloakingApps != null && additionalRootCloakingApps.length > 0) {
            packages.addAll(Arrays.asList(additionalRootCloakingApps));
        }

        return isAnyPackageFromListInstalled(packages);
    }

    private boolean checkForBinary(String filename) {

        for (String path : suPaths) {
            String completePath = path + filename;
            File f = new File(completePath);
            boolean fileExists = f.exists();
            if (fileExists) {
                return true;
            }
        }

        return false;
    }

    private boolean checkForMalicIoUsPaths() {
        for (String path : malicIoUsPaths) {
            File f = new File(path);
            boolean fileExists = f.exists();
            if (fileExists) {
                return true;
            }
        }

        return false;
    }

    private static boolean checkSUonPath() {
        for (String pathDir : System.getenv("PATH").split(":")) {
            if (new File(pathDir,"su").exists()) {
                return true;
            }
        }
        return false;
    }

    private String[] propsReader() {
        InputStream inputstream = null;
        try {
            inputstream = Runtime.getRuntime().exec("getprop").getInputStream();
        } catch (IOException e) {
            e.printstacktrace();
        }
        String propval = "";
        try {
            propval = new Scanner(inputstream).useDelimiter("\\A").next();

        } catch (NoSuchElementException e) {

        }

        return propval.split("\n");
    }

    private String[] mountReader() {
        InputStream inputstream = null;
        try {
            inputstream = Runtime.getRuntime().exec("mount").getInputStream();
        } catch (IOException e) {
            e.printstacktrace();
        }


        if (inputstream == null) return null;

        String propval = "";
        try {
            propval = new Scanner(inputstream).useDelimiter("\\A").next();
        } catch (NoSuchElementException e) {
            e.printstacktrace();
        }

        return propval.split("\n");
    }

    private boolean isAnyPackageFromListInstalled(List<String> packages) {

        PackageManager pm = activity.getPackageManager();

        for (String packageName : packages) {
            try {
                pm.getPackageInfo(packageName,0);
                return true;
            } catch (PackageManager.NameNotFoundException e) {

            }
        }
        return false;
    }

    private boolean checkForDangerousProps() {

        final Map<String,String> dangerousProps = new HashMap<>();
        dangerousProps.put("ro.debuggable","1");
        dangerousProps.put("ro.secure","0");

        String[] lines = propsReader();
        for (String line : lines) {
            for (String key : dangerousProps.keySet()) {
                if (line.contains(key)) {
                    String badValue = dangerousProps.get(key);
                    badValue = "[" + badValue + "]";
                    if (line.contains(badValue)) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    private boolean checkForRWPaths() {

        String[] lines = mountReader();
        for (String line : lines) {
            String[] args = line.split(" ");

            if (args.length < 4) {
                continue;
            }

            String mountPoint = args[1];
            String mountOptions = args[3];

            for (String pathtocheck : pathsThatShouldNotBeWrtiable) {
                if (mountPoint.equalsIgnoreCase(pathtocheck)) {
                    for (String option : mountOptions.split(",")) {

                        if (option.equalsIgnoreCase("rw")) {
                            return true;
                        }
                    }
                }
            }
        }

        return false;
    }

    private boolean checkSuExists() {
        Process process = null;
        try {
            process = Runtime.getRuntime().exec(new String[]{"which","su"});
            BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
            return in.readLine() != null;
        } catch (Throwable t) {
            return false;
        } finally {
            if (process != null) process.destroy();
        }
    }

}

但是现在为了提高安全性,我想在本机C ++ JNI代码中执行此根检测逻辑。我设法将程序包检测代码迁移到JNI C,但是找不到关于这3个功能的任何信息

checkForDangerousProps(),checkForRWPaths(),checkSuExists()

这3个使用无法找到的Runtime.getRuntime()。exec。有人可以从上述代码中帮助我将这三种逻辑转换为JNI C吗?帮助将不胜感激。

请大家帮忙。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)