安卓root原理

root原理

android就是一个linux系统,它的权限控制是通过用户来实现的,每个应用有一个用户,不同的用户有不同的权限。而root就是获取root用户权限的过程。
我们root手机的过程也就是获得手机最高使用权限的过程。同时为了防止不良软件也取得root用户的权限,当我们在root的过程中,还会给系统装一个程序,用来作为运行提示,由用户来决定,是否给予最高权限。这个程序的名字叫做Superuser.apk。当某些程序执行su指令想取得系统最高权限的时候,Superuser就会自动启动,拦截该动作并作出询问,当用户认为该程序可以安全使用的时候,那么我们就选择允许,否则,可以禁止该程序继续取得最高权限。

Root的过程其实就是把su文件放到/system/bin/ Superuser.apk 放到system/app下面,

还需要设置/system/bin/su可以让任意用户可运行,有set uid和set gid的权限。

即要在android机器上运行命令:adb shell chmod 4755 /system/bin/su。而通常,厂商是不会允许我们随便这么去做的,我们就需要利用操作系统的各种漏洞,来完成这个过程。

root过程

从步骤上来说,就跟往冰箱里放大象一样,统共分三步:

1
2
3
adb push su /system/bin  
adb push SuperUser.apk /system/app
adb shell chmod 4755 /system/bin/su

但是实际上没那么简单。

  • user版的/system 路径是只读权限,不能简单写入
  • chmod需要Root权才能运行(死循环了)
  • 有些系统在启动时会自动将su的4755权限设成755,甚至直接删除su

su被调用的时候,会先通过superuser询问用户,流程如下:
其流程是:

1
2
3
4
5
6
7
8
1.Su 被用户调用  
2.Su 创建了一个socket与SuperUser痛心
3.Su 向Superuser发送了一个广播,说是有一个程序要请求root
4.Su 等待socket 数据接收。有超时处理。
5.Superuser 界面收到广播后,弹出一个对话框,询问用户
6.Superuser 向传来的数据中的socket写回用户应答结果。
7.Su 根据socket得到的结果处理应该不应该继续执行
8.完成提权管理

superuser.apk这个程序是root成功后,专门用来管理root权限使用的,防止被恶意程序滥用。

superuser和su程序是如何通讯的?
superuser共有两个activity: SuperuserActivity和 SuperuserRequestActivity
其中SuperuserActivity主要是用来管理白名单的,就是记住哪个程序已经被允许使用root权限了,省的每次用时都问用户。
SuperuserRequestActivity 就是用来询问用户目前有个程序想使用root权限,是否允许,是否一直允许,即放入白名单。
这个白名单比较关键,是一个sqlite数据库文件,位置:

1
/data/data/com.koushikdutta.superuser/databases/superuser.sqlite

对模拟器进行root

需要下载SuperSU.apk和Recovery Flashable.zip

https://pan.baidu.com/s/1L3kyAQIY-wW0AffSkRKVhQ

一般模拟器程序在android sdk下面

1
2
3
4
localhost:emulator niuxinli$ pwd
/Users/niuxinli/Library/Android/sdk/emulator
localhost:emulator niuxinli$ ./emulator -list-avds
Nexus_5X_API_23


以可写的方式启动模拟器

1
2
3
4
5
6
7
8
9
10
11
localhost:emulator niuxinli$ ./emulator -avd Nexus_5X_API_23 -writable-system
emulator: WARNING: System image is writable
Hax is enabled
Hax ram_size 0x60000000
HAX is working and emulator runs in fast virt mode.
Your emulator is out of date, please update by launching Android Studio:
- Start Android Studio
- Select menu "Tools > Android > SDK Manager"
- Click "SDK Tools" tab
- Check "Android SDK Tools" checkbox
- Click "OK"

然后把su程序复制到/system/bin/里面

1
2
3
4
5
6
localhost:platform-tools niuxinli$ ./adb root
adbd is already running as root
localhost:platform-tools niuxinli$ ./adb remount
remount succeeded
localhost:platform-tools niuxinli$ ./adb -e push /Users/niuxinli/Downloads/SR5-SuperSU-v2.82-SR5-20171001224502/x64/su /system/bin/su
/Users/niuxinli/Downloads/SR5-SuperSU-...ed. 13.8 MB/s (104760 bytes in 0.007s)

修改su程序权限

1
2
3
4
adb shell
su root
cd /system/bin
chmod 06755 su

安装su并设置后台驻留,注意是两个横线

1
2
su --install
su --daemon&

关闭SE Linux

1
setenforce 0

安装supersu

1
2
3
4
localhost:platform-tools niuxinli$ ./adb install /Users/niuxinli/Downloads/eu.chainfire.supersu-2.82-SR4-282.apk 
/Users/niuxinli/Downloads/eu.chainfire...d. 49.9 MB/s (6352728 bytes in 0.121s)
pkg: /data/local/tmp/eu.chainfire.supersu-2.82-SR4-282.apk
Success

安装成功后,会提示更新,按normal方式更新即可。