`
hold_on
  • 浏览: 456218 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android应用程序永久获取root权限方法

阅读更多

在项目的过程中,有可能会要实现类似360优化大师、安卓优化大师的软件搬家、静默安装等需要root权限的功能,或者类似SET_PREFERRED_APPLICATIONS、MOVE_PACKAGE 等需要系统的权限,必须要有系统签名。

咱们拿 软件搬家 来当例子(通过获取系统权限,而不是弹出系统的应用管理界面来搬家):

 

实现方式:

1、想办法获取系统权限,但是这个一般办不到,因为不同厂家出厂的手机系统签名都不一样

(

可以看看我很早的时候提的问题:

android系统权限SET_PREFERRED_APPLICATIONS怎么获取

)

2、在已经root过得手机,获取root权限(有root权限就可以为所欲为啦,嘿嘿)

 

第一种办法暂时不考虑,想了解的童鞋可以google android如何获取系统权限。

我们说说第二种办法,

在已经root过得手机上获取root权限,简单

 

Process process = Runtime.getRuntime().exec("su");

 

执行这一句,superuser.apk就会弹出授权对话框。

但是这样做就可以了吗.....肯定没这么简单啦!

当执行需要系统权限的操作时,系统还是回去检查应用程序是否拥有该权限。

所以我们要想办法绕过过系统检查权限这道关卡!

至于办法 可以参考下以下两篇博客:

1、android应用搬家的实现

2、如何在Android中启动java程序

大概思路是:

通过app_process 命令启动java程序(想了解app_process更多资料,请自行google),

可是app_process 命令需要root权限才能执行,所以要配合上面所讲的su命令啦。

 

这么做是可以实现绕过系统检查权限的大门,

但是每次执行的时候都要先请求下root权限(那种弹框和toast会让用户感觉到很不安)

 

不要忘了咱们的标题:Android应用程序永久获取root权限方法

永久获取root权限,就是获取过一次root权限后,以后再也不需要去请求root权限

实际上,像一些软件管家:安卓优化大师、360优化大师,都是这么做的

(不信你可以试试其软件搬家功能,即使你的手机解除root,它们还是具有root权限)

 

原理可以看下以下链接:

安卓应用程序永久获取Root权限的方法

(下载该文章需要money,明天我再上传该文档,一时找不到了.......)

 

大概思路:

自己编译一个类似su的可执行程序(以下以main为代号),在main中调用app_process命令,

然后在第一次获取root权限的时候将其push到/system/bin/目录下,再chmod 4755 可执行程序,

修改其访问权限,使执行该命令的进程能够暂时获得root权限

(4755 也请google下吧 linux文件权限)。

以后咱们要是需要root权限的话就调用mian命令,不用去调用su来请求root权限啦

至于为什么要这么做:也是为了让root授权的对话框和toast不在显示

 

插一句,想要知道su和superuser.apk的关系,请点开下面的链接

android superuser.apk 管理root权限原理分析

 

 

综上:我们所做的就是绕过su命令,用我们自己编写的可执行程序main开实现su的功能。

 

自己编译可执行程序main的时候,需要注意一点,请参考su源码,

我在这一步就卡了很久,

 

大概意思:

 

main的uid是继承的父类的uid,而且它有root权限,但是在main中执行system(cmd),

(这里的cmd 调用app_process 来启动实现了软件搬家的java程序),

假如system()是通过sh 命令来实现,但在main中开启的sh的uid也是继承main的uid,

也就是应用程序的uid,但是这个uid并没有权限执行相关root命令;

所以需要先将main的uid设置为root,为了使sh的uid也为root,从而使sh 能够执行

需要root权限的app_process命令

关键代码在你的main 方法中加入

int uid = 0;
int gid = 0;
		
if(setgid(gid) || setuid(uid)) 
    return permissionDenied();

 

可以参考su的源码 (su的源码会在我上传的压缩包中)

 

大概思路就是这样。

 

PS:

在我上传的压缩包中有我自己写的demo,实现的是软件搬家的功能,

操作很简单:

1、安装Movepkgdemo.apk,并执行

2、点击 install com.zl.hw 按钮 来 安装一个helloword android程序,

3、点击 get root 按钮,来第一次获取root权限,

4、点击第三个按钮,来移动helloword程序

 

PPS:

1、编译可执行程序main(注意main只是个代号,在Movepkgdemo中 是 放在Movepkgdemo项目的 /res/ raw/ 目录下的zlsu文件)

2、将main.c文件成可执行文件会需要linux编译环境,你可以自己在linux上编译,也可以在windows下来编译

windows方法:使用cygwin 来进行NDK开发(搭建该环境可能需要话费比较多时间,主要是要下载cygwin)

cygwin环境配置文档也在上传的压缩包中,虽说花了打功夫,但是搭建好NDK环境,以后也能方便咱做NDK开发。

NDK环境搭建需要cygwin在安装的时候安装必需的一些项目(请查看以下链接):

Cygwin安装

 

 

最后总结一下总体思路:

1、在java代码中实现需要root权限的功能,并提供一个包含入口函数main的类

2、通过app_process命令来启动1中的java模块,但是app_process需要root权限,所以看第3步

3、通过在第一次获取root权限的时候,向/system/bin/注入自写的类似su的二进制可执行程序

main,并且和su的访问权限也一样(chmod 4755)(main功能和su一样,唯一不一样就是去除了su中与superuser.apk 交互的代码),即main命令执行app_process命令,这样可以做到:

一旦拥有root权限,以后再也不需要去请求root权限

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

14
1
分享到:
评论
16 楼 hold_on 2013-11-28  
altair86 写道
楼主,能把那个zlsu的源码发我份吗99105490@qq.com,谢谢

已发
15 楼 hold_on 2013-11-28  
altair86 写道
楼主,请教个问题,就是在java程序内做完操作了,我要怎么回调给android程序?

暂时没有回调哦,我这个方式,只是在android的程序中通过su命令,另起一个进程(入口即是 带main函数的java类),把参数通过命令行的方式传到main函数,然后在新起的进程中做需要做的事,完成之后,再通过 获取命令行打印的结果(结果可以通过自己的java类来输出) 来判断 返回的状态,
14 楼 altair86 2013-11-06  
楼主,请教个问题,就是在java程序内做完操作了,我要怎么回调给android程序?
13 楼 altair86 2013-11-05  
楼主,能把那个zlsu的源码发我份吗99105490@qq.com,谢谢
12 楼 gangzi542447157 2013-11-04  
麻烦问一下,你编译好的zlsu文件应该可以直接用吧? 没看懂你这个命令:
"movedemo -c 'export CLASSPATH="
+ classpath
+ " && export LD_LIBRARY_PATH=/vendor/lib:/system/lib && exec app_process /data/app "
+ minePkgName + "/MoveUtil " // /system/bin
+ pkgName + " " + moveFlag + "'"

关机命令应该怎么执行呢
11 楼 ogou421 2013-10-25  
导入工程的时候如下提示,提示错误:
位置 PackageManager.MOVE_SUCCEEDED
MOVE_SUCCEEDED cannot be resolved or is not a field
让用别的代替 MOVE_SUCCEEDED, layoutlib.jar已经放到libs了,4.2的工程
10 楼 ogou421 2013-10-25  

PackageManager.MOVE_SUCCEEDED
导入工程的时候如下提示
MOVE_SUCCEEDED cannot be resolved or is not a field
让用别的代替 MOVE_SUCCEEDED, layoutlib.jar已经放到libs了,4.2的工程
9 楼 hold_on 2013-10-21  
devil920 写道
试过了能用,感谢楼主的分享

谢谢支持
8 楼 hold_on 2013-10-21  
cc372059717 写道
大哥,我试了试,发现普通的shell命令确实可以以root执行。
但为什么 执行  pm 相关的指令 如pm uninstall 的话就报 Segmentation fault 呢?
望解答!!!!!谢谢!!!

你确定你已经获取了root权限? 如果是的话 pm install应该可以成功的
你也可以试着在程序中 用su命令修改system/bin权限(chmod命令)
7 楼 devil920 2013-10-21  
试过了能用,感谢楼主的分享
6 楼 cc372059717 2013-09-29  
大哥,我试了试,发现普通的shell命令确实可以以root执行。
但为什么 执行  pm 相关的指令 如pm uninstall 的话就报 Segmentation fault 呢?
望解答!!!!!谢谢!!!
5 楼 神舟腾起 2013-09-28  
这个有点问题呀,怎么有两个类有错误呀
4 楼 hold_on 2013-09-17  
Huanglong1987 写道
result == PackageManager.MOVE_SUCCEEDED

这packageManager的常量不存在。。。。
LZ你的demo不可以直接运行的啊。。。。


哎目唆锐,你
找到 sdk 目录中找到
androidsdkwindows\platforms\android-18\data\layoutlib.jar
将layoutlib.jar加入到项目library中

layoutlib.jar中使你可以在项目开发的过程中引用一些android为开放的api
3 楼 Huanglong1987 2013-09-11  
result == PackageManager.MOVE_SUCCEEDED

这packageManager的常量不存在。。。。
LZ你的demo不可以直接运行的啊。。。。
2 楼 hold_on 2013-07-20  
很简单,你可以在java代码中执行命令行指令
类似:
String cmd = "su";
process = Runtime.getRuntime().exec(cmd);	

然后获取命令行返回值,来判断该命令是否有权限,执行成功
1 楼 software_tangjing 2013-07-17  
非常感谢楼主的分享,正在研究这一块,但是有一个问题还请教楼主一下:代码中怎样判断手机已经root了,如果root了就执行楼主介绍的一系列操作,但是如果没有root还执行楼上的操作,应用程序就会崩溃?

相关推荐

    安卓应用程序永久获取Root权限的方法

    压缩包内有apk,demo源码,以及NDK 安装文档,主要是教你如何在已经root过得手机上只通过一次获取root权限,以后就再也不会弹出root授权框,主要思想是绕过superuser.apk的权限检查

    android获取root权限

    其次,获取 root 权限可以让用户安装一些需要root权限的应用程序,例如一些游戏和工具等等。 那么,谁需要获取 root 权限呢?第一类人群是黑客或喜欢对系统进行hacking的人,因为他们需要更多的控制权和自由度。第...

    Android root下修改设备分辨率

    在获取Root权限后,确保安装受信任的Root管理软件,避免下载和安装不明来源的应用程序。同时,定期更新系统补丁,以防范潜在的安全漏洞。 7. **法律问题**:值得注意的是,Root设备可能违反制造商的用户协议,因此...

    MIUI TWRP3.0.0+SuperSu 永久获取ROOT

    然而,对于许多技术爱好者和开发者来说,解锁系统权限并获得ROOT权限是进一步优化和自定义设备的重要步骤。在这个主题中,我们将详细介绍如何使用“MIUI TWRP3.0.0+SuperSu 永久获取ROOT”工具包来实现这一目标。 ...

    获取Root新方法

    然而,对于一些高级用户或者开发者来说,获取Root权限是必要的,因为他们可能需要安装自定义ROM、禁用预装应用、优化系统性能或使用特定的第三方应用。本文将详细介绍一种新的Root获取方法。 首先,理解Root的概念...

    安卓root权限获取工具

    "安卓root权限获取工具"是为了帮助用户突破系统限制,获得这种高级别权限的软件。这类工具通常包含多个组件,以确保在各种设备和安卓版本上都能成功root。从提供的文件名列表来看,我们可以推测这个压缩包包含了一些...

    Android 实现永久性开启adb 的root权限

    为此如果要永久性开启adb 的root 权限,有两种修改的方式: 1. 修改system property ro.secure, 让ro.secure=0。 2. 修改adb.c 中开启root 权限的判断逻辑。 下面详细说明这两种修改方式: 第一种方法. 修改syst

    root_server

    这个服务确保只有经过验证的应用或进程才能获得Root权限,同时提供了一个接口供其他应用请求临时或永久的Root访问。 3. **安全与风险**:拥有Root权限意味着可以访问系统所有文件,包括关键的系统组件。如果不小心...

    适用于S905盒子的root方案.zip

    标题“适用于S905盒子的root方案.zip”所指的是为基于S905芯片的电视盒子提供获取root权限的方法。S905是一款由Amlogic公司生产的高性能SoC(系统级芯片),常用于智能电视盒和媒体播放器。Root是Android系统中的一...

    开通root的常规方法

    【开通root权限】是Android操作系统中的一个高级功能,允许用户获取对设备的完全控制权,以便执行更深层次的系统修改和优化。Root权限类似于Linux或Unix系统中的超级用户权限,可以访问和修改系统文件,安装自定义...

    android supersu root

    Android Root权限是指获取了手机系统的管理员权限,用户可以对系统文件进行读写操作,安装需要Root的应用,删除预装应用,优化电池性能,自定义启动器等。然而,Root也有风险,可能会导致系统不稳定,甚至丢失保修。...

    OPPO X909 root权限破解

    Root权限破解是Android系统中常见的操作,它允许用户获取设备的管理员权限,从而能够自定义系统设置、安装第三方应用、优化性能以及执行其他高级功能。在OPPO X909上获取root权限,意味着你可以超越出厂设定的限制,...

    Android Superuser源码

    1. 防止恶意应用:Superuser有严格的权限管理,只有经过用户明确授权的应用才能获得root权限,防止恶意应用滥用root权限。 2. 版本更新:随着Android系统的发展,Superuser也需要不断更新以适应新的安全需求,防止...

    安卓android系统自带程序卸载、删除方法.pdf

    运行该软件并按照指示获取临时或永久的root权限。需要注意的是,root操作可能使你的设备保修失效,并且如果操作不当,可能导致系统不稳定或无法正常运行。 一旦获得root权限,你可以下载和安装一个名为SystemApp...

    I9000 root

    随着智能手机市场的日益成熟和用户对个性化需求的不断增长,Android设备的Root权限获取已经成为许多技术爱好者的追求目标。对于三星Galaxy S(型号为I9000)这一经典机型,获取Root权限更是解锁设备潜力的关键步骤。...

    华为手机root权限删除电信定制教程.pdf

    3. **USB调试**:在获取Root权限之前,需要在手机设置中开启USB调试,这是开发者选项中的一个功能,用于帮助开发者测试应用程序,但在Root过程中也是必要的步骤。 4. **RE文件管理器**:获取Root权限后,通常需要...

    校验包,刷root权限防变砖头,无法关机开机

    刷root权限的过程通常涉及解锁设备的引导加载程序、安装recovery模式(如TWRP或CWM),然后通过这个recovery模式来应用更新和校验包。通过使用这样的校验包,用户可以在刷机前检查设备状态,确保刷机文件的完整性和...

    MX永久ROOT

    通过获得Root权限,用户可以访问并修改系统的任何部分,包括系统核心。这对于开发者和高级用户来说尤其有用,因为他们可以自由地定制手机,比如安装自定义启动器、修改系统主题、优化电池寿命、提升设备性能以及卸载...

Global site tag (gtag.js) - Google Analytics