Reverse Engineering(逆向工程)——在无法访问源代码的情况下恢复移动应用的逻辑和结构。在Android和iOS环境中,这意味着反编译DEX/APK和Mach-O/IPA二进制文件以提取算法、加密密钥、API端点和业务逻辑。根据Veracode Security Research(2025)的数据,top-200中超过60%的移动应用至少包含一个简化逆向工程的指标。逆向工程不仅用于攻击,还用于安全审计、专利分析和渗透测试。
要点
Reverse Engineering(逆向工程)——软件分析学科,旨在从应用的二进制表示中恢复其特征、逻辑和结构。对于移动应用,分析对象是APK文件(Android)和IPA文件(iOS),包含编译后的代码、资源、清单和证书。逆向工程的结果——提取算法、协议、加密密钥、API架构和业务逻辑。
逆向工程的目标分为合法和非法的。合法:分析恶意软件以创建保护工具、审计自己的应用是否存在漏洞、确保与封闭协议的兼容性、专利分析和培训。非法:窃取知识产权、规避许可限制、创建盗版副本以及修改应用以窃取用户数据。根据Google Play Protect(2025)的数据,78%的银行应用恶意修改是基于经过逆向工程的原始APK创建的。
逆向工程的方法论包括两个主要方向:静态分析(不启动应用)和动态分析(在执行期间)。每种方法提供不同级别的信息。静态——完整的代码图像,但没有执行时间数据。动态——真实行为、数据流、网络调用,但仅在特定执行场景的框架内。专业的逆向工程总是结合两种方法。
静态分析是逆向工程的第一阶段。原始的APK或IPA被解包,每个组件被单独分析。主要目标:DEX字节码、资源、清单、原生库(.so、.dylib)和元数据。
jadx——Android应用静态分析的主要工具。它将DEX字节码以最小损失转换为可读的Java代码。jadx支持:多dex反编译、lambda和内置Kotlin类识别、导出到Gradle项目。对于混淆的代码(ProGuard),jadx以a、b、c的名称显示代码,但类结构和调用顺序得以保留。根据独立测试,jadx即使混淆也能正确反编译85–92%的代码。
apktool将APK解码为smali代码(DEX汇编程序),并以可读形式恢复资源:AndroidManifest.xml从AXML转换为可读的XML,布局转换为XML标记,strings.xml转换为纯文本。apktool允许修改资源并重新组装APK。通过apktool解包并替换资源后,可以安装修改后的应用。
Ghidra(NSA)——逆向工程框架,对于分析Android的.so库和iOS的.dylib库不可或缺。Ghidra反汇编ARM64代码,恢复C伪代码并构建调用图。对于移动逆向工程,Ghidra用于分析密码学和DRM机制的原生实现。Ghidra支持Python和Java脚本编写以实现分析自动化。
# 解包和反编译APK
$ jadx -d output_dir app.apk
# 通过apktool解包资源
$ apktool d app.apk -o app_unpacked
# 通过Ghidra分析原生库
$ ghidra app.apk/lib/arm64-v8a/libnative.so
# 在DEX中搜索字符串常量
$ strings classes.dex | grep -i api_key
动态分析在运行中的应用上执行。分析器连接到进程并实时拦截函数调用、参数和返回值。
Frida——移动应用动态分析的领先工具。Frida将JavaScript引擎注入应用的进程(Android ART或iOS应用),并允许拦截Java/Objective-C和C/C++函数的调用。借助Frida,逆向工程师可以:记录所有AES.decrypt()方法的调用及其参数、将返回值替换为任意值、通过Universal Android SSL Unpin移除SSL-pinning、通过Stalker跟踪原生调用。Frida无需修改APK/IPA即可工作,这使其在渗透测试中不可或缺。
Objection为典型的逆向工程任务提供现成的命令,无需编写JavaScript脚本:disable-pinning(禁用SSL pinning)、dump-keychain(iOS)、explore(遍历类层次结构)、memory search(在内存中搜索字符串)。Objection允许无需一行代码即可执行完整的动态分析。对于iOS应用,Objection自动查找并记录NSURLSession、CFNetwork和NSKeyedArchiver的调用。
Xposed——Android框架,通过替换Zygote中的app_process文件工作。与Frida不同,Xposed在安装后不需要root访问权限。Xposed模块可以拦截任何应用中的方法调用。对于逆向工程,Xposed适合长期分析:模块安装后持续运行,记录应用在不同场景中的行为。Xposed支持Android至8.1版本;对于Android 9+,使用基于SandHook的EdXposed。
// Frida:在应用中拦截decrypt()方法
let aesClass = Java.use("javax.crypto.Cipher");
aesClass.doFinal.overload(
"[B", "int", "int"
).implementation = function(
input, offset, len
) {
console("[AES] decrypt called, len=" + len);
return this.doFinal(input, offset, len);
};
逆向工程的标准工作流程由连续的步骤组成,每个步骤提供特定级别的信息。
分析器在元数据级别研究APK:targetSdk、uses-permission(请求哪些权限)、intent-filter和exported components。通过权限可以确定使用哪些API(android.permission.CAMERA→摄像头、android.permission.RECORD_AUDIO→音频)。通过exported activity确定无需授权的入口点。此阶段通过aapt或ApkAnalyzer执行,耗时1–2分钟。
APK被解包,classes.dex(或multidex)被输入到jadx。输出——包中的Java/Kotlin代码。分析器搜索关键类:CryptoUtils、ApiClient、AuthManager、DatabaseHelper,并检查使用哪些算法。如果代码中出现AES/CBC/PKCS5Padding字符串——应用使用加密,需要找到密钥。此阶段确定:硬编码密钥、API URL、OAuth令牌和机密。无混淆时,整个应用的代码像普通Java项目一样可读。
通过配置Frida或Objection禁用SSL-pinning,分析器启动应用并通过Burp Suite或mitmproxy拦截网络流量。根据流量数据重建API架构:哪些端点、哪些参数、什么格式。如果可能,分析器修改请求并检查服务器对不正确或恶意数据的反应。服务器验证的缺失——在此步骤发现的直接漏洞。
分析结果以结构化形式记录。对于每个找到的易受攻击位置,指明:类和方法、漏洞描述、利用向量和修复建议。该数据集被传递给开发团队或用于编写渗透测试报告。在自动化环境中(MobSF),报告基于静态和动态分析结果自动生成。
由于Apple更严格的安全架构以及在标准设备上无法直接访问文件系统,iOS应用的逆向工程比Android更困难。分析iOS需要越狱。
IPA存档包含Mach-O二进制文件——Apple的可执行文件通用格式。反编译使用Hopper Disassembler或IDA Pro。与以最小损失反编译为Java的Android DEX不同,Mach-O包含原生ARM64代码,以较低精度恢复为C伪代码。Hopper可处理60–70%的恢复,其余部分需在汇编程序级别分析。
iOS上的Frida需要越狱并安装frida-server。连接后,Frida通过消息路由API拦截Objective-C方法。对于iOS应用,典型场景:拦截NSURLSession.dataTaskWithRequest方法以记录HTTP请求,拦截NSKeyedUnarchiver以分析序列化数据,以及通过frida-trace跟踪CoreData查询。随着Dopamine越狱的发布,Frida已可用于iOS 15–17。
逆向工程可能包括修改IPA,然后重新打包并安装到设备。工具:ipatool用于解包,MachOView用于查看部分,optool用于注入代码。修改后,IPA通过ldid或fastlane sigh签名以安装到越狱设备。对于iOS 16+,代码签名在Secure Enclave级别验证,修改后的IPA将无法在未越狱设备上运行。
// Frida:在iOS应用中拦截HTTP请求
if (ObjC.available) {
let NSURLSession = ObjC.classes.NSURLSession;
let dataTaskWithRequest = ObjC.protocol("NSURLSessionDelegate")
.method("- URLSession:dataTask:didReceiveData:");
Interceptor.attach(dataTaskWithRequest.implementation, {
onEnter(args) {
let data = ObjC.Object(args[3]);
console("[HTTP Response]", data.toString());
}
});
}
防范逆向工程基于分层安全原则:没有任何方法能提供100%的保护,但组合使逆向工程在经济上变得不划算。
基础级别——ProGuard for Android,将类和方法的名称替换为单字符名称。为了增强,使用DexGuard,添加overload induction(多个具有不同签名和相同名称的方法)和AES-256字符串加密。混淆将代码分析时间从5分钟增加到5–20小时,取决于级别。DexGuard额外混淆控制流,使代码对jadx不可读。
所有字符串常量——URL、密钥、令牌、SQL查询——在构建阶段加密并在运行时解密。这防止了DEX文件字符串的静态分析。运行strings app.apk的攻击者将看不到任何API端点。即使在反编译后,所有字符串看起来也像二进制数据。每个字符串可以使用单独的密钥,从而使去混淆更加困难。
应用内的RASP代理在运行时检测Frida和调试。通过APK的SHA-256哈希进行完整性控制防止运行修改版本的应用。如果APK哈希与参考值(存储在原生层)不匹配——应用终止。这阻止了基于APK修改的攻击,包括重打包。
关键业务逻辑应在服务器上执行,而不是在客户端。即使攻击者完全反编译应用,服务器代码仍然不可访问。所有请求和参数的服务器端验证防止在逆向工程过程中发现的漏洞被利用。通过Play Integrity API或App Attest的服务器端认证确认请求来自真实未修改的应用。
常见问题
在美国,逆向工程受DMCA监管——允许用于兼容性、安全测试和存档目的。禁止规避技术保护措施(DRM)。在欧洲,EUCD第6条类似于DMCA。在俄罗斯,未经版权所有者同意的逆向工程可能被视为侵犯版权。商业逆向工程前必须进行法律咨询。
不能。在攻击者设备上执行的任何代码都可以被分析——这是客户端保护模型的基本原则限制。保护的目标是使逆向工程在经济上不划算:时间和资源成本应超过所获结果的价值。混淆、RASP和服务器逻辑的组合是目前的标准保护方案。
重打包——通过逆向工程修改应用,然后重新组装APK。攻击者通过apktool解包APK,添加恶意代码或替换API密钥,重新组装并用自己的证书签名。根据Kaspersky Threat Report(2025),重打包占Android上所有攻击的86%。对策:在运行时检查数字签名。
Universal Android SSL Unpin Frida脚本拦截TrustManager.checkServerTrusted和iOS上的ServerTrustManager调用,将实现替换为allow-all。还使用拦截OkHttp和URLConnection中的X509TrustManager方法。SSL-pinning在Frida上10秒内即可通过现成脚本绕过。更稳定的保护——通过服务器端证书验证的certificate transparency。
.so/.dylib库中的原生C/C++代码比DEX中的Java难逆向得多。带有PGO和Osize编译的Swift会产生比Objective-C更混乱的二进制文件。Rust在没有运行时元数据和标准Objective-C包装的情况下编译为原生代码,使其成为现代移动开发语言中最难逆向的语言。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。