avatar

Catalog
adb&Root

Android调试桥(adb)

什么是Android调试桥

Android调试桥(adb)是一种功能多样的命令行工具,可让客户端(例如PC)与设备(真实机/Android虚拟机)进行通信adb命令可作用于执行各种设备操作(例如安装和调试应用),并提供对Unix shell的访问权限(可进入root模式)。它是一种客户端-服务器程序,包括以下三个组件:

  • 客户端:用于发送命令。客户端在开发计算机上运行。可以通过发出adb命令来从命令行终端调用客户端。
  • 守护进程(adbd)在设备上运行命令。守护进程在每个设备上作为后台进程运行。
  • 服务器:管理客户端和守护进程之间的通信。服务器在开发机器上(Android模拟器/真机)作为后台进程运行。

adb包含在Android SDK中,在Windows系统中,通过Android Studio安装SDK后,可以根据其位置找到SDK对应的文件夹 通常位于

Code
1
%UserProfile%\AppData\Local\Android\Sdk

接着进入该目录下的platform-tools目录,即可找到adb

修改Windows环境变量,将adb所在路径添加到系统变量Path中,如下图

即可在命令行中,使用adb相关的命令了。

adb工作原理

当启动某个adb客户端时,该客户端会先检查是否有adb服务器进程正在运行。如果没有,它会启动服务器进程。服务器在启动后会与本地TCP端口5037绑定,并监听adb客户端发出的命令 - 所有adb客户端均通过端口5037与adb服务器通信。

然后,服务器会与所有正在运行的设备建立连接。它通过扫描5555~5585之间(该范围供前16个模拟器使用)的奇数号端口查找模拟器。服务器一旦发现adb守护程序(adbd),便会与相应的端口建立连接。注意,每个模拟器都使用一对按顺序排列的端口 - 用于控制台连接的偶数号端口用于adb连接的奇数号端口。例如:

Code
1
2
3
4
5
模拟器1,控制台:5554
模拟器1,adb:5555
模拟器2,控制台:5556
模拟器2,adb:5557
依此类推

如上所示,在端口5555处与adb连接的模拟器和控制台监听端口为5554的模拟器是同一个。

观察下图,在没有开启安卓模拟器时,使用设备查询命令并未找到设备,两个端口也均无状态。

然后运行安卓模拟器(这里使用Android Studio自带的模拟器),再输入之前的命令,观察结果

可以看到设备列表(说明adb服务器已先启动),并且也可以检测到两个端口的状态,这说明服务器已与设备建立了连接,接下来便可以通过adb命令访问这些设备。

常用adb命令

下面简要介绍几个常用的adb命令,详细内容可参考官方文档

Code
command
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1. 命令:adb devices
作用:显示已连接设备

2. 命令:adb install path_to_apk
参数:-t
作用:在模拟器上安装APK

3. 命令:adb forward tcp:6100 tcp:7100
作用:设置端口转发
示例含义:设置了主机端口6100到设备端口7100的转发

4. 命令:adb pull remote local
作用:从设备(remote)中复制某个文件或目录到主机(local)

5. 命令:adb push local remote
作用:将某个文件或目录从主机(local)复制到设备(remote)

6. 命令:adb kill-server
作用:停止adb服务器

7. 命令:adb start-server
作用:启动adb服务器

8. 命令:adb shell shell_command
作用:通过adb向设备发出shell命令对设备进行操作

9. 命令:adb shell
作用:在设备上启动交互式shell(exit/Ctrl+D退出)

以上为常用adb命令,shell命令不在此扩展,在用到时会在作说明。

Root

什么是Root

Root,也称为根用户,是Unix,类Unix系统,Android及iOS移动设备系统中的唯一超级用户,拥有至高无上的权限。若想通过adb shell进入系统目录中查看,修改文件,就必须要有Root权限。

Android Studio模拟器的Root权限

键入adb shell指令,会出现两种情况:

Code
1
@generic_x86:/ $

这种情况说明此时不是root身份,如果显示为:

Code
1
root@generic_x86:/ #

说明此时已经以root身份运行,可以对模拟器进一步操作。

若没有获取root全选,则可以使用命令adb root进入root模式

观察上图,第一次进入adb shell后,因没有root权限,而无权查看/data目录下的,在使用命令adb root后,却仍然无权限查看。原因在于Android7.0的模拟器是没有root权限的,需要重新装一个低版本的模拟器。

当重新使用一个低版本的Android模拟器时,便解决了之前的问题

可以看到,切到adb shell中,已是root身份,也拥有访问文件的权限。

配置夜神模拟器

Android Studio的官方模拟器有诸多限制,大部分市场上的应用程序很不方便安装,也就不便于调试;夜神模拟器,原本是用于电脑运行移动端游戏的模拟器,其采用Android系统,且能下载很多常用软件,对于研究Android逆向和底层方便许多。

版本同步

首先,我们需要配置adb用来操作夜神模拟器。

可以看到,adb服务器的版本与客户端的版本不匹配,因而无法正常使用adb命令。所以这里需要手动进行adb版本同步的工作:

  • 第一步,将夜神模拟器原先的adb配置文件进行备份
  • 第二步,将所使用版本的adb配置文件(位于Android sdk文件夹下)替换夜神模拟器中的
  • 第三步,将原先夜神模拟器的adb启动文件备份 ,这里的adb启动文件则是夜神模拟器每次启动时使用的,更改它的名字,并用刚刚从Android sdk中复制过来的adb启动文件替换它
  • 上述工作完成,重启夜神模拟器,并在命令行中打印设备,就不会出现版本不匹配的问题了

卸载测试

版本匹配后,来做个简单的测试,先下载QQ

然后再通过命令把它卸载掉

由图很顺利的完成了测试,现在,就可以用夜神模拟器进行接下来的实验了。

Dalvik指令练习

前一章学习了Dalvik指令,但是没有练习,现在学习使用夜神模拟器后,就可以进行了。

编写dalvik指令集代码

第一步,在文件夹中新建一个txt文件,用smali语法编写一段Dalvik指令集代码

Code
1
2
3
4
5
6
7
8
9
10
.class public LHelloWorld;				#定义类名
.super Ljava/lang/Object; #定义父类
.method public static main([Ljava/lang/String; )V #声明静态main()方法
.registers 4 #程序使用4个寄存器
.prologue #代码起始指令
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
const-string v1, "Hello World"
invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
return-void #返回空值
.end method

并将代码拷贝一份,保存为.smali后缀的形式

编译smali文件

看雪工具库中下载smali/baksmali,解压后分别得到smali-2.4.0.jar和baksmali-2.4.0.jar,将smali-2.4.0.jar重命名为smali.jar后,复制到当前文件夹下

执行命令

dos
1
java -jar smali.jar a -o hello.dex hello.smali

会在当前文件夹下生成以.dex结尾的文件,这个文件,便可以运行在Android设备上,接下来通过虚拟机完成这个步骤。

运行dex文件

夜神模拟器还是开着的,之前也已经配置好了,现在就要拿来用了。

先执行设备查询命令查看已经附加的设备

确认设备后,执行以下命令

Code
1
adb push hello.dex /sdcard/

将我们的编译生成的.dex文件push进入夜神模拟器根目录下的/sdcard/目录下

最终运行这个dex文件,还需要用到dalvikvm,可使用adb shell dalvikvm -h命令查看帮助文档。这里需要用到参数-cp指定执行文件所在路径,并在后续参数中指定要执行的类

完整指令如下:

Code
1
adb shell dalvikvm -cp /sdcard/hello.dex HelloWorld

执行结果,打印出HelloWorld,这便是我们用dalvik指令集实现的功能。指令中最后一个参数是HelloWorld而不是hello,前面也有提到,类的名字是HelloWorld,执行dex文件时需指定要执行的类,因此为类名而不是文件名。

参考链接

  1. https://developer.android.google.cn/studio/command-line/adb?hl=zh-cn (Android调试桥官方文档)
  2. https://www.jianshu.com/p/d5f42f0320c2 (Android Studio模拟器的root权限)
  3. https://jingyan.baidu.com/article/19192ad86494bfa53e5707b3.html (如何使用adb操作夜神模拟器)
  4. https://docs.oracle.com/javase/8/docs/api/?xd_co_f=10a3e809-6a01-4da1-a263-23a78e6e10ac (Java8文档:Class System)
  5. https://docs.oracle.com/javase/8/docs/api/java/io/PrintStream.html (Java8文档:Class PrintStream)
  6. https://www.ucloud.cn/yun/14011.html (用Smali手写一个可运行的HelloWorld)
Author: cataLoc
Link: http://cataloc.gitee.io/blog/2020/08/06/adb%E4%B8%8ERoot/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
    微信
  • 支付寶
    支付寶