安卓学习思路方法总结(四)
字数 1812 2025-08-10 08:28:55
Android逆向工程动态调试技术详解
一、Android Studio动态调试
1. 准备工作
所需工具安装:
- Apktool:用于反编译APK
- smali:用于处理smali代码
- Android Studio:开发环境
2. 反编译APK
- 使用Android Killer反编译目标APK,获取完整的smali代码
- 导出反编译后的项目包(Project)
3. 项目导入与配置
- 将反编译的项目包导入Android Studio
- 为项目添加root权限
- 配置SDK环境
- 设置远程调试:
- 自定义调试名称
- 确保端口未被占用
- 选择项目文件夹
4. ADB操作基础
# 查看连接设备
adb devices
# 进入设备shell
adb shell
# 查看进程
adb shell ps
参数说明:
- PID:进程ID
- PPID:父进程ID
- VSIZE:进程虚拟内存大小(kb)
- RSS:实际占用内存大小
- WCHAN:进程睡眠的函数名称
- PC:电脑内核函数名称
- NAME:包名
5. 动态调试流程
- 在安卓设备上运行目标程序
- 查找进程PID:
adb shell ps - 端口转发:
adb forward tcp:8700 jdwp:13362
- 在Android Studio中设置断点(如checkSN()方法)
- 触发程序流程,断点将自动停止
- 调试快捷键:
- F7:单步步入
- F8:单步步过
- F9:跳转到下一个断点
6. 常见问题解决
# ADB万能重启命令
adb kill-server
adb start-server
adb remount
二、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到设备:
adb push C:\IDA7.0\dbgsrv\android_server /data/local/tmp
- 修改权限:
chmod 777 /data/local/tmp/android_server
- 重命名(绕过检测):
mv android_server a001
- 运行调试服务:
./a001 -p23946
- 端口转发:
adb forward tcp:23946 tcp:23946
4. 调试流程
- 安装目标APK:
adb install path/to/apk
-
在IDA中选择Debugger→Remote ARM Linux/Android debugger
-
配置连接(默认端口23946)
-
使用Ctrl+F搜索目标进程(如ndk)
-
使用模块列表监控:
- 库挂起
- 入口点
- 线程开始/结束
- 库加载/卸载
-
启动调试(F9或左上角运行按钮)
5. 普通调试流程
- 挂起目标程序:
adb shell am start -D -n com.example.packagename/.MainActivity
- 运行DDMS,查看调试端口(如8600)
- 附加调试器:
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8600
- 在IDA中加载.so文件
- 通过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)
参数解析:
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配置
APP_ABI := x86 armeabi-v7a
说明:
- armeabi-v7a兼容armeabi,支持第7代及以上ARM处理器
- x86可兼容armeabi
4. 编译与部署
- 将代码放入jni目录
- 执行ndk-build编译
- 生成文件位于libs和obj目录
- 上传到设备:
adb push libs/armeabi-v7a/liba001.so /data/local/tmp
- 设置可执行权限:
chmod +x /data/local/tmp/liba001.so
- 运行测试
四、安全声明
请注意:本文所述技术仅用于学习目的。如果将这些技术用于其他任何目标,使用者需自行承担相应责任。在进行任何逆向工程操作前,请确保已获得相关授权并遵守当地法律法规。