app逆向实战:某修图9.3.5版本sig参数抓包与破解

本篇博客旨在记录学习过程,不可用于商用等其它途径

入口

搜索栏关键词搜索最新数据
在这里插入图片描述

抓包

根据抓包结果和对比翻页包体得知动态参数是client_timestampkeywordclient_sessionsigsigTimecursor
初步观察得出以下结论:
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结构,存储的是请求参数除sigsigVersionsigTime之外的所有参数值,这里最好直接使用它的值然后替换动态值,防止被检测
a3: sig加密所需的密钥,也是固定的
a4: 必须要是一个content对象
res: 加密结果就包含了sigsigVersionsigTime这三个值

搞定到这一步我们就可能获取数据
在这里插入图片描述

另外翻页的参数cursor是放在a2开头的
在这里插入图片描述

大家可能对这些结论摸不着头脑,其实直接看SigEntity.generatorSig的调用者就能明白了
在这里插入图片描述

运行结果

client_session算法生成

在这里插入图片描述

sig生成

由于我们没有取分析native层的源码,所以这里使用的是Frida RPC的方式动态获取
在这里插入图片描述

结果

在这里插入图片描述

补充

可以通过打印调用栈来找到调用者,有时可以帮助分析
在这里插入图片描述

posted @ 2024-07-24 17:13  七夜魔手  阅读(4)  评论(0编辑  收藏  举报  来源