安卓学习思路方法总结(四)
字数 1812 2025-08-10 08:28:55

Android逆向工程动态调试技术详解

一、Android Studio动态调试

1. 准备工作

所需工具安装:

2. 反编译APK

  1. 使用Android Killer反编译目标APK,获取完整的smali代码
  2. 导出反编译后的项目包(Project)

3. 项目导入与配置

  1. 将反编译的项目包导入Android Studio
  2. 为项目添加root权限
  3. 配置SDK环境
  4. 设置远程调试:
    • 自定义调试名称
    • 确保端口未被占用
    • 选择项目文件夹

4. ADB操作基础

# 查看连接设备
adb devices

# 进入设备shell
adb shell

# 查看进程
adb shell ps

参数说明:

  • PID:进程ID
  • PPID:父进程ID
  • VSIZE:进程虚拟内存大小(kb)
  • RSS:实际占用内存大小
  • WCHAN:进程睡眠的函数名称
  • PC:电脑内核函数名称
  • NAME:包名

5. 动态调试流程

  1. 在安卓设备上运行目标程序
  2. 查找进程PID:adb shell ps
  3. 端口转发:
adb forward tcp:8700 jdwp:13362
  1. 在Android Studio中设置断点(如checkSN()方法)
  2. 触发程序流程,断点将自动停止
  3. 调试快捷键:
    • F7:单步步入
    • F8:单步步过
    • F9:跳转到下一个断点

6. 常见问题解决

# ADB万能重启命令
adb kill-server
adb start-server
adb remount

二、IDA动态调试

1. 准备工作

  1. 使用Android Killer反编译APK,获取.so文件
  2. 安装IDA Pro

2. IDA基础操作

文件加载:

  • 选择ELF格式解析.so文件
  • IDA是递归下降的反汇编工具,地址逐渐增大

界面元素:

  • 导航条颜色含义:
    • 蓝色:常规指令函数
    • 深蓝:用户编写的函数
    • 浅蓝:编译器添加的函数
    • 黑色:节间间隙
    • 银白:数据内容
    • 粉色:外部导入符号
    • 暗黄:未识别内容

视图窗口:

  • IDA View:文本/图表/路径视图
  • Hex View:十六进制窗口
  • Imports:导入函数
  • Structures:结构体
  • Exports:导出函数
  • Enums:枚举
  • Strings:字符串

快捷键:

  • 空格:切换文本/图表视图
  • ESC:返回上一步
  • G:搜索地址/符号
  • N:重命名符号
  • ::常规注释
  • ;:可重复注释
  • Alt+M:添加标签
  • Ctrl+M:查看标签
  • Ctrl+S:查看段信息
  • C:转换为代码
  • D:转换为数据
  • A:解析为ASCII字符串
  • U:解析为未定义内容
  • X:查看交叉引用
  • F5:查看伪代码
  • Alt+T:搜索文本
  • Alt+B:搜索十六进制

3. 环境配置

  1. 上传android_server到设备:
adb push C:\IDA7.0\dbgsrv\android_server /data/local/tmp
  1. 修改权限:
chmod 777 /data/local/tmp/android_server
  1. 重命名(绕过检测):
mv android_server a001
  1. 运行调试服务:
./a001 -p23946
  1. 端口转发:
adb forward tcp:23946 tcp:23946

4. 调试流程

  1. 安装目标APK:
adb install path/to/apk
  1. 在IDA中选择Debugger→Remote ARM Linux/Android debugger

  2. 配置连接(默认端口23946)

  3. 使用Ctrl+F搜索目标进程(如ndk)

  4. 使用模块列表监控:

    • 库挂起
    • 入口点
    • 线程开始/结束
    • 库加载/卸载
  5. 启动调试(F9或左上角运行按钮)

5. 普通调试流程

  1. 挂起目标程序:
adb shell am start -D -n com.example.packagename/.MainActivity
  1. 运行DDMS,查看调试端口(如8600)
  2. 附加调试器:
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8600
  1. 在IDA中加载.so文件
  2. 通过Modules窗口查看加载的模块

三、安卓逆向-JNI开发

1. 编写C代码示例

#include <stdio.h>
#include <android/log.h>

int main() {
    __android_log_print(ANDROID_LOG_DEBUG, "JNI", "a001");
    return 0;
}

2. Android.mk文件编写

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := a001
LOCAL_SRC_FILES := a001.c
LOCAL_ARM_MODE := arm
LOCAL_LDLIBS += -llog
LOCAL_CFLAGS += -pie -fPIE
LOCAL_LDFLAGS += -pie -fPIE
include $(BUILD_SHARED_LIBRARY)

参数解析:

  1. LOCAL_PATH := $(call my-dir):获取JNI文件路径
  2. include $(CLEAR_VARS):清理LOCAL_开头的变量
  3. LOCAL_MODULE:定义模块名(生成lib.so)
  4. LOCAL_SRC_FILES:指定源文件
  5. LOCAL_ARM_MODE:指令集设置(arm为4字节指令)
  6. LOCAL_LDLIBS:链接库(如llog用于Android日志)
  7. PIE相关标志:Android L(5.0)后必须添加的安全机制

3. Application.mk配置

APP_ABI := x86 armeabi-v7a

说明:

  • armeabi-v7a兼容armeabi,支持第7代及以上ARM处理器
  • x86可兼容armeabi

4. 编译与部署

  1. 将代码放入jni目录
  2. 执行ndk-build编译
  3. 生成文件位于libs和obj目录
  4. 上传到设备:
adb push libs/armeabi-v7a/liba001.so /data/local/tmp
  1. 设置可执行权限:
chmod +x /data/local/tmp/liba001.so
  1. 运行测试

四、安全声明

请注意:本文所述技术仅用于学习目的。如果将这些技术用于其他任何目标,使用者需自行承担相应责任。在进行任何逆向工程操作前,请确保已获得相关授权并遵守当地法律法规。

Android逆向工程动态调试技术详解 一、Android Studio动态调试 1. 准备工作 所需工具安装: Apktool :用于反编译APK smali :用于处理smali代码 Android Studio :开发环境 2. 反编译APK 使用Android Killer反编译目标APK,获取完整的smali代码 导出反编译后的项目包(Project) 3. 项目导入与配置 将反编译的项目包导入Android Studio 为项目添加root权限 配置SDK环境 设置远程调试: 自定义调试名称 确保端口未被占用 选择项目文件夹 4. ADB操作基础 参数说明: PID:进程ID PPID:父进程ID VSIZE:进程虚拟内存大小(kb) RSS:实际占用内存大小 WCHAN:进程睡眠的函数名称 PC:电脑内核函数名称 NAME:包名 5. 动态调试流程 在安卓设备上运行目标程序 查找进程PID: adb shell ps 端口转发: 在Android Studio中设置断点(如checkSN()方法) 触发程序流程,断点将自动停止 调试快捷键: F7:单步步入 F8:单步步过 F9:跳转到下一个断点 6. 常见问题解决 二、IDA动态调试 1. 准备工作 使用Android Killer反编译APK,获取.so文件 安装IDA Pro 2. IDA基础操作 文件加载: 选择ELF格式解析.so文件 IDA是递归下降的反汇编工具,地址逐渐增大 界面元素: 导航条颜色含义: 蓝色:常规指令函数 深蓝:用户编写的函数 浅蓝:编译器添加的函数 黑色:节间间隙 银白:数据内容 粉色:外部导入符号 暗黄:未识别内容 视图窗口: IDA View:文本/图表/路径视图 Hex View:十六进制窗口 Imports:导入函数 Structures:结构体 Exports:导出函数 Enums:枚举 Strings:字符串 快捷键: 空格:切换文本/图表视图 ESC:返回上一步 G:搜索地址/符号 N:重命名符号 ::常规注释 ;:可重复注释 Alt+M:添加标签 Ctrl+M:查看标签 Ctrl+S:查看段信息 C:转换为代码 D:转换为数据 A:解析为ASCII字符串 U:解析为未定义内容 X:查看交叉引用 F5:查看伪代码 Alt+T:搜索文本 Alt+B:搜索十六进制 3. 环境配置 上传android_ server到设备: 修改权限: 重命名(绕过检测): 运行调试服务: 端口转发: 4. 调试流程 安装目标APK: 在IDA中选择Debugger→Remote ARM Linux/Android debugger 配置连接(默认端口23946) 使用Ctrl+F搜索目标进程(如ndk) 使用模块列表监控: 库挂起 入口点 线程开始/结束 库加载/卸载 启动调试(F9或左上角运行按钮) 5. 普通调试流程 挂起目标程序: 运行DDMS,查看调试端口(如8600) 附加调试器: 在IDA中加载.so文件 通过Modules窗口查看加载的模块 三、安卓逆向-JNI开发 1. 编写C代码示例 2. Android.mk文件编写 参数解析: LOCAL_PATH := $(call my-dir) :获取JNI文件路径 include $(CLEAR_VARS) :清理LOCAL_ 开头的变量 LOCAL_MODULE :定义模块名(生成lib .so) LOCAL_SRC_FILES :指定源文件 LOCAL_ARM_MODE :指令集设置(arm为4字节指令) LOCAL_LDLIBS :链接库(如llog用于Android日志) PIE相关标志:Android L(5.0)后必须添加的安全机制 3. Application.mk配置 说明: armeabi-v7a兼容armeabi,支持第7代及以上ARM处理器 x86可兼容armeabi 4. 编译与部署 将代码放入jni目录 执行ndk-build编译 生成文件位于libs和obj目录 上传到设备: 设置可执行权限: 运行测试 四、安全声明 请注意:本文所述技术仅用于学习目的。如果将这些技术用于其他任何目标,使用者需自行承担相应责任。在进行任何逆向工程操作前,请确保已获得相关授权并遵守当地法律法规。