2.2 常用命令行工具
2.2.1 adb
Android 调试桥 (adb)全称为Android Debug Bridge,是一种功能多样的命令行工具,可让使用者与目标设备进行通信。adb 命令还可进行各种设备操作(例如安装和调试应用),并提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。
adb 命令语法格式如下:
1
|
adb [
-
d |
-
e |
-
s <deviceId>] <command>
|
参数具体含义如下:
当仅有一个设备连接时,命令中可以不指定[-d|-e|-s <serial-number>]参数,直接使用 adb <command>的方式进行操作。连接多个设备情况时常见的是方法是通过 -s <deviceId> 参数指定待连接的设备。
如果和目标设备在同一局域网,可以通过IP+端口的方式连接到目标设备。
1
|
adb connect host_ip[:port]
|
可以通过 adb devices 命令查看当前已经连接的设备:
1
2
3
4
5
|
$ adb devices
List
of devices attached
rsnvs87d5dgewt device
a38b2e8 device
emulator
-
5554
device
|
这种场景下如果想指定 a38b2e8 设备来运行 adb 命令,可以采用 -s <deviceId> 的方式
1
|
adb
-
s a38b2e8 install demo.apk
|
通过adb查看目标设备应用列表的基本命令格式是
1
|
adb shell pm
list
packages [
-
f|
-
d|
-
e|
-
s|
-
3
|
-
i|
-
u] [
-
-
user USER_ID] [
FILTER
]
|
查看目标设备上安装的所有应用
1
|
adb shell pm
list
packages
|
查看目标设备上安装的系统应用
1
|
adb shell pm
list
packages
-
s
|
查看目标设备上用户自己安装的应用
1
|
adb shell pm
list
packages
-
3
|
查看目标设备上包名中含有指定字符的应用
1
|
adb shell pm
list
packages
'test'
|
adb配合am <command>命令可以实现与目标应用的交互,常用命令如下图所示:
启动一个应用,命令格式如下所示:
1
|
adb shell am start
-
n com.test.demo
/
com.test.demo.activity
|
注意:可以用debug方式启动应用(am start -D -n)。特别在反编译调试应用的时候,可能需要用debug方式启动应用。
启动指定的Service服务,具体命令如下所示:
1
|
adb shell am startservice
-
n com.test.demo
/
com.test.demo.service
|
发送一个指定的广播,具体命令如下所示:
1
|
adb shell am broadcast
-
a android.NET.conn.CONNECTIVITY_CHANGE
|
强制停止指定报名的应用,具体命令如下所示:
1
|
adb shell am force
-
stop com.test.demo
|
adb除了可以和应用交互外,还可以配合input 命令模拟更多的用户行为,例如按键行为和输入行为。模拟按键行为的命令如下:
1
|
adb shell
input
keyevent <keycode>
|
经常使用的keycode如下表所示
模拟用户滑动行为,具体命令如下图所示:
1
|
adb shell
input
swipe
500
300
100
300
|
代码含义模拟用户向左滑动屏幕。参数500 300 100 300,分别表示起始点x坐标,起始点y坐标,结束点x坐标和结束点y坐标。
模拟用户点击屏幕的行为,具体命令如下图所示:
1
|
adb shell
input
tap
100
300
|
代码含义模拟用户向单击屏幕。参数100 300分别表示点击位置的x坐标和y坐标。
其他常用命令
查看当前应用的activity组件信息信息
1
|
adb shell dumpsys activity top
|
查看指定包名应用的详细信息
1
|
adb shell dumpsys [packagename]
|
查看指定进程名或者进程id的内存信息
1
|
adb shell dumpsys meminfo [packagename
/
pid]
|
可以查看指定包名应川的数据库存储信息
1
|
adb shell dumpsys dbinfo [packagename]
|
重启进入到bootloader,即刷机模式
重启进入recovery,即恢复模式
2.2.2 readelf
readelf是用于查看ELF格式的文件信息的工具,常见的ELF文件如在Android平台上的可执行文件、动态库或者静态库等。
Linux系统下可以直接在在命令行中使用该工具,Mac系统无法直接使用该工具,但可以安装使用greadelf,两者功能是一样的。具体安装命令如下:
1
2
|
brew install binutils
/
/
x86架构的安装方法
arch
-
arm64 brew install binutils
/
/
arm架构的安装方法
|
readelf工具的功能较多,可在命令直接输入readelf --help命令获取readelf的功能介绍和所有参数的说明及用法,本章节只对其中的几个常用参数以及数据进行讲解。
查看动态库文件形式的elf文件头信息,具体命令如下图所示:
查看ELF文件程序头的信息,具体命令如下图所示:
查看ELF文件的节信息,具体命令如下图所示:
2.2.3 apktool
Android apk文件在编译打包时除了将源码编译为dex文件外,还会将配置文件和部分资源文件编译为二进制文件。如果直接解包Apk文件是无法反编译dex文件和相关配文件。Apktool是Connor Tumbleson大神专门为逆向分析Android apk文件的开发的工具,该工具不仅可以将dex文件反编译为smali代码同时还会解码配置文件和资源文件。Apktool 运行需要依赖 Java1.8即以上的环境,在正式开始使用前请确保电脑的环境是否为Java1.8或更⾼版本。通过官网https://ibotpeaches.github.io/Apktool下载最新版Apktool。
下载完成后可在命令行中输入java -jar apktool.jar -h命令获取apktool的功能介绍和所有参数的说明及用法,本章节只对其中的几个常用功能进行讲解。
将目标应用demo.apk反编译至目标目录output,具体命令如下图所示
1
|
apktool d [options] demo.apk
-
o output
|
options是可选参数,具体参数列表如下图所示:
将反编译后demo.apk输出结果,重新打包了进行打包,具体命令如下图所示
1
|
apktool b [options] output
-
o repackage.apk
|
options是可选参数,具体参数列表如下图所示:
2.2.4 Clutch
iOS正常只能通过App Store下载安装应用,要想对应用进行分析只能从目标设备上导出目标应用的IPA包。苹果为了保护开发者的权益使用了数字版权加密技术对IPA包进行了保护,直接导出的IPA包内容是无法直接进行分析。如果要想对IPA文件进行分析就需要对其进行解密,也就是人们通常说的砸壳。
Clutch是一款便捷的工具解密工具,支持 iPhone、iPod Touch和iPad以及所有iOS版本、架构类型和大多数二进制文件。不管应用如何加密,运行的时候总要解密,Clutch就是在应用运行时的内存数据按照一定格式导出。
Clutch的源码是在Github开源的,可以自己下载编译。下载源码后可以将项目导入到Xcode中编译,也可以通过命令行的方式进行编译。在这里将展示通过命令行的方式编译Clutch。首先安装编译所需环境和下载工具源码,具体如下图所示。
1
2
|
xcode
-
select
-
-
install
/
/
安装编译所需的 command line tools
git clone https:
/
/
github.com
/
KJCracks
/
Clutch.git
/
/
下载工具源码
|
开始正式编译,具体命令如下图所示:
1
2
3
|
mkdir build && cd build
cmake
-
DCMAKE_BUILD_TYPE
=
Release
-
DCMAKE_TOOLCHAIN_FILE
=
..
/
cmake
/
iphoneos.toolchain.cmake ..
make
|
通过scp命令将编译好的Clutch安装到目标设备,具体命令如下:
1
|
scp .
/
build
/
Clutch root@<your.device.ip>:
/
usr
/
bin
/
Clutch
|
通过ssh的方式连接目标设备,在命令行中输入Clutch即可查看该工具的所有功能,如下图所示。
查看目标设备上安装的应用清单,具体命令如下图所示:
1
2
3
4
5
|
iPhone:~ root
Installed apps:
1
: TextDemo <com.test.dump>
2
: TextDemo2 <com.test2.dump>
3
: TextDemo3 <com.test3.dump>
|
对选中的目标应用进行砸壳操作,具体命令如下图所示:
至此已经完成砸壳操作,砸壳后的应用通常会存在此目录下/private/var/mobile/Documents/Dumped。
2.2.5 Class-dump
Class-dump可以将砸壳后的ipa文件中的头文件导出,逆向分析iOS应用时根据头文件中声明的函数名或者变量的名字可极大的提高分析速度。Class-dump的官方版本因太久不维护对Objective-C 2.0和swift开发的应用支持的不友好,一些大神基于官方版本进行了修改可以很好的支持Objective-C 2.0和swift开发的应用。虽然Class-dump出现好多修改版,但是使用方法和功能和官方版本依然保持一致。本章节将使用官方版本进行讲解。
在官网http://stevenygard.com下载的class-dump-3.5.dmg文件,双击打开把里面的class-dump文件,复制到/usr/local/bin/目录下,这样就可以直接在终端的命令行中使用class-dump命令 。
通过Class-dump工具将应用的Header信息输出在终端,具体命令如下:
1
|
$
class
-
dump TestDemo.app
|
输出结果 如下图所示
正常情况下目标应用中会存在大量的函数,如果将结果输出在终端不方便查看。Class-dump提供了将结果输出到指定目录的功能,具体命令如下图所示:
1
|
class
-
dump
-
H TestDemo.app
-
o Headers
|
输出结果如下图所示:
至此就可以使用目标应应用中头文件中的函数信息愉快的进行分析了。