Android Adb 源码分析

扭起屁股得意洋洋

最近,我负责的项目因为临近量产,把之前的userdebug版本关闭,转成了user版本,增加selinux的权限,大家都洋溢在项目准备量产的兴奋和喜悦之中不能自拔

谁知,好景不长,user版本发布之后,各种bug接踵而来,但是因为user版本权限的原因,我们之前保留在/data/logs/下面的日志不能pull出来,定位问题非常困难

 

不得不想到的解决方案

第一个办法:我们想到的第一个办法就是更改data目录的权限,改成system用户,但是因为data下面的logs目录的文件是root权限,获取日志是需要root权限的,日志还是不能pullg出来。

第二个办法:我想到的第二个办法就是给我们的adb命令增加一个后门,正常我们是adb root获取root权限,我修改成adb aaa.bbb.ccc.root 这样不容易被别人窃取我们的后门,也不至于影响到我们的开发。

梳理Android ADB知识点

所以就加强了adb 的相关知识

google的adb 代码位置在(system/core/adb)目录下面

我上传了一份在github上面,链接如下

Android ADB源码​github.com

 

ADB是Android系统提供的调试工具,整个ADB工具由三部分组成:adb client、adb service、adb daemon。

1、ADB client

提供HOST端运行的命令

2、ADB service

HOST端上的一个后台进程

3、ADB daemom

DEVICE端(真实的机器或者模拟器)的守护进程

这三部分都是从(system/core/adb)里面编译出来的,我们很多时候去网上下载adb.exe来用,实际上我们的SDK代码下面就有adb,而且代码是可以修改的。

ADB代码位于/system/core/adb目录下,通过查看Android.mk,可以知道,该目录下的代码生成了两个MODULE,分别是adbadbdadb client和adb service都是由adb这个可执行文件实现, adb daemon由adbd实现。adb和adbd的一些源代码文件是用同一个的,编译时通过LOCAL_CFLAGS的参数ADB_HOST来区分,这种你中有我我中有你的关系,对于初次接触的朋友们,多少增加了些困扰。理清了ADB几部分的关系,以及源代码的结构,对ADB的认识已经有一个飞越了。

 

使用方案2来解决问题

代码修改如下

diff --git a/adb/commandline.cpp b/adb/commandline.cpp
old mode 100644
new mode 100755
index 51d828a..32b2c09
--- a/adb/commandline.cpp
+++ b/adb/commandline.cpp
@@ -83,6 +83,7 @@ static void help() {fprintf(stderr, "%s\n", adb_version().c_str());// clang-format offfprintf(stderr,
+    	"ADB use for weiqifa nan Product\n"" -a                            - directs adb to listen on all interfaces for a connection\n"" -d                            - directs command to the only connected USB device\n""                                 returns an error if more than one USB device is present.\n"
@@ -1083,6 +1084,7 @@ static bool adb_root(const char* command) {std::string error;ScopedFd fd;+	fprintf(stderr, "weiqifa adb root \n");fd.Reset(adb_connect(android::base::StringPrintf("%s:", command), &error));if (!fd.valid()) {fprintf(stderr, "adb: unable to connect for %s: %s\n", command, error.c_str());
@@ -1625,12 +1627,12 @@ int adb_commandline(int argc, const char **argv) {} else if (argc == 2 && !strcmp(argv[1], "-l")) {listopt = argv[1];} else {
-            fprintf(stderr, "Usage: adb devices [-l]\n");
+            fprintf(stderr, "weiqifa Usage: adb devices [-l]\n");return 1;}std::string query = android::base::StringPrintf("host:%s%s", argv[0], listopt);
-        printf("List of devices attached\n");
+        printf("weiqifa List of devices attached\n");return adb_query_command(query);}else if (!strcmp(argv[0], "connect")) {
@@ -1732,7 +1734,7 @@ int adb_commandline(int argc, const char **argv) {command = android::base::StringPrintf("%s:", argv[0]);}return adb_connect_command(command);
-    } else if (!strcmp(argv[0], "root") || !strcmp(argv[0], "unroot")) {
+    } else if (!strcmp(argv[0], "weiqifa.nan.root") || !strcmp(argv[0], "unroot")) {return adb_root(argv[0]) ? 0 : 1;} else if (!strcmp(argv[0], "bugreport")) {Bugreport bugreport;
diff --git a/adb/services.cpp b/adb/services.cpp
old mode 100644
new mode 100755
index 3b212e9..5a82246
--- a/adb/services.cpp
+++ b/adb/services.cpp
@@ -69,7 +69,7 @@ static void service_bootstrap_func(void* x) {void restart_root_service(int fd, void *cookie) {if (getuid() == 0) {
-        WriteFdExactly(fd, "adbd is already running as root\n");
+        WriteFdExactly(fd, "weiqifa.nan adbd is already running as root\n");adb_close(fd);} else {char value[PROPERTY_VALUE_MAX];
@@ -81,7 +81,7 @@ void restart_root_service(int fd, void *cookie) {}property_set("service.adb.root", "1");
-        WriteFdExactly(fd, "restarting adbd as root\n");
+        WriteFdExactly(fd, "weiqifa.nan restarting adbd as root\n");adb_close(fd);}}
@@ -327,7 +327,8 @@ int service_to_fd(const char* name, const atransport* transport) {void* arg = strdup(name + 7);if (arg == NULL) return -1;ret = create_service_thread(reboot_service, arg);
-    } else if(!strncmp(name, "root:", 5)) {
+    } else if(!strncmp(name, "weiqifa.nan.root:", 17)) {
+    	fprintf(stderr, "services adb root");ret = create_service_thread(restart_root_service, NULL);} else if(!strncmp(name, "unroot:", 7)) {ret = create_service_thread(restart_unroot_service, NULL);
diff --git a/adb/sockets.cpp b/adb/sockets.cpp
index 63b7df6..1cb0b5e 100644
--- a/adb/sockets.cpp
+++ b/adb/sockets.cpp
@@ -418,11 +418,11 @@ asocket* create_local_service_socket(const char* name, const atransport* transpo#if !ADB_HOSTchar debug[PROPERTY_VALUE_MAX];
-    if (!strncmp(name, "root:", 5)) {
+    if (!strncmp(name, "weiqifa.nan.root:", 17)) {property_get("ro.debuggable", debug, "");}-    if ((!strncmp(name, "root:", 5) && getuid() != 0 && strcmp(debug, "1") == 0) ||
+    if ((!strncmp(name, "weiqifa.nan.root:", 17) && getuid() != 0 && strcmp(debug, "1") == 0) ||(!strncmp(name, "unroot:", 7) && getuid() == 0) ||!strncmp(name, "usb:", 4) ||!strncmp(name, "tcpip:", 6)) {

 

编译

Android sdk编译请看链接

嵌入式Linux:Android7.1 howto_build_SDK​zhuanlan.zhihu.com

 

1、一个是编译生成adb.exe,这个拷贝到windows下面使用

Android 7.1使用 编译指令使用" make host_cross_adb -j40 "

Android 7.0 之前使用 make USE_MINGW=y adb

但是之前要先

source build/envsetup.sh

lunch

建立Android 编译环境

 

2、编译adbd 服务,这个是烧录到机器里面去,直接编译整个固件就好了

source build/envsetup.sh; lunch rk3399_mid-userdebug; make -j128

adbd 在init.rc里面初始化,具体代码在devices/rockchip/下面找

 

# for Internet adb 
on property:persist.internet.adb.enable=1setprop service.adb.tcp.port 5555restart adbd# for Internet adb 
on property:persist.internet.adb.enable=0setprop service.adb.tcp.port 0restart adbd# for telephony function
on property:ro.boot.noril=truesetprop ro.radio.noril truestop ril-daemon

 

这一章先大概说下代码,只有写下root的原理~~

 

如果觉得不错,帮忙关注微信公众号,嵌入式Linux

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kvm虚拟化_KVM 虚拟化环境搭建 - WebVirtMgr

前文《KVM 虚拟化环境搭建 - ProxmoxVE》已经给大家介绍了开箱即用的 PVE 系统,PVE 是方便,但还是有几点问题:第一:始终是商用软件,虽然可以免费用,但未来版本还免费么?商用的法律风险呢&#x…

Git 分布式版本控制工具02:Git代码托管服务列表与使用

1常用的Git代码托管服务 Git中存在两种类型的仓库,即本地仓库和远程仓库。 Git远程仓库中比较常用的有GitHub、码云、GitLab等。 名称网址说明gitHubGitHub: Where the world builds software GitHub一个面向开源及私有软件项目的托管平台,因为只支持…

Android系统root破解原理分析

上一篇文章 Android adb 源码分析 理论基础 root破解过程的终极目标是替换掉系统中的su程序。但是要想替换掉系统中su程序本身就是需要root权限的,怎样在root破解过程中获得root权限,成为我们研究的重点了。下面我们先清点一下我们需要破解系统情况&a…

常见字母缩写

1、ODBC:Open Database Connectivity,开放数据库连接; 2、TCP:Transport Control Protocol,传输控制协议; 3、URL:统一资源定位器; 4、HTTP:Hypertext Transfer Protoco…

基于Springboot外卖系统19:用户地址+默认收货地址

1. 用户地址簿功能 1.1 需求分析 地址簿,指的是移动端消费者用户的地址信息,用户登录成功后可以维护自己的地址信息。 同一个用户可以有多个地址信息,但是只能有一个默认地址。 对于地址簿管理,我们需要实现以下几个功能&#…

python获取返回值_python 调用 shell ,获取返回值和返回信息

网络上有各种方案解决python调用shell的解决方案,但是没有一个完美的,以下是本人整理的一个方案,比较完美地解决了同时解决获取返回值和返回信息。 def run_linux_cmd_quiet(i_cmd, i_nohup0): l_func_name__name__ . sys._getframe().f_cod…

基于Springboot外卖系统20:前端菜品展示+菜品数量查询

1 菜品展示 1.1 需求分析 用户登录成功后跳转到系统首页,在首页需要根据分类来展示菜品和套餐。如果菜品设置了口味信息,需要展示 按钮,否则显示按钮。 1.2 前端页面分析 在开发代码之前,需要梳理一下前端页面和服务端的交互过…

python 播放声音_如何用Python播放声音?

对于Windows,可以使用winsound。它内置import winsound winsound.PlaySound(sound.wav, winsound.SND_FILENAME) 应该能够在Linux上使用ossaudodev:from wave import open as waveOpen from ossaudiodev import open as ossOpen s waveOpen(tada.wav,rb…

Android Flash分区大小查看

正常的8G Flash有多少可以用的 这样算吧: 硬盘和U盘厂家的算法:8GB*10008000MB*10008000000KB*10008000000000B电脑系统的算法:8000000000B/10247812500KB/10247629.4MB/10247.45GB 所以U盘在7.4G左右是正常的,是电脑系统算法和厂…

flash动画设计期末作业_「2019年下学期」第二十五二十六节:期末作品三-吉祥物设计...

初心伟大的艺术品不必追随潮流,他本身就能引领潮流。课前准备软件安装【2019(上)】《三维建模与动画设计》【2019年下学期】第一节:选修介绍及选修人数确定【2019年下学期】第二节:2D&3D设计之百事可乐图标设计【2019年下学期】第三四节&…

Angular2升级到Angular4

angular4终于在两天前发布了正式版本,那么怎么升级呢?其实angular2和angular4之间属于平滑过渡,并不像1和2之间颠覆性的重写代码. npm uninstall -g angular/clinpm cache cleannpm install -g angular/clilatestrm -rf node_modules dist # use rmdir /S/Q node_modules dist…

YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors

来源:https://arxiv.org/abs/2207.02696 代码:https://github.com/WongKinYiu/yolov7 0. Abstract YOLOv7 surpasses all known object detectors in both speed and accuracy in the range from 5 FPS to 160 FPS and has the highest accuracy 56.8…

在git上push代码时缺少Change-Id

问题 使用Git提交代码时,遇到missing Change-Id in commit message footer 会在提交失败信息中提示如何操作,缺失change-Id 会出现如下提示信息,Hint: To automatically insert Change-Id, install the hook: gitdir(gitrev−parse−−git−dir);scp−p−P29418namegit.co.co…

如何把一个网页生成一个快捷方式在桌面?_如何打造一个简洁、高效的桌面?

都2020年了,你的桌面仍是这样的? 或是这样的? 但当然你也见过这样的: 你当然会好奇,没有各种快捷方式、任何文件或文件夹的工作桌面,使用起来岂不效率低下?然则非也。我认为高效的工作得从舒服的…

Android ADB 源码分析(三)

前言 之前分析的两篇文章 Android Adb 源码分析(一) 嵌入式Linux:Android root破解原理(二) 写完之后,都没有写到相关的实现代码,这篇文章写下ADB的通信流程的一些细节 看这篇文章之前,请先阅读 Linux…

A Generative Adversarial Network-based Deep Learning Method for Low-quality Defect ImageReconstructi

A Generative Adversarial Network-based Deep Learning Method for Low-quality Defect ImageReconstruction and Recognition 中文名:基于生成对抗网络的深度低质量缺陷图像的学习方法重建与认可 主体思路概述:将模糊的图像使用Gan进行生成与重建&…

bootstrap3 表单构建器_FastReport.NET报表设计器连接到OracleDB关系数据库

首先,您可以使用ODBC连接器。但是它充满了很多设置。FastReport.NET报表设计器连接到OracleDB关系数据库如您所见,您需要创建数据源及其连接字符串。动作比较多。此方法的替代方法是使用FastReport中的连接器。实际上,有两个连接器可供选择。…

setTimeOut函数传参数

这样使用,后面的4000无效 setTimeout(removeGift(customer_id,gift_id),4000);function removeGift(customer_id,gift_id) {var x 100;var y 900;var rand parseInt(Math.random() * (x - y 1) y); // 随机的位置$("#gift_"customer_id"_"…

码农,选好你的老板

[01 两个小故事] 小明2009年毕业 那一年刚好是金融危机之后,全球经济还不是很好,找到一份好的工作非常困难。 好在,小明误打误撞面试上华为一份码农的工作。 刚开始那几年,小明很拼命,不断的在解bug和制造bug中自由…