MTK Android11 user版本root后门

本文介绍了如何在MTK 8183_11.0用户版本上绕过root限制,涉及adb框架、adbd启动流程及权限处理。主要步骤包括修改adb源代码,调整selinux权限,以及通过设置属性控制adb root的启用和禁用。用户版本adb root已在8183_11.0平台上验证成功。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

了解:

参考文档:http://www.shibaking.com/blog/2020-04-08-Android%E6%BA%90%E7%A0%81%E7%BC%96%E8%AF%91user%E7%89%88%E6%9C%AC%E9%BB%98%E8%AE%A4%E5%BC%80%E5%90%AFadb%E8%B0%83%E8%AF%95.html

1.adb框架

Android Adb 一共分为三个部分:adb、adb server、adbd,源码路径:system⁩/⁨core⁩/⁨adb。根据他们运行的地方不同,可以分为pc端和手机端两部分。

pc端

adb client和adb server 是运行在PC端,adb就是大家所熟悉的控制台命令adb,adb server是由adb fork出的一个常驻后台的子进程,作为adb的server进程,adb kill-server就是kill掉这个进程。adb与adb server 通过local socket进行通信。

手机端

adbd运行在Android端,是在内核初始化完毕之后,由init进程启动。

2.adbd启动流程

手机端的adbd是在init解析rc文件的时候启动的,具体可以查看init.rc中的配置信息。根据注释,可以了解到adbd的启动是根据一个属性触发器来控制的,具体的触发器在init.<platform>.usb.rc文件中。

on property:ro.debuggable=1
  start console

# adbd is controlled via property triggers in init.<platform>.usb.rc
service adbd /sbin/adbd --root_seclabel=u:r:su:s0
  class core
  socket adbd stream 660 system system
  disabled
  seclabel u:r:adbd:s0

# adbd on at boot in emulator
on property:ro.kernel.qemu=1
  start adbd

接下来我们看看在init.<platform>.usb.rc文件中如何定义触发器。触发器根据sys.usb.config的值来决定是否启动adbd,其实就是仅当sys.usb.config的值中包含adb选项时才会启动adbd。

on property:sys.usb.config=ptp,adb
    write /sys/class/android_usb/android0/enable 0
    write /sys/class/android_usb/android0/idVendor 18D1
    write /sys/class/android_usb/android0/idProduct 4EE6
    write /sys/class/android_usb/android0/bDeviceClass 0
    write /sys/class/android_usb/android0/bDeviceSubClass 0
    write /sys/class/android_usb/android0/bDeviceProtocol 0
    write /sys/class/android_usb/android0/functions ptp,adb
    write /sys/class/android_usb/android0/enable 1
    start adbd
    setprop sys.usb.state ${sys.usb.config}

adbd的启动代码在system/core/adb/daemon/main.cpp中,其中main函数调用了adbd_main完成启动过程。adbd是一个linux程序,通过tcp或者usb与PC端的adb server通信,调用logcat shell等等程序实现各种调试功能。

代码1 main.cpp

int adbd_main(int server_port) {
  umask(0);

  signal(SIGPIPE, SIG_IGN);

  init_transport_registration();

  // We need to call this even if auth isn't enabled because the file// descriptor will always be open.
  adbd_cloexec_auth_socket();

  if (ALLOW_ADBD_NO_AUTH && !android::base::GetBoolProperty("ro.adb.secure", false)) {
    auth_required = false;
  }

  adbd_auth_init();

  // Our external storage path may be different than apps, since// we aren't able to bind mount after dropping root.const char* adb_external_storage = getenv("ADB_EXTERNAL_STORAGE");
  if (adb_external_storage != nullptr) {
    setenv("EXTERNAL_STORAGE", adb_external_storage, 1);
  } else {
    D("Warning: ADB_EXTERNAL_STORAGE is not set.  Leaving EXTERNAL_STORAGE"" unchanged.\n");
  }

  drop_privileges(server_port);

  bool is_usb = false;
  if (access(USB_FFS_ADB_EP0, F_OK) == 0) {// Listen on USB.
    usb_init();
    is_usb = true;
  }// If one of these properties is set, also listen on that port.// If one of the properties isn't set and we couldn't listen on usb, listen// on the default port.
  std::string prop_port = android::base::GetProperty("service.adb.tcp.port", "");
  if (prop_port.empty()) {
    prop_port = android::base::GetProperty("persist.adb.tcp.port", "");
  }int port;
  if (sscanf(prop_port.c_str(), "%d", &port) == 1 && port > 0) {
    D("using port=%d", port);
    // Listen on TCP port specified by service.adb.tcp.port property.
    setup_port(port);
  } else if (!is_usb) {// Listen on default port.
    setup_port(DEFAULT_ADB_LOCAL_TRANSPORT_PORT);
  }

  D("adbd_main(): pre init_jdwp()");
  init_jdwp();
  D("adbd_main(): post init_jdwp()");

  D("Event loop starting");
  fdevent_loop();

  return 0;
}int main(int argc, char** argv) {while (true) {static struct option opts[] = {
  
  {"root_seclabel", required_argume
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值