如何在应用程序中检测设备是否已经取得了root权限?

4

可能是重复的问题:
确定设备是否已root

在应用程序启动时,我想检测设备是否已经root。 有没有适当的方法来检测它?

我认为尝试写入一个文件到'\data'来判断是否已root不是一个好的解决方案。 (因为即使已root的设备也可能没有该路径的特权)

2个回答

5

总的来说,你无法做到。已经取得root权限的设备可以被任意修改,因此可以完全隐藏任何想要隐藏的内容。实际上,你可以查看一些标准的root版本以了解它们具有的功能或特点...但是没有办法保证你所做的任何事情都能检测出“已获取root权限”的设备。


这是否意味着已经root的设备也可能使下面的代码失败吗? Process proc = Runtime.getRuntime().exec("su"); - jclova
是的,有一些软件可以模拟手机未经root,通过不授予您超级用户访问权限的方式。 :) - AZ_
@hackbod在http://developer.android.com/guide/publishing/licensing.html#app-obfuscation上说:“例如,受版权保护的应用程序无法从市场下载到提供根访问权限的设备…”-那么如何进行根检查?是通过强大的混淆检查逻辑吗?谢谢。 - Mathias Conradt
该复制保护已经被弃用。 - hackbod

0

你可以尝试去做

Process proc = Runtime.getRuntime ().exec ( "su" );

如果抛出异常或 proc 为空,则表示它们没有 root。

2
不正确。这仅仅意味着在那次尝试中,该应用程序 没有被允许使用 这种特定的 启动根进程的机制。如果您在一个没有宣传自己是针对已经 root 的设备的应用程序中尝试这样做,很多用户会收到通知并感到非常惊慌,他们可能会将您的应用程序报告为恶意软件。 - Chris Stratton
1
我也不会使用那个解决方案。 - Kevin Parker
1
而且,使用带有SuperSU的设备时,会弹出“授予Root访问权限”对话框。 - Graeme
这将在第3或第4次应用程序运行时创建僵尸进程。这将减慢设备的速度,您肯定需要重新启动它。 - blueware
这也是一个非常糟糕的想法,就像在这里所述的一样:https://twitter.com/gsuberland/status/1029653985572077568 不仅无效而且存在安全漏洞。它通过执行su来检查su,因此如果您想在BitFi应用程序的上下文中运行进程,则可以通过将名为su的二进制文件放入路径中来实现。最后的destroy调用也不会终止进程。如果我记得正确,在Linux / Android上甚至可以删除正在运行的进程的二进制文件(不像在Windows上),因此恶意的su可以自我删除,并且应用程序将在重新启动时毫不知情。 - MarioVilas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接