Android系统Root原理初探——学习笔记

从慕课网上学习《Android系统Root原理初探》时记录的笔记。只进行了学习,还未实践过。

1. 了解Root

普通用户登录,命令行以$开始。从普通用户提升到root用户,使用su命令。/etc/profile是系统的环境变量配置文件,需要root用户才有权限操作。
操作系统使用的是Linux内核+文件系统(ext3/4),就是Linux系统,如Android系统。
Linux驱动:按照Linux驱动接口(Linux安装和运行规范,属于二进制规范),实现与硬件的通信。通过配置菜单可以安装驱动,和卸载几乎所有的驱动。

2. 为什么需要Root权限

/data/app:存放的是用户自己安装的软件,用户可编辑
/system/app:存放的是系统的软件,或预装软件,需要root才能操作本目录
修改/system/app内容的方法:
1、获取root权限(简单,推荐)
2、通过Android ROM方式
3、通过Recovery升级包
用户Root权限的好处:
·调试Linux驱动。可直接在手机上调试驱动,若调试失败无法启动系统,重刷ROM即可
·修改Android设备的启动画面
·…

3. 提取Root权限的步骤

Root步骤:
1、刷Recovery
·在bootloader模式下复制整个的文件系统
·在recovery模式下,将文件复制到Android设备指定的目录
如果复制整个文件系统,选第1种,如果复制一部分,选第2种。
2、改造su命令
Android系统自带的su命令只允许root和shell用户调用。shell是使用数据线连接后,通过adb shell命令进入设备终端所拥有的权限。每个adb是一个普通的用户,无法执行su命令,必须通过源代码改造su,才能执行su命令
3、制作Recovery刷机文件(刷机包)
zip格式的压缩包:待复制的文件 + 脚本文件(Edify语言编写,用于对文件进行各种操作)
4、执行su命令提取root权限
改造后的su命令,可被终端和APP调用,由$变成#
5、制作拥有root权限的ROM
让设备进入即拥有root权限,无需再使用su命令

4. 刷一个很酷的Recovery

刷机
Clockwork Recovery
使用最广的刷机包,且支持触摸操作
http://www.clockworkmod.com/rommanager

进入目录:cd [目录]
查看目录文件列表:ls
查看设备连接数量:adb devices
进入bootloader模式(或快捷键:电源键+音量下):adb reboot bootloader
fastboot命令(只能在bootloader下使用)
刷机:fastboot flash recovery recovery-clockwork-touch-6.0.4.3-grouper.img
重启设备到正常模式下:fastboot reboot

危险命令:
fastboot flash bootloader bootloader.img
如果bootloader.img正常且匹配设备,此命令安全,否则成砖
fastboot erase bootloader
擦除bootloader,立马成砖

5. Edify语言简介

1、ui_print
原型:ui_print(msg1,…,msgN);
功能:在Recovery界面输出字符串,其中msg1,。。。,msgN表示
N个字符串参数该函数至少需要指定一个参数,如果指定多个参数,会将这些参数值连起来输出
用法:ui_print(“hello world”);

2、run_program
原型:run_program(prog,msg1,…,msgN);
功能:该函数用于执行程序,其中prog参数表示要执行的程序文件(要写完整路径),arg1,。。,argN
表示要执行程序的参数,prog参数是必须的。
用法:run_program(“/sbin/busybox”,”mount”,”/system”);

3、delete
原型:delet(file1,file2,….,fileN);
功能:该函数用于删除一个或者多个文件,其中file1,file2.。。表示要删除的文件路径,至少要指定一个文件
用法:delete(“/system/xbin/su”);

4、package_extract_dir
原型:package_extract_dir(package_path.destination_path);
功能:用于提取刷机包中package_path指定目录的所有文件到destination_path指定目录,其中package_path
参数表示刷机包中的目录,destination_path参数表示目标目录
用法:package_extract_dir(“system”,”/system”);

5、set_perm
原型:set_perm(uid,gid,mode,file1,file2,…,fileN);
功能:用于设置一个或者多个文件的权限,其中uid参数表示用户ID,gid表示用户组ID,如果想让文件的用户和
用户组都是root,uid和gid都需要设置为0. mode参数表示设置的权限,与chmod命令类似
用法:set_perm(0,0,0777,”/system/xbin.su”);

6、mount
原型:mount(fs_type,partition_type,location,mount_point);
功能:挂载分区
用法:mount(“etc4”,”EMMC”,”/dev/block/platform/s3c-sdhci.0/by-name/system”,”/system”);

7、umount
原型:umount(mount_point);
功能:解除文件系统的挂载,其中umount_point参数,表示文件系统
用法:umount(“/system”);

6. 编写updater-script脚本文件

这里写图片描述

7. 制作Recovery升级包

包含两个目录:
META-INF/com/google/android:存放updater-script脚本文件
system/xbin:存放su文件
但,这些相关文件从哪里获取???(从现成的Recovery升级包中拷贝过来)

把两个文件压缩成zip文件

8. 复制su命令到/system/xbin目录

把Recovery刷机包(upadate.zip)复制到Android设备上
1、进入Recovery模式。两种进入方法
·adb reboot recovery
·在bootloader模式下直接进入。可通过音量上下键切换进入正常系统,还是Recovery模式

2、进入Recovery模式后,两种复制方法
·install zip from sdcard
把Recovery升级包先复制到sdcard目录下,选择此方法
·install zip from sideload
不先复制到sdcard中,直接从电脑上拷贝过去。进入后使用命令:adb sideload update.zip

?
使用第2种方法,电脑上的update.zip应放在什么位置?

9. 利用su命令获取Root权限

提取Root权限,两种方法

1、在Android设备终端中执行su命令
进入终端:adb shell
进入Root权限:su
进入/system/app目录(本目录存放所有系统应用程序的apk文件,默认为只读):cd /system/app
查看列表:ls
创建目录:mkdir test
查看物理路径:mount | grep system
/dev/block/platform/sdhci-tegra.3/by-name/APP —— 物理路径
/system —— 挂载点
ext4 —— 文件系统
ro —— read only,只读权限
修改为可读写权限:mount -o rw,remount /dev/block/platform/sdhci-tegra.3/by-name/APP /system
修改为只读权限:mount -o ro,remount /dev/block/platform/sdhci-tegra.3/by-name/APP /system
为了安全,在操作完后,最好关闭权限,修改成只读

2、在App中调用su命令
try {
Process process = Runtime.getRuntime().exec(“su”);
OutputStream os = process.getOutputStream();
os.write(“ls /system/app”.getBytes());

os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
}

10. 修改Android设置的启动动画

方法:
替换/system/media目录下的bootanimation.zip文件即可(需要Root权限)

bootanimation.zip目录结构:
desc.txt
part0
part1

desc.txt文件结构:
[width] [height] [frame-rate]
p [loop] [pause] [folder]
p [loop] [pause] [folder]

p [loop] [pause] [folder]
这里写图片描述

11. su命令原理分析

位置:【Android源代码根目录】/system/extras/su/su.c

主要分析main函数:

// 代表当前调用su命令的必须是root,或shell(在安卓设备中执行su命令的终端程序用户)
// 但是我们执行su命令,就是为了获取root,所以肯定不是root用户。而shell用户只有在安卓设备终端执行su命令才可以
// 对于app来说,每一个app都对应着一个用户,这些用户既不是root,也不是shell。
// 所以要使app通过su命令获取root权限,需去掉此条件
49: if (myuid != AID_ROOT && myuid != AID_SHELL){
return 1;
}


// uid-用户,gid-用户组
// 这里的0代表root用户和root用户组
// 说明如果su命令不带参数,就会切换到root用户
55: if(argc < 2){
56: uid = gid = 0;

// 获取指定用户(argv[1])的数据,passwd结构体
58: pw = getpwnam(argv[1]);
...
// 如果未成功获取指定用户数据,则认为第一个参数是用户id,不是用户名
if(pw == 0)
uid = gid = atoi(argv[1]); // atoi()转换成整数

/*
如:获取root的数据
#include <pwd.h>
#include <sys/types.h>
main(){
struct passwd *user;
user = getpwnam("root");
// 输出用户名
printf("name:%s\n", user->pw_name);
// 输出用户id
printf("uid:%id\n", user->pw_uid);
// 输出用户的登录目录,也就是进入终端后默认的目录
printf("home:%s\n", user->pw_dir);
}

su命令的使用:
su
su root
su 100
su user1
*/

// 将当前进程替换为一个新进程,即进入一个新的shell。
/* 如在终端中执行如下命令:
abd shell ——进shell
su ——进root,进入一个新的shell
exit ——退出root的shell,回到普通用户的shell
*/
execlp("/system/bin/sh", "sh", NULL);

编译su.c文件
1、执行脚本文件:build/envsetup.sh
2、进入su目录,执行mm命令编译su.c

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值