android 如何在user版本中获取root权限
前提
本文介绍的方案是在有安卓底层SDK源码的方案下实行的,若不具备这个条件的就不用往下继续看了,以免耽误你的时间。
写作目的
公司是做工程设备,运行的是安卓系统,系统使用是的user,系统上层的app都是预安装的。正常情况下,这样的app的是没法做一些特权操作的,如重启系统、安装软件、读写一些特殊文件夹的文件。为了解决这些问题,特意做了一个方案,使第三方的app也拥有了root权限。
实现思路
我们知道系统启动后会运行init程序,init程序会解析init.rc脚本,并执行init.rc中的命令,而init程序是拥有root权限的,那么如果写一个服务程序,将此服务程序放入到init.rc中,使其开机启动,并常驻与系统中,这样这个服务程序也将拥有了root权限。而我们的第三方app想要获取一些特权操作时,只需要把把操作指令发送给我们的服务程序,由这个服务程序去执行即可。
最终效果
Runtime.getRuntime().exec(“god reboot”); // 第三方app执行了系统重启命令
不难看出,这其实是用java调用了一个exec方法执行了一条脚本命令,而god是我底层的一个发送程序,意思是将god后方的命令发送给我底层的一个服务程序。底层的服务程序收到命令后,就会去执行它。
下面简单说下代码
发送方部分代码(god)
#include <ctype.h>
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include "common/nativeNetServer.h"
#include "common/Utils.h"int main(int argc,char *argv[]){char cmdstr[1024] = {0};int i;if(argc < 2){return -1;}pNativeNetServerOps netServer = createNativeNetServer();if(netServer == NULL){return -1;}char tempStr[32] = {0};for(i = 1;i<argc;i++){sprintf(cmdstr,"%s %s",cmdstr,argv[i]);}LOGD("[jerry] %s\n",cmdstr);return netServer->runScript(netServer,cmdstr,4);
}
static int runScript(struct NativeNetServerOps * ops, const char * str,int timeout) {pNativeNetServer pthis = (pNativeNetServer) ops;int ret =-1;if (pthis == NULL || pthis->udpServer == NULL) {return -1;}char recvbuf[1024] = {0};MsgBody msg = UdpBuildMsg(NOT_ACK, CMD_RUN_SCRIPT, str, strlen(str) + 1);ret = pthis->udpServer->write(pthis->udpServer, msg.buf, msg.len,SERVER_IP_ADDR, SERVER_PORT);if(ret < 0){LOGE(" fail to write!");goto fail0;}ret = pthis->udpServer->read(pthis->udpServer,recvbuf,sizeof(recvbuf),timeout*1000);if(ret < 0){LOGE(" fail to read!");goto fail0;}pT_Comm_Head ackComm = &recvbuf;LOGE("ackComm.dataPack.dataStart : %d\n",ackComm->dataPack.dataStart);return ackComm->dataPack.dataStart;
fail0:LOGE(" fail to runScript!");return -1;}
这里的通讯使用的是socket,当然你也可以用管道或者binder或其他进程间通讯方案
服务端部分代码
static void cmdHandle(void* arg){pCmdArg cmdArg = arg;if(cmdArg == NULL){return;} pT_Comm_Head commHead = (pT_Comm_Head )cmdArg->data;commHead->dataPack.dtatLen = ntohl(commHead->dataPack.dtatLen);switch(commHead->cmd){case CMD_CONNECT_SCRIPT:{LOGD("CMD_CONNECT_SCRIPT\n");commHead->ackType = ACK_OK;udpServer->ack(udpServer,commHead,sizeof(T_Comm_Head),cmdArg->remoteInfo);}break;case CMD_RUN_SCRIPT:{char runScript[1024] = {0};int ret;memcpy(runScript,&commHead->dataPack.dataStart,commHead->dataPack.dtatLen);// LOGD("system_run :[ %s ] start\n",runScript);ret = system(runScript);commHead->ackType = ACK_OK;commHead->dataPack.dataStart = ret;udpServer->ack(udpServer,commHead,sizeof(T_Comm_Head),cmdArg->remoteInfo);LOGD("system_run :[ %s ] end\n",runScript);}break;case CMD_HEARTBEAT:{char heartbeatStr[1024] = {0};memcpy(heartbeatStr,&commHead->dataPack.dataStart,commHead->dataPack.dtatLen);daemonServer->keepHeartBeat(daemonServer,heartbeatStr);} break;default:break;}if(cmdArg){if(cmdArg->data){free(cmdArg->data);}free(cmdArg);}}
执行脚本时使用的是system,当然也可以使用popen并把代码的执行结果返回给app。
init.rc文件
service nativeNetserver /system/bin/nativeNetserverclass mainuser rootgroup root
后续
当然这只是众多方案中的一种,本人技术有限,目前只能想到这个方案,若有同行朋友还有其他解法或补充之处,交流一二简直再好不过,由于代码文件比较多,这里就不全部上传,若有需要的朋友可以联系我,我将毫无保留的分享给你。
android 如何在user版本中获取root权限相关推荐
- Ubuntu中获取root权限
Ubuntu中获取root权限 [转载]地址:http://bujingyun23.blog.163.com/blog/static/1813102432013233377716/ 2013-03-0 ...
- android root权限函数,android 4.4下app永久获取root权限的方法
本帖最后由 jackson 于 2017-4-16 20:55 编辑 通过参照 [FAQ11414]android KK 4.4 版本后,user 版本su 权限严重被限制问题说明 http://ww ...
- AccountManager getAccount 在Android O 8.0版本中获取为 null ?
问题 AccountManager accountManager = AccountManager.get(this);Account[] accounts = accountManager.getA ...
- Android如何在onCreate()方法中获取控件的高度和宽度
在Android中,有时我们需要测量控件的宽度和高度进行一些运算,特别是在自适应屏幕的时候,这些计算就变得特别必要,但是,如果我们直接在onCreate,或者onStart.onResume(第一次执 ...
- Android 获取ROOT权限原理解析
一. 概述 本文介绍了android中获取root权限的方法以及原理,让大家对android玩家中常说的"越狱"有一个更深层次的认识. 二. Root的介绍 1. Ro ...
- android apk获取root权限执行相应的操作 demo调试
在apk中,有时候需要root权限,例如通过apk更新系统库等system的文件等,避免升级固件,或者在apk中需要直接访问某些设备等.下面是在apk中获取root权限的方法,前提是设备已经root过 ...
- 让Android应用程序申请获取ROOT权限
有时候我们写 Android APP,需要让它获取 ROOT 权限,那么如何让 APP 去向系统申请呢?下面提供一个方法,前提是系统是已经 ROOT 权限了,能够执行能 su 命令.如果不能,可以参考 ...
- Android之——申请获取ROOT权限
有时候我们写 Android APP,需要让它获取 ROOT 权限,那么如何让 APP 去向系统申请呢?下面提供一个方法,前提是系统是已经 ROOT 权限了,能够执行能 su 命令.如果不能,可以参考 ...
- adb修改什么文件获取root权限_Android获取ROOT权限的通用方法
背景 自从Android问世以后,给手机获取ROOT权限变成了玩机爱好者老生常谈的话题.拥有手机,却不能拥有操作手机的最高权限,这对于手机爱好者而言,这怎么可以忍?所以无论Android升到什么什么版 ...
最新文章
- Python处理MLDonkey 下载中文文件乱码问题 (2)
- matlab pareto 升级版
- VSCode + Latex 配置
- RuoYi-Vue————权限管理
- MFC 图片部分透明
- Oracle 定义变量的方法
- Java中使用Base64进行编码解码的工具类-将验证码图片使用Base64编码并返回给前端
- Python3之paramiko模块
- python字符串与文本处理技巧(1):分割、首尾匹配、模式搜索、匹配替换
- 【COCOS2DX隐藏IOS7状态栏】通过添加PLIST KEY隐藏IOS7状态栏
- NO.34 关于禅道加密
- 万豪国际数据再遭泄露影响520万客户,两名员工账户为突破口
- 前端JAVASCRIPT模块化开发
- python能做什么excel-python处理excel总结
- ubuntu国内镜像站点及更新源
- 实验4:Linux下C语言编程
- 「 微信黑科技 」神奇符号
- python获取代理服务器地址
- html怎么让页脚下方的空白页,Word中后面多出来带页眉页脚的空白页怎么删除
- 英特尔固态硬盘测试软件,AS SSD测试:IOPS值高达11万_Intel 520_固态硬盘评测-中关村在线...
热门文章
- BUI 示例总结(小技巧)
- OneDrive云盘使用
- Android 横向滚动列表 (类似横向ListView)
- 踩坑---django定时任务django-apscheduler
- urllib使用案例
- FreeSWITCH关于穿越NAT的那点事儿
- 好钢用在刀刃上――选择性启用NTFS压缩节省系统空间
- Android TextView竖直滚动文字广告效果
- VM虚拟机安装系统出现Operating system not found或Directory “ZEBOOT” not found Error loading iMage错误,保姆级解决教程
- 游戏耳机什么牌子好?低延迟游戏蓝牙耳机推荐