该文章主要提供交流学习使用。严禁用于商业用途,否则由此产生一切后果与作者无关,如有侵权请联系作者进行删除。
初探
1.直接全局搜索x-zse-96 直接找到断点处 t2 + "_" + tO 就是我们想要的值。
往上寻找 t2,tO变量的赋值,发现t2是固定值“2.0“, tO是tT.signature来的,tT又是从ed方法获取的
2.ed方法传入4个参数te=请求地址, tf.body=空,{"zse93":'101_3_3.0',"dc0":cookie["d_c0","xZst81":null]},tA=空
3.ed方法进来看到做了一些赋值操作,最后把有值的变量用"+"拼接成字符串tp
在用ty()(tp)转成加密,这长度看着像md5验证下确定是。
4.最后在把md5加密后的值 用tJ(ti).encrypt方法进行加密,这个就是本文章突破的重点了。
分析vmp流程
1.tJ(ti).encrypt断点跟进去熟悉的vmp,老规矩直接把上下文有调用的方法直接打印出来看下大致流程。
2.分析日志流程就比较清晰了
a.首先看到把md5加密的值经过遍历charCodeAt操作得到第一个32位数组md5_arr
b.用random生成随机数在经过运算取整得到一个值33,给插入了md5_arr数组的首位,得到34位数组,在该数组后面连续插入14的数组直到长度为48停止,得到第二个数组arr2
c.把数组arr2用slice(0,16)得到16位数组arr3
d.经过一个方法r 把未知的数组arr4作为参数得到另一个数组arr5
e. 在把数组arr2用slice(16,48)得到32位数组arr6
f. 在经过一个方法x 把arr6 和 arr5 作为参数得到 arr7
g.然后把arr5和arr7用concat合并获得48位的arr8
h.最后把arr8 遍历运算经过"6fpLRqJO8M/c3jnYxFkUVC4ZIG12SiH=5v0mXDazWBTsuw7QetbKdoPyAl+hN9rgE" 做charAt操作得到最终值。
寻值
打上日志断点分析。
b流程的随机值取值过程,运行的154条件的逻辑,取该数组下标的3和0做 * 运算
以此类推大家可以找出相对应的值,我就不敲了·······
最终测试下请求正常
代码自取:微信公众号Bug攻防