2026年10月28日 · 今日 0 帖 · 会员 6.1万 · 主题 17.4万
登录 · 注册 · 游客,欢迎随便逛逛
返回版块
JK-0098594
Lv5甘首五朝臣等级图标等级图标
勋章勋章
帖子
21
回复
611
积分
8,130
注册
2012-03-10
[安卓交流]

[安卓技术]安卓高级教程之获取root原理解析系列五

[复制链接]
查看 421 回复 6
楼主 发表于 | 只看该作者
3 人收藏

DataOutputStream os = new DataOutputStream(process.getOutputStream());

os.writeBytes(“mount -oremount,rw /dev/block/mtdblock3 /system\n“);

os.writeBytes(“busybox cp /data/data/com.koushikdutta.superuser/su /system/bin/su\n“);

os.writeBytes(“busybox chown 0:0 /system/bin/su\n“);

os.writeBytes(“chmod 4755 /system/bin/su\n“);

os.writeBytes(“exit\n“);

os.flush();

有进程使用root权限,superuser是怎么知道的呢,关键是句:

sprintf(sysCmd, “am start -a android.intent.action.MAIN

-n com.koushikdutta.superuser/com.koushikdutta.superuser.SuperuserRequestActivity

--ei uid %d --ei pid %d > /dev/null“, g_puid, ppid);

if (system(sysCmd))

return *utionFailure(“am.“);

原理是am命令,am的用法:

usage: am [sub*]

start an Activity: am start <INTENT>

-D: enable debugging

-W: wait for launch to complete

start a Service: am startservice <INTENT>

send a broadcast Intent: am broadcast <INTENT>

start an Instrumentation: am instrument <COMPONENT>

-r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT) -e <NAME> <VALUE>: set argument <NAME> to <VALUE>

-p <FILE>: write profiling data to <FILE>

-w: wait for instrumentation to finish before returning

start profiling: am profile <PROCESS> start <FILE>

stop profiling: am profile <PROCESS> stop

<INTENT> specifications include these flags:

[-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]

[-c <CATEGORY> [-c <CATEGORY>] ...]

[-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]

[--esn <EXTRA_KEY> ...]

[--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]

[-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]

[-n <COMPONENT>] [-f <FLAGS>]

[--grant-read-uri-permission] [--grant-write-uri-permission]

[--activity-brought-to-front]

[--activity-clear-when-task-reset] [--activity-exclude-from-recents]

[--activity-launched-from-history]

[--activity-no-user-action] [--activity-previous-is-top] [--activity-reorder-to-front] [--activity-reset-task-if-needed]

[--receiver-registered-only] [--receiver-replace-pending]

[<URI>]

还有个疑点,就是su怎么知道用户是允许root权限还是反对呢?原来是上面提到的白名单起来作用,superuser把用户的选择放入:

/data/data/com.koushikdutta.superuser/databases/superuser.sqlite 数据库中,然后su进程再去读该数据库来判断是否允许。

static int checkWhitelist()

{

sqlite3 *db;

int rc = sqlite3_open_v2(DBPATH, &db, SQLITE_OPEN_READWRITE, NULL);

if (!rc)

{

char *errorMessage;

char query;

sprintf(query, “* * from whitelist where _id=%d limit 1;“, g_puid);

struct whitelistCall* call*;

call*.count = 0;

call*.db = db;

rc = sqlite3_*(db, query, whitelistCallback, &call*, &errorMessage);

if (rc != SQLITE_OK)

{

sqlite3_close(db);

return 0;

} sqlite3_close(db);

return call*.count;

}

sqlite3_close(db);

return 0;

}

四、 资源文件的获取

从上文的源码地址获取源代码,替换系统的system/extras/su/下面的su.c 和Android.mk文件,使用编译命令./mk td28 u adr system/extras/su/ 编译成功后会生成out/target/product/hsdroid/system/xbin/su 文件,而Superuser.apk就是普通的apk文件,都在源码地址里面可以下载,下载后倒入到eclipse即可直接运行。

五、 总结

在阅读完本文后,可以站在专业的角度了解root的真正原理,以及有用户有需求时我们可以帮助其快速的解决问题。

登录回复
JK-0007778
Lv4莫问四书意等级图标等级图标等级图标等级图标等级图标
帖子
19
回复
586
积分
2,730
注册
2011-01-26
1 楼

祝安卓论坛越来越好!

JK-0076284
Lv6胸怀六国志等级图标等级图标等级图标
勋章勋章勋章勋章勋章勋章
帖子
25
回复
1,796
积分
26万
注册
2011-10-05
2 楼

安卓我最行!

JK-0126641
Lv3畅意三江水等级图标
帖子
2
回复
367
积分
5,775
注册
2012-11-06
3 楼

你牛,我顶!

JK-0008905
Lv2独赏二月雪等级图标等级图标等级图标等级图标等级图标
帖子
1
回复
500
积分
3,158
注册
2011-02-06
4 楼

这帖不错,该顶dd

JK-0130470
Lv2独赏二月雪等级图标
帖子
1
回复
251
积分
2,947
注册
2013-01-06
5 楼

安卓问题

JK-0087830
Lv5甘首五朝臣等级图标等级图标等级图标
勋章
帖子
47
回复
798
积分
5.9万
注册
2011-12-17
6 楼

安卓问题、内信52267

登录后可以回复这个帖子。旧账号可使用原密码登录。

登录 注册新号
← 返回版块