问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何使Android应用程序获得root权限

发布网友 发布时间:2022-04-23 01:23

我来回答

2个回答

热心网友 时间:2022-06-22 18:50

  一般来说, Android 下的应用程序可以“直接”得到的最大的权限为 system ,但是如果我们需要在程序中执行某些需要 root 权限的命令,如 ifconfig 等,就需要 root 权限了。按照 Simon 的文章中提到的,应用程序有以下两种办法临时获得 root 权限:
  1) 实现一个 init 实现一个 Service ,来帮助 Android 应用程序执行 root 权限的命令。
  2) 实现一个虚拟设备,这个设备帮助 Android 应用程序执行 root 权限的命令。
  
  第二种办法我这里没有尝试,暂时也不会。这里讲讲我在实现第一种办法的过程和遇到的一些问题。
  
  1. 将我们要执行的命令写成脚本,或者可执行程序。
  下面是我的脚本 ifconfig_test.sh :

  # ! /system/bin/sh
  ifconfig
  注意: 脚本的第一行必须为 # ! /system/bin/sh ,否则无法执行,通过 dmesg 可以查看到信息内容为 cannot execve ./ifconfig_test.sh: Exec format error
  
  也可以采用 C/C++ 编写需要执行的命令或者程序,并在编译 image 的时候编译成可执行程序。
  
  2. 在 init.rc 中注册 service
  Android 中的 service 需要在 init.rc 中注册, Init.rc 中定义的 Service 将会被 init 进程创建,这样将可以获得 root 权限。当得到相应的通知(通过属性设置)后, init 进程会启动该 service 。
  本文中注册的内容如下:

  service ifconfig_test /system/etc/ifconfig_test.sh
  oneshot
  disabled
  其中, oneshot 表示程序退出后不再重新启动, disabled 表示不在系统启动时启动。
  
  注意: 这里 service name 不能超过 16 个字符。我之前的 service name 由于定义的比较长, 18 个字符,设置属性通知 service 启动后查看 dmesg 可以看到提示: init: no such service 。查看 /system/core/init/parser.c 的源代码,在 parse_service->valid_name 函数中可以看到如下内容: if (strlen(name) > 16) { return 0; } ,证明 service 的名字的确不能超过 16 个字符。
  
  3. 将 Android 应用程序提升为 system 权限
  既然应用程序可以通过启动 service 获得 root 权限,那么岂不是很不安全。 Android 考虑到了这点,规定只有 system 权限的应用程序才能设置属性,通知 service 启动。关于提升 system 权限的文章网上已有很多,这里就不再细说,
  
  4. 在应用程序中添加属性设置代码
  前面已经提到,对于 Android 来说,应用程序通知 init 启动 service 是通过设置系统属性来完成的,具体为设置 System 系统属性 “ctl.start” 为 “ifconfig_test” ,这样 Android 系统将会帮我们运行 ifconfig_test 这个 service 了。
  对该系统属性的设置有三种方法,分别对应三种不同的应用程序:
  1) Java 代码
  Android 在 Java 库中提供 System.getProperty 和 System.setProperty 方法, Java 程序可以通过他们来设置和获得属性。代码如下:
  SystemProperties.set("ctl.start", "ifconfig_test");
  上面的代码是通知 Android 执行 ifconfig_test service ,如果需要查询当前 service 执行的状态,如是否执行完毕,可以通过如下代码查询:
  ret = SystemProperties.get("init.svc. ifconfig_test ", "");
  if(ret != null && ret.equals("stopped"))
  {
  return true;
  }
  2) JNI 代码
  当编写 NDK 的程序时,可以使用 property_get 和 property_set 这两个 API 来获得和设置属性。使用这两个 API 必须要包含头文件 cutils/properties.h 和链接 libcutil 库。
  
  3) Shell 脚本
  Android 提供了命令行 setprop 和 getprop 来设置和获取属性,他们可以在脚本中被使用。
  
  由于我的程序是在 JNI 中调用脚本,脚本中又执行 ifconfig ,因此我将设置属性的部分放在了脚本中完成,代码如下:
  setprop ctl.start ifconfig_test
  
  #wait for the service until it stops
  ret=1
  while [ $ret -ne 0 ]
  do
  getprop | grep "$ENABLE_MAPPER_SRV" | grep stopped
  ret=$?
  done
  通过上面 4 个步骤, Android 应用程序就获得了 root 权限,更具体的说,是在执行我们需要执行的命令时临时获得了 root 权限。
  转载仅供参考,版权属于原作者。祝你愉快,满意请采纳哦

热心网友 时间:2022-06-22 20:08

root大师。。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 如何避免wps卡顿? 属鼠的男人找对象是属什么,属鼠的人和什么属相合 96年鼠的姻缘在哪年 属相相合年份运势提升 2024属鼠找对象属什么最佳 黑客攻击网站能报案吗 黑客攻击报案有用吗 红米10x如何授予软件root权限 如何让应用程序获取system权限,root权限 华为荣耀手机怎么给软件root权限 手机获得root权限了,那怎样才能赋予某个软件root权限呢? 手机程序怎么获取root权限 小米手机怎么给软件root权限 如何授予程序ROOT权限? vivo手机怎么给软件root权限? vivo手机怎么给软件root权限 如何给软件root权限?急! 如何使自己的应用程序获得root权限 怎么给手机软件获取ROOT权限? 怎么给软件root权限? 如何在我的应用程序里面代码获得root权限 女生的戒指应该戴在哪个手? 女生结婚 戒指戴在哪只手上? 女生结婚戒指戴哪只手是正确的,有懂的吗? 女生婚戒戴哪只手? 微商代理怎么做,微商怎么加人快又多如何找客源好友 结了婚的女人戴戒指戴哪只手的哪个手指? 请问,王者荣耀张大仙在哪个平台直播,麻烦好心人告诉一下 王者荣耀张大仙为什么不在斗鱼了,他去哪里了? 王者荣耀的早期主播张大仙是哪里人? 汽车常规保险有哪些条款明细价格 张大仙入驻虎牙给了UZI都不曾享有的待遇,这是要让他成为虎牙一哥吗? 汽车保险的详细条例? 张大仙现在在哪直播? 汽车保险新规定? 最近张大仙在哪直播,听说被斗鱼封杀了,是真的吗? 保监会最新机动车辆保险条款 张大仙在哪直播是什么来的? 请问机动车保险的条例是什么 汽车保险都包括那些项目? 百度如何第一时间看到大仙直播? 大仙的战队是什么? 新的车辆保险规定是什么 新的汽车保险规定细则 在手机上注册了淘宝号之后 怎样注册支付宝? 干豆角炖多久能熟? 干豆角烧肉的做法