Android中如何自己制作su

本文原博客:http://hubingforever.blog.163.com/blog/static/171040579201372915716149/

在Android源码的system\extras(比如Android4.0\system\extras)下新建一个目录,比如su_robin目录

在su_robin目录下包含以三个文件:

su.h文件


#ifndef SU_h 

#define SU_h 1

#ifdef LOG_TAG

#undef LOG_TAG

#endif

#define LOG_TAG "robin"

#define REQUESTOR "com.noshufou.android.su"

#define REQUESTOR_DATA_PATH "/data/data/" REQUESTOR

#define REQUESTOR_CACHE_PATH "/dev/" REQUESTOR

#define REQUESTOR_DATABASES_PATH REQUESTOR_DATA_PATH "/databases"

#define REQUESTOR_DATABASE_PATH REQUESTOR_DATABASES_PATH "/permissions.sqlite"

/* intent actions */

#define ACTION_REQUEST REQUESTOR ".REQUEST"

#define ACTION_RESULT  REQUESTOR ".RESULT"

#define DEFAULT_SHELL "/system/bin/sh"

#ifdef SU_LEGACY_BUILD

#define VERSION_EXTRA	"l"

#else

#define VERSION_EXTRA	""

#endif

#define VERSION "3.1.1" VERSION_EXTRA

#define VERSION_CODE 17

#define DATABASE_VERSION 6

#define PROTO_VERSION 0

struct su_initiator {

    pid_t pid;

    unsigned uid;

    char bin[PATH_MAX];

    char args[4096];

};

struct su_request {

    unsigned uid;

    int login;

    int keepenv;

    char *shell;

    char *command;

    char **argv;

    int argc;

    int optind;

};

struct su_context {

    struct su_initiator from;

    struct su_request to;

    mode_t umask;

};

enum {

    DB_INTERACTIVE,

    DB_DENY,

    DB_ALLOW

};

#endif

注意,这里的很多东西是多余。

su.c文件

#include <sys/types.h>

#include <sys/socket.h>

#include <sys/un.h>

#include <sys/wait.h>

#include <sys/select.h>

#include <sys/time.h>

#include <unistd.h>

#include <limits.h>

#include <fcntl.h>

#include <errno.h>

#include <endian.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <getopt.h>

#include <stdint.h>

#include <pwd.h>

#include <private/android_filesystem_config.h>

#include <cutils/properties.h>

#include <cutils/log.h>

#include "su.h"

int main(int argc, char *argv[])

{

LOGI("hello !robin-su begin %d !",getuid());

printf("hello !robin-su begin");

int uid=0;

int gid=0;

if(setgid(gid) || setuid(uid)) {

LOGI("robin su: permission denied\n");

fprintf(stderr,"su: permission denied\n");

return 1;

}

  char command[1024];

LOGI("hello !robin-su end %d !",getuid());

printf("hello !robin-su end");

/* Default exec shell. */

   execlp("/system/bin/sh", "sh", NULL);

   fprintf(stderr, "su: exec failed\n");

return 1;

}

Android.mk文件

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := sur

LOCAL_SRC_FILES := su.c

LOCAL_STATIC_LIBRARIES := \

    liblog \

    libc \

LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)

LOCAL_MODULE_TAGS := eng debug

LOCAL_FORCE_STATIC_EXECUTABLE := true

include $(BUILD_EXECUTABLE)

编译Android源码,生成rom

如果你还不知道如何编译Android源码,请参照

http://source.android.com/source/building-running.html

在out\target\product\generic\system\xbin目录下找到生成的可执行文件sur,就是我们自己制作的su文件

通过adb push命令将其推送到手机上的system\xbin目录,

通过执行系统原来自己带的su切换到root用户,对手机上sur文件执行chmod 6777 sur命令。

使文件属性变为rwsrwsrwx,如下所示

rwsrwsrwx root     root        58960 2013-08-29 11:31 sur

然后你可以通过执行系统原来自己带的sur切换到root用户

关于chmod 6777 sur命令请参考《chmod命令基本篇》和请参考《chmod命令高级篇(
SetUID与SetGID标识位)

关于setuid请参考《setuid()与setgid()的使用

结束!

Android中如何自己制作su

时间: 2024-11-10 14:53:59

Android中如何自己制作su的相关文章

Android中部署自己的su

本人博客原文 首先把你的自己的su的放到Android应用程序工程的assets目录,为了和系统的su区分,我自己的su文件叫做sur. 另外我这里没有考虑x86架构的cpu的手机. 废话不多说,直接上代码吧! Util.java文件 package cdut.robin.root.utils; import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io

IOS开发之类似Android中Toast效果制作

ios中没有类似于Androidtoast效果的提示,在提示用户的时候显得尤为不便,因此做了一个类似Toast的功能. UILabel *hintLabel = [[UILabel alloc] initWithFrame:CGRect(80,400,160,40)]; hintLabel.textAlignment = NSTextAlignmentCenter; hintLabel.backgroundColor = [UIColor lightGrayColor]; hintLabel.a

如何制作Jar包并在android中调用jar包

android制作jar包: 新建android工程,然后右击,点击导出,选择导出类型为Java下的JAR file,在java file specification 中不要选择androidmanifest.xml和res文件夹,就可以了.否则在调用jar包的时候会出现“Error generating final archive: Found duplicate file for APK: AndroidManifes”这个错误. 如果在android用调用jar包,需要在工程的属性的Jav

Android中制作自定义dialog对话框的实例

http://www.jb51.net/article/83319.htm 这篇文章主要介绍了Android中制作自定义dialog对话框的实例分享,安卓自带的Dialog显然不够用,因而我们要继承Dialog类来制作自己的对话框,需要的朋友可以参考下 自定义dialog基础版很多时候,我们在使用android sdk提供的alerdialog的时候,会因为你的系统的不同而产生不同的效果,就好比如你刷的是MIUI的系统,弹出框都会在顶部显示!这里简单的介绍自定义弹出框的应用. 首先创建布局文件d

Android App中使用Gallery制作幻灯片播放效果

http://www.jb51.net/article/83313.htm 我们有时候在iPhone手机上或者Windows上面看到动态的图片,可以通过鼠标或者手指触摸来移动它,产生动态的图片滚动效果,还可以根据你的点击或者触摸触发其他事件响应.同样的,在Android中也提供这这种实现,这就是通过Gallery在UI上实现缩略图浏览器. 我们来看看Gallery是如何来实现的,先把控件从布局文件中声明,只需知道ID为gallery. ? 1 Gallery gallery = (Gallery

Android基础入门教程——8.1.1 Android中的13种Drawable小结 Part 1

Android基础入门教程--8.1.1 Android中的13种Drawable小结 Part 1 标签(空格分隔): Android基础入门教程 本节引言: 从本节开始我们来学习Android中绘图与动画中的一些基础知识,为我们进阶部分的自定义 打下基础!而第一节我们来扣下Android中的Drawable!Android中给我们提供了多达13种的 Drawable,本节我们就来一个个撸一遍! Drawable资源使用注意事项 Drawable分为两种: 一种是我们普通的图片资源,在Andr

Android中的权限管理(基于uid gid gids setUid)

我们首先来说一下传统的Linux基于uid,gid的权限管理机制: 1.用户的uid gid gids: Ubuntu操作系统当前登陆的用户是jltxgcy,那么该用户的uid为jltxgcy,gid也是jltxgcy,那么gids怎么查看呢? 答案是使用命令:cat /etc/group | grep jltxgcy.如下图: 用户的gids的名字为adm,dialout,cdrom,plugdev,lpadmin,admin,sambashare.此本分请参考linux用户组./etc/gr

Android中多线程编程(四)AsyncTask类的详细解释(附源码)

Android中多线程编程中AsyncTask类的详细解释 1.Android单线程模型 2.耗时操作放在非主线程中执行 Android主线程和子线程之间的通信封装类:AsyncTask类 1.子线程中更新UI 2.封装.简化异步操作. 3.AsyncTask机制:底层是通过线程池来工作的,当一个线程没有执行完毕,后边的线程是无法执行的.必须等前边的线程执行完毕后,后边的线程才能执行. AsyncTask类使用注意事项: 1.在UI线程中创建AsyncTask的实例 2.必须在UI线程中调用As

Android中客户端请求服务器端的方式讲解(一)附源码

Android中客户端请求服务器端的两种方式:Post方式和Get方式 在这里不直接赘述了,直接上源码如下: (1).Post的方式: /** * Post的请求方式 * * @param model * 请求序号 * @param paramList * 客户端请求的数据参数列表 * @return */ public JSONObject doPost(int model, List<NameValuePair> paramList) { try { // 客户端向服务器发送请求的数据 L