Android SuperUser应用如何检测应用是否请求root?

我正在编写一个应用程序,它将使用su在linux内核中执行一些命令。 我想知道SuperUser如何确定应用程序是否要求root权限? 此外,是否有任何已知的方法(通过混淆)可以绕过此检查?

换句话说:Android /(超级用户)如何知道应用程序需要root权限,尽管在android清单文件中没有明确请求的权限。

我从安全的角度问这个问题。 我想了解其工作原理的详细信息,以确保恶意应用程序无法绕过SuperUser。

超级用户系统有两个部分 – 超级用户二进制文件 (终端上的su)和SuperUser.apk (使用su管理应用程序的Android应用程序)。 查看su二进制文件的源代码,当您通过请求su访问时

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

它通过android消息管理器发布一个应用程序请求超级用户访问的意图。

 sprintf(command, "/system/bin/am broadcast -a '%s' --es socket '%s' --ei caller_uid '%d' --ei allow '%d' --ei version_code '%d' > /dev/null",action, socket_path, ctx->from.uid, allow, VERSION_CODE); 

管理器应用程序侦听此意图并要求用户处理请求(允许/拒绝)。

当你运行这个:

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

您正在尝试执行“su”,只有具有超级用户权限的应用才能执行此操作! 因此,只要Android检测到您尝试运行“su”,就会发现应用程序需要超级用户权限。

此外,Android还保留了一些只有Android系统才能访问的区域。 如果您的应用尝试访问某些内容,Android会理解需要超级用户。

例如,假设您正在尝试修改主机文件或修改某些网络配置(如DHCP)。 或者您尝试从系统区域访问文件,例如/data Android将检查应用程序是否具有超级用户权限,然后仅授予其访问此类内容的权限。

关于恶意软件,只要应用程序需要超级用户访问权限,系统就会提示用户授予或拒绝应用程序的超级用户权限。 只有这样,应用才能获得root访问权限。 因此,由用户决定是否接受或拒绝任何应用程序的root访问权限。 ( 每当应用程序尝试访问需要root访问权限的内容时,系统都会提示用户, 除非您告诉系统记住您对特定应用程序的接受或拒绝选择。)

PS:您可以考虑查看超级用户应用程序的网站 。

实际上它很简单。 Vanilla Android甚至没有susuperuser 。 以root为根设备时,以root身份运行shell。 然后安装su binary和superuser.apk 。 安装完成后,将shell设置回正常权限。 所有这些仅限root的应用程序现在可以调用su来请求root访问权限。

su运行时,它会调用superuser.apk并显示一条消息,询问您是否要提升权限。 su二进制文件和superuser.apk通过Android的普通沙盒保护。 请注意,一旦您授予应用程序root权限,它就可以随意执行任何操作,包括使用自己的版本覆盖su。