声明:文章内容仅供学习参考,严禁用于商业用途,否则由此产生一切后果与作者无关,如有侵权请联系作者进行删除。
本文只是我简要的分析过程,以及一些重要点的记录,不涉及核心算法
mtgsig主要是下面这六个参数,
{'a1': '1.1', 'a2': 1714121272085, 'a3': 'yz5w1z6y54z45xwy19yz17...78881u902u226497958w8xy38y0', 'a5': 'T131hlxacAZkhA8HJhft/c==', 'a6': 'hs1.4aOG4x69iuIGtADfqn9IKcdZQpQvG5QnQvtvC1OxLLkmzFln+QxI2goiYAVYb9mGERFVrNxKFRn6NDwHjC7KOow==', 'x0': 4, 'd1': '95d31185fa4eab9e462312256f9dba1a'}
a1 为 版本类型值 ;
a2为 13位数的当前时间戳;
a3为 cookie的 WEBDFPID 的定值;(这个貌似也可以生成,后续有时间再跟进)
a5(a5的生成依赖于a6,这边先分析a6的生成);
此处为 算法 vmp的入口处,这边是通过算法还原的方式来生成各个参数的值,话不多说,直接下日志断点。
下断点的时候发现 switch case2 里面还包含了一个循环,为了后续省事情,我直接将case2里面的循环也一同下了断点,便于后面分析日志。(同时还打印了逻辑中有做位运算的情况,case里面还有调用函数的情况也一同打印了。)
"case ", D, JSON.stringify(T)"case2 ", D, JSON.stringify(T)"case2_4 call", D, T[T.length - 3], T[T.length - 2], T[T.length - 1]"case_lj <<", T[T.length - 2], T[T.length - 1], T[T.length - 2] << T[T.length - 1]...
(中间省略了许多日志的相关记录节点,省略号嘛你懂的)
打印好日志后就可以开始分析日志了。
关于a6的生成是aes加密,这边只需要找到对应的key和iv值即可
跟栈可以找到入口是d9这个函数,我们容易发现有h1.5 和hs1.4 的两个生成值,这里我们直接查看hs1.4即可,至于h1.5是干啥的,我也没跟着去看了。
经过多次对比发现 d9的参数中有个变化的参数,是来自 sessionId,先放一下将AES流程走完在分析它。
继续跟栈我们就可以拿到我们想要的aes的key和iv值了。
我们先回来一下分析一下上面流程用到的sessionId值,根据日志文件可以查看到sessionId是来自于fK,笔者不会操作,只能傻乎乎地一边往前查看代码逻辑和跟栈 一直往前面找。
ez函数里面的函数eH就是sessionId生成的地方。
至此a6 终于还是分析完了,接下来就是分析a5是怎么来的了,还是硬刚,直接来看咱们辛辛苦苦打印下来的日志。
这边我直接分享正向的思路,是由生成的 a6 转变成unit8array 然后在转变成 md5 ,最后在生成为一个数组,这是作为生成 a6 的第一个参数。
既然说了是第一个参数那就会有第二个参数,第二个参数
至此,a5也搞定了,现在就只剩下一个d1没有解决了。
废话不多说,我们继续往后面看看d1是怎么生成的,同样的要找到d1生成的位置,也是通过查看自己的日志去下条件断点然后一层一层地去找到对应的逻辑代码处。d1参数我自己弄的时候也是花了蛮长的时间的,这边我也还是正向来讲,主要是记录下生成的逻辑。
关于d1这里不得不提到这个拼接的大字符串,在生成d1的路上起到了承上启下的作用。
这边d1的生成用到了 url, 时间戳, cookie里面的值,以及前面生成的两个加密参数。
下面开始来拼接这个字符串
1.1 + 时间戳 + cookie某值 + 长字符串 + 一串数字 + 短字符串
长字符串是由三部分组成:时间戳生成的数组 + a5生成的数组 + 上面生成的数组,最后经过运算得到这个长字符串。
至于这个数字就是前面生成的一个数字 >>> 0 进行位运算得到的。
再来分析短字符串(上面有分析的,这边不在重复)
至此拼接的大字符串组合完毕,乘上了下面再看看他是怎么启下的。
然后经过一些位运算得到新的四位数组,转成32位字符串
接下来就是两两结合生成新的数组的操作了。
接下来又是一波 位运算得到又一个新的数组,这里太玄学了,我感觉我纯粹是运气好,瞎猫碰上死耗子了吧,只能说运气超级好。
最后这个数组就进行了数组循环对其进行16进制的取值,最终就得到了想要的d1。
好啦,测试通过!
好啦,结束结束!