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

时间:2011-01-22 16:17:49

标签: android security root

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

有谁知道:

1)是否可以阻止在root设备上安装应用程序?我读了一些关于Android Market的“版权保护机制”的内容。此功能似乎已过时,并由许可功能取代。但是,许可只适用于付费应用程序,我的免费......

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

对此主题的任何帮助表示赞赏!

7 个答案:

答案 0 :(得分:9)

执行

Runtime.getRuntime().exec("su");

并检查结果代码。

换句话说,如果您可以执行su,那么您具有root访问权限。如果用户允许或拒绝它并不重要,那么你有答案。

答案 1 :(得分:6)

我认为你的方法有点缺陷。首先,用户可以先安装您的应用程序和数据,然后“root”设备(即使root用户擦除数据,也可以先备份)。接下来,一般规则是用户手中的任何东西都不再属于你了。黑客迟早会找到一种方法来获取您的数据。

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

答案 2 :(得分:4)

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

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

  1. 他们拒绝您的应用权限。
  2. 他们没有扎根。
  3. 现在,拒绝权限(和root)意味着他们拥有某种SUPERUSER管理应用程序,这就是下一部分的用武之地。

    然后我会继续使用PackageManager来检索所有包的列表,然后根据可用的极少数超级用户管理应用程序(即Koush,ChainsDD和Chainfire

    )进行检查。

    相关的包名是:

    1. com.noshufou.android.su
    2. eu.chainfire.supersu
    3. com.koushikdutta.superuser

答案 3 :(得分:3)

如果您尝试为用户保护数据,那么他们的业务就是担心其他应用。 如果您试图保护 用户的数据,那么您将它放在自己的设备上有什么业务?

要回答您的问题,他们可以控制机器,因此希望他们能够捕获对API的任何调用,检查“这是否已植根?”并欺骗你。相反,使用客户端已知的密钥对客户端上的数据进行加密,但是在不知情的地方和方式下进行加密是非常明显的。一般来说,无论是谁在寻找都会让事情变得烦人。

享受随后的重击游戏。每当有人碰到它,你就会做出更好的修复,它们会做出更好的破解,并且一路上你将会提高它的破解力

不要与自由作斗争 - 为什么要用免费设备拒绝客户呢? - 相反,如果你想要一个特定的结果,那就麻烦得到数据>获取数据的价值。那就不会发生了。如果您确实必须具有万无一失的安全性,请保留数据服务器端。

答案 4 :(得分:3)

使用那些可以帮助您检查root

的方法
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
}

例如,如果设备已植根

,您可以强制停止应用

答案 5 :(得分:0)

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

对于客户端检查,您根本不能依赖程序化方法来检测您是否在root设备上运行 - 客户端代码中的任何内容都可以被攻击并被删除。你会惊讶于修改甚至是Proguard混淆的代码是多么容易。最多,你强迫黑客花几个小时或几天来编辑代码并重新编译。这是通过默默无闻的安全性,而不是一种可行的保护机制。

答案 6 :(得分:0)

1)没有。你怎么会拒绝安装?为什么有根设备拒绝安装用户想要在fs上安装的东西?作为生根的一个重点,你可以使设备基本上做任何事情。

2)没有。不适合你的目的。您可以通过常规方法检查您是否可以获得应用程序的root权限。所以你可以检查一下肯定的,但你不能从你的应用程序中以编程方式证明它没有根源。

另外,如果您可以制作完美的复制保护drm系统,那么您可能也会错过用户可以更改应用程序,删除根检查的要点。如果您有某种校验和/ crc检查,用户也可以伪造其结果。