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