纷玩岛小程序逆向记录
纷玩岛小程序逆向记录
前言
抓包以及小程序解包在上一篇文章里,不再多说了,直接开搞
创建订单接口
从抓包中可以看到核心参数是这个blackBox,那么我们直接解包去找这个参数
再往上找可以看到它是requirePlugin("tdfp-plugin")
同时我们观察到抓包记录中,在create order之前还有一个发往fp.tongdun.net的请求,它的返回值tokenId与我们要找的blackbox极其相似
我们直接猜测blackbox是基于该请求的tokenId,本地再进行一些变换得到的
但这个请求的请求参数非常复杂
那么我们逆向的重点就是这个请求的各个参数
首先我们尝试在解包的内容中直接找到这个请求相关的函数,但无果。因为我们之前提到了这个是通过requirePlugin("tdfp-plugin")
方式引入的,我们只能看到它的appid
如何找到tdfp-plugin插件
首先我去寻找了微信官方文档,了解到一个小程序要引入某个插件,需要先向插件所有者申请,申请通过后才能引入。我又去同盾官方文档了解到这个插件确实要人工审批,那我们肯定是不能去申请了,只能另寻他法
我们通过小程序F12工具来打开小程序的控制台,直接在源码中搜索相关函数
成功定位到tdfp-plugin插件源码
混淆严重的tdfp-plugin
我们已经从小程序控制台中拿到了tdfp-plugin的编译混淆后的源码,我们可以看到它基本都是乱码,基本是无法阅读的
我们对其进行一下去混淆。我们观察到乱码的部分基本都有个en函数,en函数的参数有两个,一个是乱码字符串,一个是数字,我们去寻找en函数的定义
我们将其转写成Python
然后写一个小脚本,直接用Python读取JS,正则匹配到形如en(“string”,int)的内容,再调用en函数算出结果后替换
然后我们发现还有en(变量,int)的形式,于是我们再处理一次,同时引入这些变量
我们最后得到了一个可读的JS,对比图如下:
我们发现2828行后对我们逆向分析都没啥用,是公共库函数、微信的一些基础函数、小程序部分关联函数,于是把它们都删了,不然IDE太卡。。。
漫长的打断点调试
我们现在有了去混淆的代码,虽然小程序F12中不能用replace功能,但我们可以按照行数对照着看,然后在合适的地方打断点
在这里就可以,基本涵盖大多数参数的生成方式
打好断点后,提交订单触发断点,我们可以看到b的值就是经过an(n,un)
生成的,我们在控制台打印一下n和un的值
然后执行一下an(n,un)
其它参数也可以通过这里的断点找,至于n是怎么生成的,我们还需要在别处打断点来一点点看,这是个枯燥并且巨大的工作
经过我的调试,可以看到n的内容大部分是调用了微信提供的原生函数获取的,比如NFC、蓝牙、WIFI状态等,还有一些记录执行时间的W time
我个人认为后端校验时采用了大数据理论proof值来检验请求是否正常,不太确定
抠JS
这个没啥好说的,把需要用到的函数都抠出来,缺啥复制啥,然后自己写几个函数供Python调用
也可以在js里简单log一下看看,我们可以看到我们对tokenId进行F函数加工后它就是blackbox了
代码效果
总结
- 抠JS还是方便
- 想到一个骚操作,目前的en函数我只需要eval一次,理论上不会导致执行到恶意代码,如果厂商精心设计一个需要eval多次的函数,可能真的会在处理JS时被eval函数背刺,所以我们还是要用ast.literal_eval,养成良好习惯,不要学我