Android Monitor使用教程:逆向必备

前言

Android Monitor是Android逆向分析中不可或缺的调试工具,能够实时监控应用的运行状态、方法调用、内存变化等关键信息。本教程将详细介绍Monitor的安装配置和实战使用技巧。

工具介绍

Android Monitor主要包含以下功能模块:

  • 方法追踪:监控Java/Native方法调用
  • 内存分析:查看堆内存使用情况
  • 线程监控:跟踪线程状态和执行流程
  • 网络分析:抓取HTTP/HTTPS请求
  • 文件操作监控:追踪文件读写操作

环境准备

1. 系统要求

  • Android设备或模拟器 (API Level 16+)
  • Root权限或可调试应用
  • ADB调试工具
  • Java运行环境 (JDK 1.8) - 重要:Monitor仅支持JDK 1.8,高版本JDK无法正常启动

2. 安装Monitor

JDK 1.8环境配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 检查当前Java版本
java -version

# 如果不是JDK 1.8,需要安装并切换
# Ubuntu/Debian
sudo apt-get install openjdk-8-jdk

# CentOS/RHEL
sudo yum install java-1.8.0-openjdk-devel

# macOS (使用homebrew)
brew install openjdk@8

# 设置JAVA_HOME为JDK 1.8
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH

# 验证版本 (必须显示1.8.x)
java -version
# 输出应该类似:openjdk version "1.8.0_xxx"

多JDK版本管理

1
2
3
4
5
6
7
8
# 使用update-alternatives管理多个JDK版本 (Linux)
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-8-openjdk-amd64/bin/java 1
sudo update-alternatives --config java

# macOS使用jenv管理
brew install jenv
jenv add /usr/local/opt/openjdk@8/
jenv global 1.8

下载安装包

1
2
3
4
5
6
# 从官方仓库下载
git clone https://github.com/android/platform_tools_monitor.git
cd platform_tools_monitor

# 或直接下载预编译版本
wget https://dl.google.com/android/repository/monitor-linux.zip

环境配置

1
2
3
4
5
6
7
# 添加到环境变量
export ANDROID_HOME=/path/to/android-sdk
export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools

# 验证安装
adb devices
monitor --version

基本使用

1. 启动Monitor

1
2
3
4
5
# 命令行启动
monitor

# 或使用Android Studio内置版本
android-studio/bin/monitor.sh

2. 连接设备

1
2
3
4
5
# 连接真机
adb connect 设备IP:5555

# 查看可用设备
adb devices -l

3. 选择目标应用

  1. 在Monitor界面选择设备

 
2. 从进程列表选择目标应用

 
3. 点击”Attach”开始监控

核心功能详解

方法追踪 (Method Profiling)

开启方法追踪

1
2
3
4
// 在代码中插入追踪点
Debug.startMethodTracing("trace_name");
// 目标代码段
Debug.stopMethodTracing();

分析追踪文件

1
2
3
4
5
# 导出追踪文件
adb pull /sdcard/trace_name.trace ./

# 使用dmtracedump分析
dmtracedump -g trace_name.trace > call_graph.html

内存分析 (Memory Analysis)

堆内存快照

1
2
3
4
5
# 生成HPROF文件
adb shell am dumpheap 包名 /sdcard/heap.hprof

# 转换格式供MAT分析
hprof-conv /sdcard/heap.hprof heap_converted.hprof

内存泄漏检测

  1. 触发GC:System.gc()
  2. 对比多个时间点的内存快照
  3. 查找持续增长的对象引用

网络监控 (Network Profiling)

HTTP请求抓取

1
2
3
4
// 使用OkHttp拦截器
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new LoggingInterceptor())
.build();

Charles/Burp Suite联动

1
2
# 设置代理
adb shell settings put global http_proxy 电脑IP:8080

实战案例

案例1:分析应用启动性能

1
2
3
4
5
6
7
8
# 1. 冷启动追踪
adb shell am start -W -n 包名/主Activity

# 2. 开启方法追踪
Debug.startMethodTracing("startup");

# 3. 分析关键路径
# Application.onCreate() -> Activity.onCreate() -> 首屏渲染

案例2:定位内存泄漏

1
2
3
4
5
6
7
8
9
// 1. 模拟内存泄漏场景
private static List<Context> contexts = new ArrayList<>();

public void leakMemory(Context context) {
contexts.add(context); // 静态引用导致泄漏
}

// 2. 使用Monitor检测
// HeapDump分析 -> 查找Context引用链 -> 定位泄漏源

案例3:逆向分析加密算法

1
2
3
4
5
6
7
8
9
10
11
12
// 1. Hook关键方法
public class CryptoHook {
public static void hookEncrypt() {
// 监控加密方法调用
Method encrypt = targetClass.getDeclaredMethod("encrypt", String.class);
// 记录输入输出参数
}
}

// 2. 分析调用栈
// Monitor显示:plaintext -> encrypt() -> ciphertext
// 通过参数对比推断加密算法

高级技巧

1. 自定义Hook脚本

1
2
3
4
5
6
7
8
9
10
// Frida脚本配合Monitor使用
Java.perform(function() {
var targetClass = Java.use("com.example.Target");
targetClass.sensitiveMethod.implementation = function(param) {
console.log("[Monitor] 调用参数:", param);
var result = this.sensitiveMethod(param);
console.log("[Monitor] 返回值:", result);
return result;
};
});

2. 批量分析脚本

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
#!/usr/bin/env python3
import subprocess
import json

def analyze_app(package_name):
"""批量分析应用性能"""
# 1. 启动应用
subprocess.run(['adb', 'shell', 'am', 'start', f'-n {package_name}/.MainActivity'])

# 2. 生成性能报告
subprocess.run(['monitor', '--package', package_name, '--output', f'{package_name}_report.json'])

# 3. 解析关键指标
with open(f'{package_name}_report.json') as f:
data = json.load(f)
return {
'startup_time': data['startup_time'],
'memory_usage': data['memory_peak'],
'cpu_usage': data['cpu_average']
}

# 批量分析多个应用
apps = ['com.example.app1', 'com.example.app2']
for app in apps:
result = analyze_app(app)
print(f"{app}: {result}")

常见问题解决

1. Monitor无法启动

1
2
3
4
5
6
7
8
9
10
# 检查JDK版本 - 最常见问题
java -version
# 必须是1.8.x版本,如果是Java 9+会无法启动

# 临时切换到JDK 1.8
export JAVA_HOME=/path/to/jdk1.8
export PATH=$JAVA_HOME/bin:$PATH

# 重新启动Monitor
monitor

2. 连接失败

1
2
3
4
5
# 检查ADB连接
adb kill-server && adb start-server

# 确认USB调试已开启
adb shell getprop ro.debuggable

3. 权限不足

1
2
3
4
5
6
# Root设备
adb root
adb remount

# 非Root设备 - 使用可调试版本
adb install -r app-debug.apk

4. 性能影响

1
2
3
4
// 生产环境移除调试代码
if (BuildConfig.DEBUG) {
Debug.startMethodTracing("production_trace");
}

注意事项

  1. 性能开销:Monitor会显著影响应用性能,仅在调试时使用
  2. 隐私安全:避免在生产环境记录敏感信息
  3. 存储空间:追踪文件可能很大,及时清理
  4. 版本兼容:不同Android版本的Monitor功能略有差异

总结

Android Monitor是逆向分析的强大工具,掌握其使用方法能够:

  • 深入理解应用运行机制
  • 快速定位性能瓶颈
  • 辅助安全漏洞挖掘
  • 提升逆向分析效率

建议结合Frida、Xposed等动态分析工具使用,构建完整的Android逆向分析工具链。


本教程仅供学习研究使用,请遵守相关法律法规

支付宝打赏 微信打赏

如果文章对你有帮助,欢迎点击上方按钮打赏作者,更多功能请访问博客站



Android Monitor使用教程:逆向必备
https://blog.fxcxy.com/2025/05/29/Android—Monitor使用教程-逆向必备/
作者
spatacus
发布于
2025年5月29日
许可协议