edit_note帖子
256
stars积分
259,690
event加入
2011-10-05
安卓交流
安卓高级教程之获取root原理解析系列四
schedule发表于 2013-05-10 16:40:00
visibility查看 464
chat_bubble回复 10
#1 楼主
上文说过,root的本质就是往 /system/bin/ 下放一个su文件,不检查调用者权限的su文件。普通程序可以调用该su来运行root权限的命令。superuser.apk中就自带了一个这样的su程序。一开始superuser会检测/system/bin/su是否存在:
File su = new File(“/system/bin/su“);
// 检测su文件是否存在,如果不存在则直接返回
if (!su.exists()) {
Toast toast = Toast.makeText(this, “Unable to find /system/bin/su.“, Toast.LENGTH_LONG);
toast.show();
return;
}
//如果大小一样,则认为su文件正确,直接返回了事。
if (su.length() == suStream.available())
{
suStream.close();
return; //
}
// 如果检测到/system/bin/su 文件存在,但是不对头,则把自带的su先写到“/data/data/com.koushikdutta.superuser/su“
//再写到/system/bin/su。
byte[] bytes = new byte[suStream.available()];
DataInputStream dis = new DataInputStream(suStream);
dis.readFully(bytes);
FileOutputStream suOutStream = new FileOutputStream(“/data/data/com.koushikdutta.superuser/su“);
suOutStream.write(bytes);
suOutStream.close();
Process process = Runtime.getRuntime().*(“su“);
File su = new File(“/system/bin/su“);
// 检测su文件是否存在,如果不存在则直接返回
if (!su.exists()) {
Toast toast = Toast.makeText(this, “Unable to find /system/bin/su.“, Toast.LENGTH_LONG);
toast.show();
return;
}
//如果大小一样,则认为su文件正确,直接返回了事。
if (su.length() == suStream.available())
{
suStream.close();
return; //
}
// 如果检测到/system/bin/su 文件存在,但是不对头,则把自带的su先写到“/data/data/com.koushikdutta.superuser/su“
//再写到/system/bin/su。
byte[] bytes = new byte[suStream.available()];
DataInputStream dis = new DataInputStream(suStream);
dis.readFully(bytes);
FileOutputStream suOutStream = new FileOutputStream(“/data/data/com.koushikdutta.superuser/su“);
suOutStream.write(bytes);
suOutStream.close();
Process process = Runtime.getRuntime().*(“su“);
全部回复 (10)
2013-05-10 21:40:00
沙发
这帖不错,该顶
2013-05-12 08:34:00
板凳
看帖回帖是美德!
2013-05-12 10:14:00
地板
安卓我最行!任溶溶
2013-05-19 15:55:00
#5
安卓的世界,我的世界
2013-08-29 15:29:00
#6
rootw
2013-09-29 13:35:00
#7
1555555
2013-11-16 14:26:00
#8
额呃呃呃
2013-12-25 22:52:00
#9
刚刚好复古代
2013-12-25 23:19:00
#10
看看
登录 后才能回复
flag举报帖子