1. 移动端逆向工程概述
最近在技术社区看到不少同行在研究航空类App的逆向分析,正好我手头有个东方航空M端的逆向项目可以分享。移动端逆向工程本质上是通过反编译、动态调试等技术手段,分析应用程序的内部逻辑和数据交互方式。对于航空类App而言,这类分析通常用于研究其网络通信协议、数据加密方式以及业务流程实现。
在开始之前必须强调:本文仅讨论技术实现原理,所有分析过程都在合法授权的测试环境中进行,且不涉及任何用户隐私数据获取。实际操作中请务必遵守相关法律法规,仅对自有或获得明确授权的应用进行分析。
2. 环境准备与工具链搭建
2.1 基础工具选择
针对Android平台的M端应用逆向,我的工具链配置如下:
- 反编译工具:Jadx-GUI(主力)+ Apktool(辅助)
- 动态调试:Frida + Objection
- 网络分析:Charles + Wireshark
- 环境模拟:Genymotion定制镜像(Android 9.0)
选择这套组合主要考虑:
- Jadx的反编译可读性最佳,能直接导出Gradle项目
- Frida的动态Hook能力对混淆代码特别有效
- Genymotion的x86架构性能更好,适合长时间调试
2.2 特殊环境配置
航空类App通常有较强的反调试检测,需要特别注意:
# 修改frida-server配置以绕过检测 adb push frida-server /data/local/tmp/ adb shell "chmod 755 /data/local/tmp/frida-server" adb shell "/data/local/tmp/frida-server &"同时建议在模拟器中安装以下辅助工具:
- Xposed框架(用于基础Hook)
- JustTrustMe模块(绕过证书固定)
- 核心破解(签名验证绕过)
3. 静态分析与代码定位
3.1 应用解包与反编译
使用jadx打开APK文件后,重点关注这些包结构:
com.ceair.activity // 主业务流程 com.ceair.network // 网络通信层 com.ceair.security // 加密相关 com.ceair.bean // 数据模型通过资源文件搜索发现关键RSA公钥:
// res/values/strings.xml <string name="public_key">MIGfMA0GCSqGSIb3...</string>3.2 关键业务流程追踪
机票查询的调用链分析:
- FlightQueryActivity 接收用户输入
- 通过FlightManager调用getFlightList
- 经由NetworkManager发起POST请求
- 在RequestBuilder中完成参数加密
核心加密逻辑定位:
// SecurityUtil.class public static String encrypt(String content) { byte[] encrypted = RSA.encrypt(content.getBytes(), PUBLIC_KEY); return Base64.encodeToString(encrypted, 2); }4. 动态分析与协议破解
4.1 网络请求拦截
配置Charles抓包后,发现主要接口特征:
- 主机地址:m.ceair.com
- 接口路径:/api/v1/flight/search
- 请求头包含:
X-App-Version: 6.3.1 X-Device-Id: xxxxxx X-Auth-Token: yyyyyy
请求体示例:
{ "data": "UEncrYptEdDaTA...", // Base64编码的加密数据 "sign": "a1b2c3d4e5..." // 签名值 }4.2 加密算法逆向
通过Frida Hook加密方法:
Interceptor.attach(Module.findExportByName("libsecurity.so", "RSA_encrypt"), { onEnter: function(args) { console.log("Input: " + Memory.readUtf8String(args[0])); console.log("Key: " + Memory.readUtf8String(args[1])); } });最终确认加密流程:
- 对原始JSON进行URL编码
- 使用RSA加密(2048位密钥)
- Base64编码输出
- 对结果计算MD5签名
5. 常见问题与解决方案
5.1 反调试绕过技巧
当遇到ptrace检测时,可以使用以下Frida脚本:
var pthread_create = Module.findExportByName(null, "pthread_create"); Interceptor.replace(pthread_create, new NativeCallback(function() { return 0; }, 'int', ['pointer', 'pointer', 'pointer', 'pointer']));5.2 数据解密异常处理
如果遇到解密失败,检查以下可能:
- 时间戳同步问题(航空系统通常要求误差在30秒内)
- 设备指纹变更(特别是IMEI和MAC地址)
- 密钥轮换机制(部分接口每小时更换密钥)
5.3 性能优化建议
对于大规模数据分析:
- 使用Frida的批量Hook功能替代单步调试
- 对native层代码优先使用IDA Pro静态分析
- 关键算法可以考虑Xposed持久化Hook
6. 安全防护建议
根据逆向结果,如果要增强客户端安全性,建议开发方:
- 实现动态密钥分发机制
- 增加代码混淆强度(使用OLLVM)
- 关键逻辑下沉到Native层
- 实施多因素设备指纹验证
在实际测试中,我们发现当同时满足以下条件时最易触发风控:
- 高频相同查询(>5次/分钟)
- 异常设备参数(如模拟器特征)
- 非标准加密流程
通过这个项目,我总结出航空类App逆向的几个特点:协议层加密复杂但业务逻辑相对规范,安全防护主要集中在反调试和设备验证方面。相比金融类App,其安全机制更注重防爬取而非防逆向本身。