`
hold_on
  • 浏览: 456199 次
  • 性别: 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
分享到:
评论
36 楼 u013255013 2015-09-16  
楼主,能把那个zlsu的源码发份给我吗  1835600703@qq.com,谢谢
35 楼 blackylin 2015-08-01  
hi,楼主,这里有个疑问:
向上面情况,如果被360安全大师,或者应用宝之类的app,申请过root,把super替换了。那么不相当于其他应用可以去随便获取root权限,并且没有提示?是这么个理么?刚试了应用宝,下载es浏览器,打开es能直接看到/目录,手机没有任何提示。这是不就相当于为其他应用做长工   
34 楼 小f君 2015-07-13  
楼主你好,请问在android4.4上能使用这个方法吗?我把你代码里的zlsu复制到bin目录下,只要调用os.writeBytes()的就会提示[size=xx-small]java.io.IOException: write failed: EPIPE (Broken pipe)。[/size]。纠结好几天了,望赐教。
33 楼 shanyue_hui 2015-05-05  
楼主能否发一份zlsu文件的源码吗?我的邮箱809108038@qq.com 我现在需要做这个功能  非常感谢
32 楼 ipmux 2014-12-20  
试了几个手机,总在zlsu的setuid和setgid处出错,而用dab shell 执行zlsu则可提权,望指点,多谢
31 楼 scum321 2014-09-19  
我在 move hw的时候报了如下错误:
java.io.IOException: Error running exec(). Command: [zlsu, -c, export CLASSPATH=/data/app/com.zl.movepkgdemo-1.apk && export LD_LIBRARY_PATH=/vendor/lib:/system/lib && exec app_process /data/app com.zl.movepkgdemo/util/MoveUtil com.zl.hw 2] Working Directory: null Environment: null
请教是什么原因,hw已经安装且已经get root
30 楼 scum321 2014-09-19  
您好,能否发一份zlsu的源码啊,万分感谢!邮箱;jusng@foxmail.com
29 楼 dw707995113 2014-07-29  
mark!
28 楼 sodwell 2014-06-13  
您好,博主,我想问下您的这个APK获取root权限是该手机已经root之后才可以,还是没有root过的手机也可以?
27 楼 hold_on 2014-05-25  
一硼氧化钙 写道
楼主您好,这篇写的很好,对我很有帮助,但是在测试的时候发现,一般的复制粘贴重启等操作都可以,就是用pm命令禁用掉系统的某些服务时,不好使,请问这样情况您遇到了吗?

exeCmd(new String[]{Constants.ROOT_SU,"-c", String.format("pm disable '%s/%s'", receiverName.getPackageName(), receiverName.getClassName())},"");


先确定该命令在shell模式下能否成功调用
26 楼 一硼氧化钙 2014-05-25  
楼主您好,这篇写的很好,对我很有帮助,但是在测试的时候发现,一般的复制粘贴重启等操作都可以,就是用pm命令禁用掉系统的某些服务时,不好使,请问这样情况您遇到了吗?

exeCmd(new String[]{Constants.ROOT_SU,"-c", String.format("pm disable '%s/%s'", receiverName.getPackageName(), receiverName.getClassName())},"");
25 楼 y_ys79 2014-05-19  
请问,这个程序只能在手机root之后才能用吧?如果是,有没有不用root就能或者这个权限的方法呢?
24 楼 ganjingjun 2014-04-24  
楼主好,NDK目录下的zlsu和movedeo是一样的吗,   怎么还用到jni了? 不是只用sh命令就行了吗?盼复。
23 楼 12756304 2014-04-17  
12756304 写道

Description Resource Path Location Type
Conversion to Dalvik format failed with error 1 Movepkgdemo Unknown Android Packaging Problem

伟大的博主,我通过ADT试图运行你这个demo,得到入上错误,请问这是为什么?


更多的信息

[2014-04-17 21:58:36 - hw] Unable to resolve target 'android-17'
[2014-04-17 21:58:37 - Movepkgdemo] Unable to resolve target 'android-17'
[2014-04-17 21:58:37 - Superuser] Project has no project.properties file! Edit the project properties to set one.
[2014-04-17 21:58:38 - Movepkgdemo] Unable to resolve target 'android-17'
[2014-04-17 21:58:38 - hw] Unable to resolve target 'android-17'
[2014-04-17 22:18:03 - Movepkgdemo] Dx
trouble processing "java/lang/UnsafeByteSequence.class":

Ill-advised or mistaken usage of a core class (java.* or javax.*)
when not building a core library.

This is often due to inadvertently including a core library file
in your application's project, when using an IDE (such as
Eclipse). If you are sure you're not intentionally defining a
core class, then this is the most likely explanation of what's
going on.

However, you might actually be trying to define a class in a core
namespace, the source of which you may have taken, for example,
from a non-Android virtual machine project. This will most
assuredly not work. At a minimum, it jeopardizes the
compatibility of your app with future versions of the platform.
It is also often of questionable legality.

If you really intend to build a core library -- which is only
appropriate as part of creating a full virtual machine
distribution, as opposed to compiling an application -- then use
the "--core-library" option to suppress this error message.

If you go ahead and use "--core-library" but are in fact
building an application, then be forewarned that your application
will still fail to build or run, at some point. Please be
prepared for angry customers who find, for example, that your
application ceases to function once they upgrade their operating
system. You will be to blame for this problem.

If you are legitimately using some code that happens to be in a
core package, then the easiest safe alternative you have is to
repackage that code. That is, move the classes in question into
your own package namespace. This means that they will never be in
conflict with core system classes. JarJar is a tool that may help
you in this endeavor. If you find that you cannot do this, then
that is an indication that the path you are on will ultimately
lead to pain, suffering, grief, and lamentation.

[2014-04-17 22:18:03 - Movepkgdemo] Dx 1 error; aborting
[2014-04-17 22:18:03 - Movepkgdemo] Conversion to Dalvik format failed with error 1
[2014-04-17 22:22:08 - Movepkgdemo] Dx
trouble processing "java/lang/UnsafeByteSequence.class":

Ill-advised or mistaken usage of a core class (java.* or javax.*)
when not building a core library.

This is often due to inadvertently including a core library file
in your application's project, when using an IDE (such as
Eclipse). If you are sure you're not intentionally defining a
core class, then this is the most likely explanation of what's
going on.

However, you might actually be trying to define a class in a core
namespace, the source of which you may have taken, for example,
from a non-Android virtual machine project. This will most
assuredly not work. At a minimum, it jeopardizes the
compatibility of your app with future versions of the platform.
It is also often of questionable legality.

If you really intend to build a core library -- which is only
appropriate as part of creating a full virtual machine
distribution, as opposed to compiling an application -- then use
the "--core-library" option to suppress this error message.

If you go ahead and use "--core-library" but are in fact
building an application, then be forewarned that your application
will still fail to build or run, at some point. Please be
prepared for angry customers who find, for example, that your
application ceases to function once they upgrade their operating
system. You will be to blame for this problem.

If you are legitimately using some code that happens to be in a
core package, then the easiest safe alternative you have is to
repackage that code. That is, move the classes in question into
your own package namespace. This means that they will never be in
conflict with core system classes. JarJar is a tool that may help
you in this endeavor. If you find that you cannot do this, then
that is an indication that the path you are on will ultimately
lead to pain, suffering, grief, and lamentation.

[2014-04-17 22:22:08 - Movepkgdemo] Dx 1 error; aborting
[2014-04-17 22:22:08 - Movepkgdemo] Conversion to Dalvik format failed with error 1
22 楼 12756304 2014-04-17  

Description Resource Path Location Type
Conversion to Dalvik format failed with error 1 Movepkgdemo Unknown Android Packaging Problem

伟大的博主,我通过ADT试图运行你这个demo,得到入上错误,请问这是为什么?
21 楼 jyg0124 2014-04-05  
楼主,能把zlsu 源码,发给我吗?邮箱jyg0124@126.com
20 楼 mooncafes 2014-03-01  
恩,挺好的,终于找到了,能发我一份zlsu源码吗
非常感谢      43927534@qq.com
19 楼 furjoy 2014-02-08  
先感谢楼主分享
我自己写的执行时,表示没有权限
请问lz可以贴上zlsu的源码,或者邮寄给我:s207152@gmail.com吗
18 楼 hold_on 2013-11-28  
gangzi542447157 写道
麻烦问一下,你编译好的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 + "'"

关机命令应该怎么执行呢


reboot 重启
reboot -p 关机

17 楼 hold_on 2013-11-28  
ogou421 写道

PackageManager.MOVE_SUCCEEDED
导入工程的时候如下提示
MOVE_SUCCEEDED cannot be resolved or is not a field
让用别的代替 MOVE_SUCCEEDED, layoutlib.jar已经放到libs了,4.2的工程


因为,layoutlib.jar和你工程中本身的android.jar都保护PackageManager这个类,你还需要 设置编译时jar包的优先级,吧layoutlib.jar的优先级设为必android.jar高,不然编译时找的是android.jar的packageManager类,当然就编译不过咯

设置优先级:
java Build Path -- Order and Export 位置靠顶 优先级越高

相关推荐

    安卓应用程序永久获取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