app逆向实战:某修图9.3.5版本sig参数抓包与破解
本篇博客旨在记录学习过程,不可用于商用等其它途径
入口
搜索栏关键词搜索最新数据

抓包
根据抓包结果和对比翻页包体得知动态参数是client_timestamp,keyword,client_session,sig,sigTime,cursor
初步观察得出以下结论:
client_timestamp:实时时间戳
keyword: 搜索关键词
client_session:暂时未知
sig:暂时未知
sigTime:大概率跟sig生成有关
cursor:第一个不需要这个参数,后面每次翻页都要携带(这里直接给结论:它是从响应结果直接拿到的,笔者在代码层找了好久愣是后面才发现)

查壳
使用查壳工具发现app有阿里聚安全加固

参数源码定位
反编译成功后,先尝试搜索"sig",很明显都不是

搜索sig ,根据搜索结果发现可能性大的目标,双击进去看代码

双击SigEntity.generatorSig,看到nativeGeneratorSig就可以确定sig的生成位置了


继续跟进去发现这个方法在native层,这里就暂时不再跟进去了

上面我们找到了sig 的生成位置,现在找一下client_session的生成位置,直接搜client_session

直接进去第二个,结合前面抓包接口对应的请求参数可以确定这是它的生成位置

源码分析
client_session
前面我们找到了sig 和client_session的生成位置,接下来分析一下它们的源码
先分析client_session
看代码得出client_session是对client_timestamp进行处理得到的,双击进去a方法看到具体代码

双击进去com.meitu.library.util.b.a

发现它是对文本进行md5操作,且是原生操作

那我们就需要找到加密文本了,回去看a方法可以知道是对f47591g值进行截取与换位处理得到的。直接在当前页面搜索找到f47591g = q();
代码的大致是,拿到getPackageName值然后进行base64,所以它是固定的,我们直接hook拿到值



注意这里拿到的只是f47591g的值,client_session是对其截取前十个字符,然后根据时间戳%10的值进行字符换位,最后对其进行md5得到的,具体细节看代码。
sig
前面我们分析到nativeGeneratorSig是在native层生成的sig,这里我们暂不涉及native层。这里我们hook一下nativeGeneratorSig的调用者SigEntity.generatorSig,看看它接收的是哪些参数
这里直接出结论:
a1: 接口资源路径,固定的
a2: 注意它是array结构,存储的是请求参数除sig,sigVersion,sigTime之外的所有参数值,这里最好直接使用它的值然后替换动态值,防止被检测
a3: sig加密所需的密钥,也是固定的
a4: 必须要是一个content对象
res: 加密结果就包含了sig,sigVersion,sigTime这三个值
搞定到这一步我们就可能获取数据

另外翻页的参数cursor是放在a2开头的

大家可能对这些结论摸不着头脑,其实直接看SigEntity.generatorSig的调用者就能明白了

运行结果
client_session算法生成

sig生成
由于我们没有取分析native层的源码,所以这里使用的是Frida RPC的方式动态获取

结果

补充
可以通过打印调用栈来找到调用者,有时可以帮助分析

本文来自博客园,作者:七夜魔手,转载请注明原文链接:https://www.cnblogs.com/ranbox/p/18461034

浙公网安备 33010602011771号