Android开放系统root权限,即使任何用户都可以执行su程序,以使得临时用户也具有了root的权限,然后去进行一些系统级的设置,如设置IP地址,DNS等。
1、修改su程序对临时用户的限制,默认su只允许root和shell用户执行
vi system/extras/su/su.c
注释掉语句块
- /*
- myuid = getuid();
- if (myuid
!= AID_ROOT
&& myuid
!= AID_SHELL)
{ - fprintf(stderr,"su: uid %d not allowed to su\n", myuid);
- return 1;
- }
- */
就安全性而言这种方式是不太可取的,因此才有了类似于superuser.apk的出现,它们的作用就是在外面再提供一层保护。
2、修改su程序的suid,可以通过ls -l来查看,在system/core/rootdir/init.rc中添加语句
chmod 4755 /system/xbin/su
3、如果涉及到/data目录而非/data/data/<你的包名>/的修改,则修改system/core/rootdir/init.rc
将 mount yaffs2 mtd@userdata /data nosuid nodev 改为 mount yaffs2 mtd@userdata /data nodev
4、通过java app进行验证
- package com.test;
- import java.io.DataOutputStream;
- import java.io.IOException;
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Log;
- public class TestActivity
extends Activity
{ - /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState)
{ - super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- try {
- Process process
= Runtime.getRuntime().exec("su");//(这里执行是系统已经开放了root权限,而不是说通过执行这句来获得root权限) - DataOutputStream os
= new DataOutputStream(process.getOutputStream()); - os.writeBytes("ifconfig eth0 192.168.18.122\n");
- os.writeBytes("exit\n");
- os.flush();
- } catch
(IOException e)
{ - e.printStackTrace();
- }
- }
- }