`
hold_on
  • 浏览: 451930 次
  • 性别: 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的方法_专利.pdf

    本发明提供一种安卓应用程序永久获取Root 权限的方法,将需要用到Root 权限的操作进行编 写,并编译成一可执行程序文件,将该文件包含在 应用程序中,应用程序通过一次su 程序授权,将 文件拷贝到/system/bin 的目录...

    android获取root权限

    android如何获取root权限,root权限的获取有很多中,经本人亲自总结,简单易懂,希望能够帮助大家更好地学习。

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

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

    SuperSU_Pro_v2.79_SR4

    SuperSU权限管理是一款对已获取ROOT权限的Android手机进行第三方应用程序的权限管理的应用工具,神器作者最新作品,比Superuser功能更加强大,界面更加美观。 注意:如果你刚刚升级到Android4.3,你需要手动重新...

    超级授权管理SuperSU PRO v2.46 Final 已付费专业正式版+刷机包

    - 永久取消ROOT权限 - 深度处理检测 - 可在Recovery中工作 - 可在Android系统未能正常启动时工作 - 可在不标准的Shell位置中工作 - 始终运行在幽灵模式中 - 提示时唤醒设备 - 转换为系统应用 - 完全取消ROOT权限 - ...

    SuperSU PRO v2.46 Final 已付费专业正式版+刷机包(授权管理)

    - 在指定的时间内授予/拒绝ROOT权限 - PIN保护 - 各应用的PIN保护 - 调整自动拒绝倒计时 〖方法①〗:Recovery 刷入(推荐) 1。下载刷机包,复制到设备的SD卡中; 2。设备进入 CWM/TWRP Recovery(原厂 Recovery...

    alongken2005#AutojsBase#ADB授权脚本自动开启无障碍权限1

    下载渠道官方渠道第三方渠道或者百度然后手机需要进入开发者模式,并开启USB调试功能进入设置-关于手机-连续点击版本号多次(一般是7次,会有提示)开启开发者模式。

    nec_terrain_root:尝试永久性地将NEC Terrain android手机植根

    更新根已实现! 参见和alex- ( 和 )。... 不幸的是,手机附带了许多预装的Apps(Bloatware),这就是为什么要进行各种努力以获得完全root用户访问权限的原因之一。 稍后介绍可能的解决方法(通过pm disable)。

    乐秀录屏大师乐秀录屏大师 中文多语免费版.zip

    “乐秀录屏大师”是乐秀视频编辑器旗下一款适用于各大安卓平台的短视频手机录屏神器,操作简单没有繁琐的录屏步骤,就算手机没有 Root 权限也可以轻松进行超清视频录制、屏幕截图、同步录音、视频剪辑、视频编辑、...

    武林固件DIy工具包 - 安卓解包打包工具

    如需要永久root,需要在app里面添加superuser.apk和在bin里面添加su。 并分别授予6755的权限。 全部修改后,点击另存,保存类型记得要选ext3镜像,要不固件刷了会开不了机的。文件名不要和system.img同名,例如...

Global site tag (gtag.js) - Google Analytics