Android应用程序不得在根设备上运行

Android应用程序不得在根设备上运行,android,security,root,Android,Security,Root,我正在编写一个不能在根设备上运行的应用程序。我想存储一些安全的数据,这只能在非根设备上实现,因为没有人可以访问/data/data/package name中的文件 有谁知道: 1)是否可以阻止在根设备上安装应用程序?我读了一些关于Android Market的“拷贝保护机制”的文章。此功能似乎已过时,已被许可功能取代。然而,许可证是唯一可能的付费应用和我的是免费的 2)是否可以通过编程方式检查设备是否为根设备?如果有可能这样做,我可以简单地停止应用程序,如果设备是根 if (isRooted(

我正在编写一个不能在根设备上运行的应用程序。我想存储一些安全的数据,这只能在非根设备上实现,因为没有人可以访问/data/data/package name中的文件

有谁知道:

1)是否可以阻止在根设备上安装应用程序?我读了一些关于Android Market的“拷贝保护机制”的文章。此功能似乎已过时,已被许可功能取代。然而,许可证是唯一可能的付费应用和我的是免费的

2)是否可以通过编程方式检查设备是否为根设备?如果有可能这样做,我可以简单地停止应用程序,如果设备是根

if (isRooted() == true){
//Do something to prevent run this app on the device

}
else{
//Do nothing and run app normally
}

任何有关此主题的帮助都将不胜感激

我认为你的方法有点缺陷。首先,用户可以先安装应用程序和数据,然后“根”设备(即使根清除数据,也可以先进行备份)。其次,一般规则是,用户手中的任何东西都不再是你的。黑客迟早会找到办法获取你的数据

如果您关心安全数据,请不要将其放入设备。由于Android是以网络为中心的设备(是的,我知道,这是主观的,但它最初是这样开发和定位的),因此在线访问数据并不少见。

Runtime.getRuntime().exec("su");
并检查结果代码


换句话说,如果您可以执行su,那么您就拥有root访问权限。不管用户是否允许,你都有你的答案。

如果你试图为用户保护数据,他们的业务就是担心其他应用程序。
如果您试图保护用户的数据,您有什么业务可以将其放在他们的设备上

为了回答您的问题,他们控制着机器,所以希望他们能够捕获对API的任何调用,检查“这是根吗?”并对您撒谎。相反,使用客户机已知的密钥加密客户机上的数据,但要使其不明显地显示您在何处以及如何进行加密。通常,无论是谁在看,都会让事情变得烦人

享受接下来的打鼹鼠游戏。每次有人破门而入,你会做出更好的修复,他们会做出更好的破门而入,一路上你都会提高破门而入的门槛


不要与自由抗争——无论如何,你为什么要拒绝拥有免费设备的客户呢相反,若你们想要一个特定的结果,那个么就麻烦你们去获取数据>获取数据的价值。那就不会发生了。如果您真的必须具有防傻瓜的安全性,请将数据保留在服务器端。

我认为传统拷贝保护的“缺点”之一是它不允许应用程序安装在根设备上,但它也有自己的问题,很快就会被弃用


至于客户端检查,您不能简单地依赖编程方法来检测您是否在根设备上运行——客户端代码中的任何内容都可能被黑客攻击并删除。您会惊讶地发现,即使是修改Proguard模糊代码也很容易。充其量,你强迫黑客花几个小时或几天来编辑代码并重新编译。这是通过模糊实现的安全性,而不是可行的保护机制。

我要说的是运行
su
,然后检查输出。如果用户允许您的应用程序具有root,则使用root卸载您自己的应用程序(一种方法可能是将脚本放入
init.d
,然后强制重新启动)

如果用户不允许您的应用以root用户身份运行,则:

  • 他们拒绝了你的应用权限
  • 它们没有生根
  • 现在,拒绝权限(和根权限)意味着他们拥有某种超级用户管理应用程序,这就是下一部分的内容

    然后,我将继续使用
    PackageManager
    检索所有软件包的列表,然后对照可用的少数超级用户管理应用程序检查它们,即Koush、ChainsDD和Chainfire提供的应用程序

    相关软件包名称如下:

  • com.noshufou.android.su
  • eu.chainfire.supersu
  • com.koushikdutta.superuser

  • 使用那些有助于检查根目录的方法

    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;
        }
    
        private static boolean isRooted() {
            return findBinary("su");
        }
    
    现在尝试检查设备是否已根目录

    if (isRooted() == true){
    //Do something to prevent run this app on the device
    
    }
    else{
    //Do nothing and run app normally
    }
    
    例如,如果设备是根设备,您可以强制停止应用程序。否。您如何拒绝安装?为什么根设备会拒绝安装用户想要在fs上安装的东西?作为根的全部要点,你可以让设备基本上做任何事情

    2) 不,不是为了你的目的。您可以检查是否可以通过常用方法获得应用程序的root。因此,您可以检查一个正值,但无法从应用程序中以编程方式证明它没有根


    此外,如果您可以制作完美的复制保护drm系统,您所要问的问题是,您可能还忽略了一点,即用户可以更改您的应用程序,删除根检查。如果你有某种校验和/crc校验,用户也可以伪造结果。

    市场说它很快就会被弃用,但如果你没有其他解决方案,现在还没有,你现在可以使用它。这是许多不可能的。更不用说有根目录意味着你可能无论如何都可以绕过大多数安全措施。这就是为什么我在寻找一种方法,使应用程序不安装在根目录设备上…@Peter:这里有一种循环论证。我的意思是,您为避免在根设备上安装它而采取的任何安全措施都可以通过拥有根权限来绕过。@kcopock:好的,现在我明白您的意思了:-)我认为使用runtime.exec(“su”)会有很大帮助。每次启动应用程序时检查设备是否正常