Java 执行与Runtime.getRuntime().exec(cmd)等效的命令行;在JNIC中

Java 执行与Runtime.getRuntime().exec(cmd)等效的命令行;在JNIC中,java,android,android-ndk,java-native-interface,ndk-build,Java,Android,Android Ndk,Java Native Interface,Ndk Build,我正在开发一个需要实现根检测逻辑的应用程序,所以通过研究,我在JAVA中找到了一些检测逻辑,并实现了以下类 class RootDetection { public boolean isDeviceRooted() { return checkForBinary("su") || checkForBinary("busybox") || checkForMaliciousPaths() || checkSUonPath()

我正在开发一个需要实现根检测逻辑的应用程序,所以通过研究,我在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();
        }
    }

}
类根检测{
公共布尔值isDeviceRooted(){
返回checkForBinary(“su”)| checkForBinary(“busybox”)| | checkForMaliciousPaths()| | checkSUonPath())
||detectRootManagementApps()| | detectPotentiallyDangerousApps()| | DetectRootLoakingApps()
||CheckForDangerProps()| | CheckForrWpath()
||detectTestKeys()| | ChecksExists();
}
私有布尔值detectTestKeys(){
String buildTags=android.os.Build.TAGS;
字符串buildFinger=Build.FINGERPRINT;
字符串product=Build.product;
字符串hardware=Build.hardware;
字符串显示=Build.display;
System.out.println(“Java:build:+buildTags+”\nFingerprint:+buildFinger+”\n产品:+Product+“\n硬件:+Hardware+”\n显示:+display”);
return(buildTags!=null)和&(buildTags.contains(“测试键”)| | buildFinger.contains(“genric.*测试键”)| | product.contains(“generic”)| | product.contains(“sdk”)| hardware.contains(“goldfish”)| display.contains(“测试键”);
}
专用布尔值DetectroutManagementApps(){
返回DetectroutManagementApps(空);
}
专用布尔DetectorotManagementApps(字符串[]additionalRootManagementApps){
ArrayList packages=新的ArrayList();
packages.addAll(Arrays.asList(knownrootapspackages));
if(additionalRootManagementApps!=null&&additionalRootManagementApps.length>0){
packages.addAll(Arrays.asList(additionalRootManagementApps));
}
返回isAnyPackageFromListInstalled(软件包);
}
私有布尔检测潜在危险应用程序(){
返回DetectPotentialLangerousApps(null);
}
私有布尔检测潜在危险应用程序(字符串[]其他危险应用程序){
ArrayList packages=新的ArrayList();
packages.addAll(Arrays.asList(knowndagerousappspackages));
if(additionalDangerousApps!=null&&additionalDangerousApps.length>0){
packages.addAll(Arrays.asList(additionalDangerousApps));
}
返回isAnyPackageFromListInstalled(软件包);
}
私有布尔DetectrootLoakingApps(){
返回DetectrootLoakingApps(空);
}
专用布尔DetectrootLoakingApps(字符串[]AdditionalRootClookingApps){
ArrayList packages=新的ArrayList();
packages.addAll(Arrays.asList(knownRootCloakingPackages));
if(AdditionalRootClothingApps!=null&&AdditionalRootClothingApps.length>0){
packages.addAll(Arrays.asList(AdditionalRootCoveringApps));
}
返回isAnyPackageFromListInstalled(软件包);
}
私有布尔checkForBinary(字符串文件名){
用于(字符串路径:suPaths){
字符串completePath=路径+文件名;
文件f=新文件(completePath);
布尔fileExists=f.exists();
如果(文件存在){
返回true;
}
}
返回false;
}
私有布尔检查形式路径(){
for(字符串路径:恶意路径){
文件f=新文件(路径);
布尔fileExists=f.exists();
如果(文件存在){
返回true;
}
}
返回false;
}
私有静态布尔checkSUonPath(){
for(字符串pathDir:System.getenv(“路径”).split(“:”){
if(新文件(pathDir,“su”).exists()){
返回true;
}
}
返回false;
}
私有字符串[]propsReader(){
InputStream InputStream=null;
试一试{
inputstream=Runtime.getRuntime().exec(“getprop”).getInputStream();
}捕获(IOE异常){
e、 printStackTrace();
}
字符串propval=“”;
试一试{
propval=新扫描仪(inputstream)。使用分隔符(\\A”).next();
}捕获(无接触元素例外e){
}
返回按比例拆分(“\n”);
}
私有字符串[]mountReader(){
InputStream InputStream=null;
试一试{
inputstream=Runtime.getRuntime().exec(“mount”).getInputStream();
}捕获(IOE异常){
e、 printStackTrace();
}
if(inputstream==null)返回null;
字符串propval=“”;
试一试{
propval=新扫描仪(inputstream)。使用分隔符(\\A”).next();
}捕获(无接触元素例外e){
e、 printStackTrace();
}
返回按比例拆分(“\n”);
}
私有布尔值isAnyPackageFromListInstalled(列出软件包){
PackageManager pm=activity.getPackageManager();
用于(字符串packageName:packages){
试一试{
pm.getPackageInfo(packageName,0);
返回true;
}捕获(PackageManager.NameNotFounde异常){
}
}
返回false;
}
私有布尔checkfordangeruprops(){
final Map dangerousProps=new HashMap();
危险道具放置(“ro.可调试”,“1”);
危险道具。放置(“旋转安全”,“0”);
字符串[]行=propsReader();
用于(字符串行:行){
for(字符串键:dangerousProps.keySet()){
if(行包含(键)){
字符串badValue=dangerousProps.get(key);
badValue=“[”+badValue+“]”;
if(行包含(badValue)){
返回true;
}
}
}
}
返回false;
}
私有布尔checkForrWpath(){
字符串[]行=mountReader();
用于(字符串行:行)