1. 逆向工程环境搭建:Mac平台工具链配置
在Mac环境下进行安卓App逆向分析,首先需要搭建一套完整的工具链。与Windows平台不同,Mac系统需要特别注意权限管理和环境兼容性问题。
1.1 基础工具安装
Homebrew是Mac平台不可或缺的包管理工具,建议首先安装:
bash复制/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
接着安装Java环境(推荐JDK8):
bash复制brew install --cask adoptopenjdk/openjdk/adoptopenjdk8
Android SDK可以通过Android Studio安装,但作为逆向工程师我们只需要命令行工具:
bash复制brew install --cask android-sdk
echo 'export ANDROID_SDK_ROOT=/usr/local/share/android-sdk' >> ~/.zshrc
1.2 抓包工具配置
Charles是Mac平台最常用的抓包工具,安装后需要进行SSL证书配置:
- 安装Charles:
brew install --cask charles - 在Charles菜单选择Help > SSL Proxying > Install Charles Root Certificate
- 将证书设置为始终信任
- 在Android设备上安装证书(通过chls.pro/ssl下载)
对于更底层的流量分析,可以配合使用tcpdump:
bash复制brew install tcpdump
sudo tcpdump -i en0 -s 0 -w capture.pcap
1.3 逆向分析工具集
关键逆向工具安装:
bash复制# 反编译工具
brew install apktool
brew install dex2jar
brew install jadx
# 动态分析工具
brew install frida
pip3 install objection
# 脱壳工具
brew install --cask android-file-transfer
特别提醒:Mac系统对Frida的支持需要额外配置:
bash复制codesign -f -s - /usr/local/bin/frida-server
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 单向认证突破实战
安卓App的单向SSL认证(服务器验证客户端)是常见的安全机制,我们需要通过中间人攻击(MITM)来突破这种保护。
2.1 证书锁定破解
现代App常用证书锁定(SSL Pinning)技术,我们需要定位并修改相关代码:
- 使用jadx反编译APK:
bash复制jadx -d output_dir target.apk
- 搜索证书相关关键词:
bash复制grep -r "X509TrustManager" output_dir/
grep -r "checkServerTrusted" output_dir/
- 常见突破方案:
- 修改smali代码绕过验证
- 使用Frida hook验证方法
- 替换APK内嵌证书
2.2 Frida动态Hook示例
以下是使用Frida绕过SSL验证的脚本示例:
javascript复制Java.perform(function() {
var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager');
var TrustManager = {
checkClientTrusted: function(chain, authType) {},
checkServerTrusted: function(chain, authType) {},
getAcceptedIssuers: function() { return []; }
};
X509TrustManager.$init.implementation = function() {
console.log("Bypassing SSL verification");
return this.$init();
};
});
执行脚本:
bash复制frida -U -f com.target.app -l ssl_bypass.js
2.3 常见问题排查
在Mac环境下常见问题:
- ADB设备无法识别:
bash复制brew install android-platform-tools
adb kill-server
adb start-server
- Frida版本不兼容:
bash复制pip3 install frida-tools==12.8.0
- 证书安装后仍不生效:
- 检查系统钥匙串中的证书信任设置
- 重启Charles和测试设备
3. 加固脱壳技术详解
主流安卓加固方案(如梆梏、360加固)都有对应的脱壳方法,下面介绍几种实用技术。
3.1 内存Dump脱壳法
- 使用Frida定位Dex加载地址:
javascript复制Interceptor.attach(Module.findExportByName("libart.so", "_ZN3art11ClassLinker11DefineClassEPNS_6ThreadEPKcmNS_6HandleINS_6mirror11ClassLoaderEEERKNS_7DexFileERKNS9_7ClassDefE"), {
onEnter: function(args) {
console.log("DexFile loaded at: " + args[5]);
}
});
- 使用dump工具导出内存:
bash复制frida -U -f com.target.app -l dump_dex.js | grep "DexFile" > dex.txt
python3 dex_dumper.py $(cat dex.txt)
3.2 动态加载脱壳
对于运行时加载的Dex,可以使用以下方法:
- Hook DexClassLoader:
javascript复制var DexClassLoader = Java.use('dalvik.system.DexClassLoader');
DexClassLoader.loadClass.overload('java.lang.String').implementation = function(name) {
console.log("Loading class: " + name);
return this.loadClass(name);
};
- 从/data/data/包名目录提取临时Dex文件
3.3 常见加固特征识别
| 加固厂商 | 特征文件 | 脱壳方法 |
|---|---|---|
| 梆梏加固 | libsecexe.so | Frida内存dump |
| 360加固 | libprotectClass.so | DexClassLoader hook |
| 腾讯乐固 | libshella-*.so | 动态调试脱壳 |
| 阿里聚安全 | libmobisec.so | 内存搜索dex |
4. 完整实战案例解析
让我们通过一个实际案例演示全流程。
4.1 目标App分析
目标:某金融类App(版本3.2.1)
- 使用360加固
- 启用SSL Pinning
- 关键逻辑在Native层
4.2 操作步骤
- 抓包初步分析:
bash复制charlesproxy &
adb shell settings put global http_proxy 192.168.1.100:8888
-
发现SSL错误,确认存在证书锁定
-
反编译APK:
bash复制apktool d target.apk -o output
- 定位网络库:
bash复制grep -r "okhttp3" output/
- 使用Frida脚本绕过验证:
javascript复制Java.perform(function() {
var CertificatePinner = Java.use('okhttp3.CertificatePinner');
CertificatePinner.check.overload('java.lang.String', 'java.util.List').implementation = function() {
console.log("Bypassing CertificatePinner");
};
});
- 脱壳处理:
bash复制frida -U -f com.target.app -l dump.js --no-pause
- 分析脱壳后的Dex:
bash复制jadx -d final_output dumped.dex
4.3 关键问题解决
- Native层加密处理:
- 使用IDA Pro分析so文件
- 定位JNI_OnLoad函数
- Frida hook关键加密函数
- 反调试检测:
javascript复制Interceptor.attach(Module.findExportByName("libc.so", "fopen"), {
onEnter: function(args) {
var path = Memory.readCString(args[0]);
if(path.includes("status")) {
console.log("Anti-debug detected: " + path);
args[0] = Memory.allocUtf8String("/dev/null");
}
}
});
- 多Dex处理:
bash复制python3 merge_dex.py dex1.dex dex2.dex -o merged.dex
5. 高级技巧与防护对策
5.1 对抗反调试技术
现代加固方案会检测调试状态,常见对抗方法:
- 修改TracerPid:
javascript复制var pthread_kill = Module.findExportByName("libc.so", "pthread_kill");
Interceptor.replace(pthread_kill, new NativeCallback(function() {
return 0;
}, 'int', []));
- 隐藏Frida特征:
bash复制frida -U -f com.target.app --enable-jit --runtime=v8 -O
5.2 Native层分析
对于关键逻辑在Native层的App:
- 使用IDA Pro静态分析
- Frida hook JNI函数:
javascript复制var JNIEnv = Java.vm.getEnv();
var GetMethodID = JNIEnv.getMethodID;
Interceptor.replace(GetMethodID, new NativeCallback(function(env, clazz, name, sig) {
console.log("Method: " + Memory.readCString(name));
return GetMethodID(env, clazz, name, sig);
}, 'pointer', ['pointer', 'pointer', 'pointer', 'pointer']));
5.3 自动化脚本
为提高效率,可以编写自动化脚本:
python复制import frida
import sys
def on_message(message, data):
print(message)
device = frida.get_usb_device()
pid = device.spawn(["com.target.app"])
session = device.attach(pid)
with open("hook.js") as f:
script = session.create_script(f.read())
script.on("message", on_message)
script.load()
device.resume(pid)
sys.stdin.read()
6. 法律与道德边界
在进行任何逆向工程前,必须明确:
- 仅对自有App或获得明确授权的App进行分析
- 不得破解付费功能或绕过正版验证
- 研究过程中获取的数据必须严格保密
- 公开研究成果时需脱敏处理关键信息
建议在虚拟机环境中进行研究,避免意外修改系统配置。所有技术应仅用于安全研究和授权测试目的。
