App 核心通信加密协议:从 0 到 1 逆向剖析与实战复盘
文档受众:面向安全工程师、爬虫开发者与移动安全初学者。
文档目的:通过还原对某通信应用(openchat-loginv2接口)真实网络通讯防线的彻底突破过程,提供从“0认知抓包”到“源码静态追踪”,再到“原生 SO 底层汇编博弈”,最终剥开混淆外衣直面加密真相的全流程指导。
1. 勘察:黑盒下的网络抓包与现象分析
一切逆向工作始于抓包表现。在进行 user/unauthorized/issued 接口访问时,我们捕获了如下网络特征:
Request Headers 特征:
POST https://openchat-loginv2.sjhbf.xyz/user/unauthorized/issued HTTP/1.1
X-one: 985118e8fa98a4b...fd17f436f2cbbe (48字节密文转化为96个Hex字符)
X-ten: 515bbbccdd69dd...c08ec66ce06fc5 (更长的Hex字符)
可以看到,业务方通过 X-one 和 X-ten 头加入了极长的签名/防重放混淆串。
Request Body 特征:
C1 A0 00 00 00 30 0B 26 2A 4E 16 64 C1 78 ...
Response Body 特征:
C0 80 00 00 00 80 9D 43 33 34 5D 10 B1 A7 ...
初看 Payload 数据,除了一段未知魔数规律(C1 A0,C0 80),其余均被不可直接阅读的密文块(疑似 AES/RSA 等定长或不定长算法)替代。我们的目标极度清晰:
- 还原 Body 二进制数据包封包、解包逻辑,实现明文通信。
- 逆向推导
X-one和X-ten协议头的算法引擎并还原运算。
2. 剥丝抽茧:JADX 中的 Java 层面顺藤摸瓜
面对 App,逆向的常规入手点是搜索 API 路径。我们将目标 APK 投入 JADX,以 user/unauthorized/issued 为字眼全局搜索:
2.1 定位 Retrofit 网络层体系
在 JADX 的反编译代码中,迅速锁定了网络层架构基于 Retrofit 扩展:
- 看到
LoginHttpJson等接口使用注解定义了发包地址:@POST("user/unauthorized/issued")。其返回的被封装为了一个泛型对象Aes2<...>,这表明明文响应都被“壳”封装并存在一套解密机制。
2.2 解包与封包规则的破译
为了找寻 Body 的加密发生地点,我们沿着 Retrofit 的自定义装配器 HttpAdapterCreater 和 OkHttp 的 Interceptor,抓出了两条最核心的管线:
管线一:请求装箱 (RequestEncryptInterceptor.java)。
它的源码明确表述了如何构造出我们抓包看到的 C1 A0 开头的字节:
// 第一二字节特征:对第0位置特定的Bit赋值控制!
bArr


428

被折叠的 条评论
为什么被折叠?



