纷玩岛小程序逆向记录

前言

抓包以及小程序解包在上一篇文章里,不再多说了,直接开搞

创建订单接口

image.png

从抓包中可以看到核心参数是这个blackBox,那么我们直接解包去找这个参数

image.png

再往上找可以看到它是requirePlugin("tdfp-plugin")

image.png

同时我们观察到抓包记录中,在create order之前还有一个发往fp.tongdun.net的请求,它的返回值tokenId与我们要找的blackbox极其相似

我们直接猜测blackbox是基于该请求的tokenId,本地再进行一些变换得到的

image.png

但这个请求的请求参数非常复杂

image.png

那么我们逆向的重点就是这个请求的各个参数

首先我们尝试在解包的内容中直接找到这个请求相关的函数,但无果。因为我们之前提到了这个是通过requirePlugin("tdfp-plugin")方式引入的,我们只能看到它的appid

image.png

如何找到tdfp-plugin插件

首先我去寻找了微信官方文档,了解到一个小程序要引入某个插件,需要先向插件所有者申请,申请通过后才能引入。我又去同盾官方文档了解到这个插件确实要人工审批,那我们肯定是不能去申请了,只能另寻他法

我们通过小程序F12工具来打开小程序的控制台,直接在源码中搜索相关函数

image.png

image.png

成功定位到tdfp-plugin插件源码

混淆严重的tdfp-plugin

我们已经从小程序控制台中拿到了tdfp-plugin的编译混淆后的源码,我们可以看到它基本都是乱码,基本是无法阅读的

689a9bedcdf4d0675ca56458818d989d.png

我们对其进行一下去混淆。我们观察到乱码的部分基本都有个en函数,en函数的参数有两个,一个是乱码字符串,一个是数字,我们去寻找en函数的定义

image.png

我们将其转写成Python

image.png

然后写一个小脚本,直接用Python读取JS,正则匹配到形如en(“string”,int)的内容,再调用en函数算出结果后替换

image.png

然后我们发现还有en(变量,int)的形式,于是我们再处理一次,同时引入这些变量

image.png

image.png

我们最后得到了一个可读的JS,对比图如下:

image.png

image.png

我们发现2828行后对我们逆向分析都没啥用,是公共库函数、微信的一些基础函数、小程序部分关联函数,于是把它们都删了,不然IDE太卡。。。

漫长的打断点调试

我们现在有了去混淆的代码,虽然小程序F12中不能用replace功能,但我们可以按照行数对照着看,然后在合适的地方打断点

在这里就可以,基本涵盖大多数参数的生成方式

image.png

打好断点后,提交订单触发断点,我们可以看到b的值就是经过an(n,un)生成的,我们在控制台打印一下n和un的值

image.png

然后执行一下an(n,un)

image.png

其它参数也可以通过这里的断点找,至于n是怎么生成的,我们还需要在别处打断点来一点点看,这是个枯燥并且巨大的工作

经过我的调试,可以看到n的内容大部分是调用了微信提供的原生函数获取的,比如NFC、蓝牙、WIFI状态等,还有一些记录执行时间的W time

我个人认为后端校验时采用了大数据理论proof值来检验请求是否正常,不太确定

抠JS

这个没啥好说的,把需要用到的函数都抠出来,缺啥复制啥,然后自己写几个函数供Python调用

image.png

也可以在js里简单log一下看看,我们可以看到我们对tokenId进行F函数加工后它就是blackbox了

image.png

代码效果

image.png

image.png

image.png

总结

  1. 抠JS还是方便
  2. 想到一个骚操作,目前的en函数我只需要eval一次,理论上不会导致执行到恶意代码,如果厂商精心设计一个需要eval多次的函数,可能真的会在处理JS时被eval函数背刺,所以我们还是要用ast.literal_eval,养成良好习惯,不要学我