1. 从“黑盒”到“白盒”:理解小红书的加密参数
大家好,我是老张,一个在移动安全和逆向分析领域摸爬滚打了十来年的老码农。今天想和大家聊聊一个非常具体、也非常有实战价值的案例:如何一步步拆解小红书App的加密协议。你可能已经注意到,现在很多App的接口请求里,都带着一堆像 x-mini-gid、x-mini-sig、x-mini-mua 这样的“神秘”参数。它们就像是App和服务器之间约定的“暗号”,没有这些暗号,你的请求就会被无情地拒绝。对于我们这些做安全研究、或者想理解其数据交互逻辑的开发者来说,这些参数就是我们必须攻克的“堡垒”。
这个过程,本质上就是把一个“黑盒”变成“白盒”。我们不知道App内部怎么生成这些参数,但我们可以通过一系列技术手段,去观察、去拦截、去分析,直到完全搞清楚它的生成逻辑。这不仅仅是为了“破解”,更重要的是理解一套成熟App在安全通信上的设计思路,这对于我们自身设计安全的API接口,或者进行深度的自动化测试,都有极大的参考价值。今天,我们就以小红书(版本号以8505为例)作为目标,从静态分析线索开始,一路追踪到动态Hook,最后实现一个可以独立运行的RPC调用函数,完整走一遍这个分析链路。我会尽量用大白话把每个步骤讲清楚,即使你是逆向新手,跟着做下来也能有收获。
2. 静态分析:寻找加密参数的源头
当我们打开抓包工具(比如Charles或Fiddler),观察小红书的网络请求时,一眼就能在请求头里看到几个关键的“x-mini-*”参数。它们是整个加密通信的“门票”。我们的第一步,就是找到这些门票是在哪里被“打印”出来的。这个过程不需要运行App,属于静态分析的范畴。
2.1 定位关键参数与初步反编译
首先,我们需要获取小红书App的安装包(APK文件)。拿到APK后,使用像 jadx-gui 或 JEB 这样的反编译工具打开它。这些工具能把编译好的字节码,尽可能地还原成我们能看懂的Java代码。打开之后,面对成千上万个类,我们怎么找呢?这里有个小技巧:搜索特征字符串。既然我们知道参数名是 x-mini-gid,那么直接在反编译工具的全局搜索框里搜索这个字符串。大概率你会搜到一些结果,这些结果所在的类,很可能就是负责添加或生成这些请求头的关键类。
在我分析8505版本时,通过搜索发现,这些参数往往出现在网络请求拦截器(Interceptor)或者负责封装请求头的工具类里。比如,你可能会找到一个名为 HttpHeadersBuilder 或者 SignatureHelper 之类的类。这些类里会有类似 addHeader(“x-mini-gid”, gidValue) 的代码。找到这里,我们就找到了第一个“路标”。但光知道这里被添加还不够,我们得知道 gidValue 这个值是怎么算出来的。这时候,你需要顺着代码,往回追溯这个变量的来源。它可能是一个简单的设备标识符,也可能是一个通过某种算法生成的复杂字符串。
2.2. 追踪调用链与发现RPC入口
在追溯 gidValue、sigValue 这些值来源的过程中,你会发现一个有趣的现象:它们的计算逻辑,最终往往并不在Java层完成。Java层的代码可能只是做了一个简单的封装,然后调用了一个 native 方法。在反编译的代码里,native 方法会以 public static native byte[] doSignature(...) 这样的形式声明,但没有具体的实现体。因为它的实现在 SO库(即 .so 文件,Android上的动态链接库,用C/C++编写)里。
这就是逆向中常遇到的“Java到Native”的边界。加密、签名等核心安全逻辑,为了效率和反破解,通常都放在Native层。这时,我们的分析重点就要从Java代码转向SO库。但直接反编译和分析SO库(使用IDA Pro、Ghidra等工具)复杂度陡增。一个更巧妙的思路是:找到上层调用这个native方法的Java函数。这个Java函数,就是连接应用逻辑和底层加密实现的“桥梁”。在很多架构良好的App中,这个桥梁会被设计成一个RPC(远程过程


3846

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



