声明
本文章中所有内容,仅提供逆向工程师一个思路,不提供源码。如看文章仍不能自行解决的,可以私信答疑。
本文章仅供学习交流使用,不得用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
结果展示
逆向难点
- vx 开发者窗口调试
- vx 环境检测,使用开发者窗口,调试搜索接口,页面卡住刷不出来,后端接口返回 403
- 补环境
- JS 代码混淆
- 嵌套的 switch-case 语句
- 多处自执行的坑
- 几个隐藏的关键参数(全网唯一提到某个导致403的值)
mtgsig1.2 各个key分析
a1
固定值,版本号a2
时间戳,参与 a4/a5 计算a3
环境信息加密值,某个环境下是固定的a4
【不固定】,与 a2/a5 有关a5
【最重要】与 a2/a6/运行环境编码/jsvpm运行次数/小程序启动时间戳有关a6
【不固定】环境加密值,vx 后台生成,可以通过补环境得到,但是稍有不慎就出错。也可以 rpc 获取a7
固定值,wxidx0
固定值 3d1
【不固定】 上述参数算出来后简单运算得到
另一个对象 Qa
调试过程中,有另一个非常重要的对象,Qa
b1
固定值,抓包即可获取b2
接口路径,抓包可以获取b6
固定值,当前用户(不一定是登录用户)的 openid/cookieid…b7
非常重要,时间戳,这不是上述 a2 那个时间戳。获取该值需要一定的技巧b8
非常重要 ,js 执行计数器
之所以强调 Qa 以及各个值的重要性,是因为,逆向的过程中,需要用到该值,去推断出导致 403 的隐藏的环境编码。
神秘且令人讨厌的 403
使用 devtools 过程中,去搜索栏搜索某个关键字后,页面一直打转,无法加载,后端接口返回 403 。
关掉 devtools 后,搜索正常返回。
没错,devtools 触发了环境检测。
在逆向调试过程中,发现,有一个 f 值,其参与了 m值的计算,而该 m值又参与了最后 mtgsig.a5(代码中 x值)的计算。
查看 f 生成的代码
其中 n(131) 是 env, 因此推测 f值就是环境编码。 devtools 抓包的时候,可以抓到多个值,如 48, 50等。而这些值,都是打开调试工具的错误值。如何找到 f 值,暂且不表,我们继续往下看。
解密环境编码 f
关键中间值: m值的算法
var p = ne(d = 4294967295 & i)
, g = new Uint8Array(ee(y)[n(160)](p))
, v = me[n(157)](g)
, m = ce(v[n(531)](0, 15));
m[7] = 255 & (f ^ bc(p)),
m[n(87)][n(480)](m, p),
m[n(87)][n(480)](m, ne(4294967295 & bc(m)))
上述生成 g值的参数 y,就是最终的 mtgsig.a6。
从上述代码可以发现,关键中间值 m 仅仅和 时间戳 i、y(mtgsig.a6) 以及 环境编码 f 有关。而前两个参数,都是直接体现在最终 的mtgsig 中的。因此可以通过最总的 mtgsig 反推 f 值。
20240909更新:
源码又看了几遍,发现很多参数可以随机生成,环境也不需要了【笑哭】
有空再继续写吧。再往后的内容过于干货,白嫖党可能要白嫖失败了…