2023最新版Android逆向教程——第3天:ADB原理及其常用命令

一、介绍

Android 调试桥(adb) 是一种功能多样的命令行工具,它可以让你与设备进行通信,adb 命令可用于执行各种设备操作(例如安装和调试应用),并提供对 Unix shell(可用来在设备上运行各种命令) 的访问权限,它是一种 C/S 架构 的程序,包括以下三个组件:

  1. 客户端: 主要用于发送命令,adb client 在开发机器上运行,我们可以通过发出 adb 命令从命令行终端调用客户端,它主要的工作是解析像 push、shell、install 等命令的参数,做必要预处理,然后转移为指令或数据,发送给 adb server。
  2. 守护程序(adbd): 是运行在 Android设备(真机/模拟器) 后台的一个进程,它是由 init 进程启动的,并且系统一开机就已经启动,它的主要作用是处理来自 adb server 的命令行请求,然后获取对应 Android设备的信息,再将结果返回给 adb server
  3. 服务器:是运行在开发机器上的一个后台进程,它有两个作用:1、检测 USB 端口感知设备的连接和拔除,以及模拟器实例的启动或停止;2、将 adb client 的请求 通过 usb 或者 tcp 的方式发送到对应的 adbd 上。

二、工作原理

当我们启动某个 ADB客户端 时,客户端会先检查是否有 ADB服务器 进程正在运行。如果没有,它将启动服务器进程。服务器在启动后会与 本地TCP 端口 5037 绑定,并监听 ADB客户端 发出的命令,所有 ADB 客户端均通过端口 5037 与 ADB服务器 通信。然后,服务器会与所有正在运行的设备建立连接。它通过扫描 5555到5585之间 (该范围供前16个模拟器使用) 的奇数号端口查找模拟器。服务器一旦发现 ADB守护进程 (adbd),便会与相应的端口建立连接。
在这里插入图片描述
所有的 Client 通过 TCP 端口号5037 进行与 Server 通信,而 Server 创建 local socket 与 remote socket,前者用于和 Client 通信,后者用与远端进行通信,emulator(模拟器) 通过TCP,real device 则通过 usb。服务器与所有设备均建立连接后,你便可以使用 adb 命令访问这些设备,由于服务器管理与设备的连接,并处理来自多个 adb 客户端的命令,因此你可以从任意客户端(或从某个脚本)控制任意设备。

举个例子:

  1. 我们通过 Android Studio 工具或者命令行界面直接或间接的调用某个 adb 命令,比如 adb install 或者 adb devices
  2. adb 进程会 fork 出一个子进程作为 adb server,而这个 fork 出的进程将常驻PC端,监听来自 Client 端的请求
  3. adb server查找当前连接的真机或者模拟器,并接收来自 Client 端发出的请求
  4. adb server处理请求:如果是本地能直接处理的请求比如:adb devices 就直接处理,如果是本地处理不了的请求就会转发给连接的真机或者模拟器来进行处理,可以通过数据线和 TCP/IP 的方式通信
  5. 位于真机或者模拟器后台的 adbd 进程接收到请求后,通过 JDWP 协议转发给对应的 Java 虚拟机进程处理
  6. adbd 将处理后的结果返回给 adb server
  7. adb server 再将结果返回给 Client,这时候我们就在命令行界面中看到展示结果了

三、ADB 的配置

安装 AndroidStudio,链接:2023最新版Android逆向教程——第1天:Android Studio的安装与配置
安装完成 AndroidStudio 之后,找到 SDK 的目录,如下图所示:

D:\develop_tools\Android\SDK\platform-tools 路径配置到环境变量中,我们即可使用 adb,如下图所示:

在控制台,输入 adb version,可以显示我们使用 adb 的版本及它的所处路径,如下图所示:
在这里插入图片描述

四、ADB 常见命令及选项

4.1 adb help/adb --help 查看帮助

在这里插入图片描述

4.2 adb version 显示 adb 版本及所在路径

在这里插入图片描述

4.3 adb devices 显示连接的设备列表

[-l] 列举所有设备,-l 表示长输出,包含设备名称等信息。如下图所示:
在这里插入图片描述

4.4 adb push 文件路径 目标路径(以/开头) 推送电脑的文件到手机

在这里插入图片描述

4.5 adb pull 文件路径(手机) 本地路径(PC,可选) 拉取手机的文件到电脑

在这里插入图片描述

4.6 adb shell 进入到手机的Linux控制台

在这里插入图片描述
adb -s 设备名 shell 多设备时,指定设备

4.7 adb install [-lrtsdg] <file>(xxx.apk) 通过adb安装app

push this package file to the device and install it,参数说明如下:

  1. -l:直接锁定app
  2. -r:替换已存在的app,也就是说强制安装
  3. -t:允许安装测试包
  4. -s:把app安装到sd卡上
  5. -d:允许降版本安装(只在针对调试版本的 app 有用)
  6. -g:安装时获取所有权限(只有 6.0 系统可用)

在这里插入图片描述
安装成功之后,在手机端查看,如下图所示:

adb uninstall 包名 通过adb卸载app,借助jadx工具查看App7的包名,然后执行 adb uninstall 命令卸载App7,如下图所示:
在这里插入图片描述
卸载:
在这里插入图片描述
手机端再次查看App7发现不存在了,如下图所示:

adb uninstall -k <package_name> 可选参数 -k 的作用为卸载软件但是保留配置和缓存文件

4.8 adb start-server 确保启动 adb server

在这里插入图片描述

4.9 adb kill-server 停止 adb server

4.10 adb get-serialno 获取设备唯一序列号(如打卡app 通过该值判断是否重复打卡)

4.11 adb get-state 获取设备的状态

设备的状态有3种:device、offline、unknown,说明如下:

  1. device:设备正常连接
  2. offline:连接出现异常,设备无响应
  3. unknown:没有连接设备
    在这里插入图片描述

4.12 ADB 命令大全

https://blog.csdn.net/weixin_43847093/article/details/84673414

至此今天的学习就到此结束了,笔者在这里声明,笔者写文章只是为了学习交流,以及让更多学习安卓逆向的读者少走一些弯路,节省时间,并不用做其他用途,如有侵权,联系博主删除即可。感谢您阅读本篇博文,希望本文能成为您编程路上的领航者。祝您阅读愉快!


在这里插入图片描述

    好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
    如果我的博客对你有帮助、如果你喜欢我的博客内容,请 点赞评论收藏 一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
 编码不易,大家的支持就是我坚持下去的动力。点赞后不要忘了 关注 我哦!

猜你喜欢

转载自blog.csdn.net/xw1680/article/details/133853222