本篇博客旨在记录学习过程,不可用于商用等其它途径
入口
这次研究的是头条数据接口,每次向下滑动即可刷新请求
抓包
根据抓包结果得知动态参数是st
和sn
,大胆猜测sn
的生成跟st
有关,其它参数是固定的,后面看生成具体逻辑。
查壳
使用查壳工具发现app有腾讯
加固,使用jadx
反编译拿不到有用的代码文件
反射大师脱壳(只支持andriod 8以下)
apk下载:反射大师
下载好apk后通过adb install
安装到andriod
手机,注意事项:反射大师
是Xposed
插件,需要提前安装好Xposed
安装好后,双击进去开启模块,同时选择要控制的app,接下来最好是断掉网络再脱壳
打开选中的app,进去首页就能看到六星图案
,这就说明反射大师
控制成功了
点击这个六星图案
然后选择当前ACTIVITY
搜索关键词sn
,然后点击写出DEX
按钮
好尴尬,到这里才发现反射大师只支持andriod 8一下的版本,服了!!!
frida-dexdump脱壳
运行frida
和运行要脱壳的app
,然后执行frida-dexdump -FU
,需要先安装好frida-dexdump
包
现在需要合并脱壳到的dex文件
- 将apk文件改名为rar文件
- 将脱壳得到的所有dex文件全部放进rar文件中,最好保留rar文件中原有的dex文件
- 重新将rar文件改名为apk文件
参数源码定位
使用jadx
打开处理后的apk,现在已经能看到非常多的 class 文件了, 证明已经完成脱壳
先搜索"sn"
,搜出来的结果虽然不多,但是全看了一遍都没有符合期望的
搜索sn=
,观察搜索结果,根据引用代码大概确定红框是具体位置所在
参数生成分析
这个位置包含了全部请求参数,我们主要看st
和sn
,
st
的值是通过String.valueOf(valueOf) + ((int) ((Math.random() * 8999.0d) + 1000.0d));
得到,这个其实就是对时间戳和随机值的处理
接下来跟踪sn
,双击a(str, z)
,进入下面的代码,可以看到str2
是对多个值进行拼接
然后进入ces.b(str2)
,可以到使用的是原生的md5
以上是关键参数的生成逻辑,通过跟踪代码,我们确定除了NativeSecureparam.readMD5Key
、&st=
、&sn=
的值不确定外,其它参数都是固定值并可以通过frida hook
提取,而&st=
很明显是时间戳,&sn=
需要依赖&st=
和NativeSecureparam.readMD5Key
经过md5
生成,所以接下来我们要确定NativeSecureparam.readMD5Key
的生成逻辑。
一般来说,我们大可以直接frida hook
打印NativeSecureparam.readMD5Key
的值,因为理论上它会是固定值,不过这里我们还是使用IDA
打开ifeng_secure.so
文件看一下代码吧。
注意:如果IDA打开so文件报Oops! internal error 40343 occured. ,是因为你的安装路径或者文件路径有中文,改成英文就可以了
so 文件分析
这是打开后的界面
选择search Text
模式及,输入readMD5Key
搜索
命中后会把代码高亮,双击进去
按下快捷键F5
查看 C 语言伪代码
再次通过鼠标右键, 单击Hide casts
, 把代码转成方便阅读的格式,这段代码大体只是把一些参数和字符串拼到了一起, 返回一个新的字符串,由于涉及到系统寄存器和特定内存地址,没法直接得出结果,需要进一步动态调试才行。
Frida Hook
前面我们已经知道sn
的只是在ces.b(str2)
生成的,这里就hook看看啥情况。不过这里看代码我们只知道代码所在类是ces
,但是包名不明确,这里需要遍历app所有调用类来确定固定的包名
过了一遍,这里就确定完整的类是ces
了,搞它!
hook代码
运行结果
这里直接sn encrypt arg
跟请求参数对比,就能确定它的值怎么来的了
直接说结论:其实变化的就st
的值,其它在同一台手机是一致的
加密文本:
- 7.38.0:
gv
- ifengnews:
proid
- 2899:
publishid
- v001lN2NzEWMiFjNilDNhhjZ40gNgfr3r340gf:
deviceid
- 1722448681:
st
- 2546:
四位随机值
, - acF%#*{_b1mQt@…ifvy:
NativeSecureparam.readMD5Key
加密结果: 原生md5加密结果
算法生成
补充
对于ltoken
的值,下面是它的大致流程
后续代码看不懂就直接hook看具体值~