今日网站
现在 web js 逆向分析真的好卷啊
关于某数 4 代的 cookie 分析文章网上已经好多了,很多大佬已经开始转战 app 逆向,所以趁着最后蹭一蹭热度发一下关于 XHR 参数 MmEwMD 的分析文章
aHR0cDovL3d3dy5zaHRkc2MuY29t
抓包分析
因为是 xhr 参数,所以主要关注的界面还是xhr
过滤器,打开网站可以过滤出下面这样的请求
我们就拿这个请求为例,分析这个例子,先要把 debugger 先过了
像这样的 debugger 反调试大家应该都会吧,这里通过never pause here
就能绕过了
跳过之后,就是下一个 debugger 了,使用同样的方法就行
至于其他绕过的方法也是可以的,能绕过不影响调试就过。
这里就是简单提一嘴大家注意一下
定位加密
多点几下网页,应该可以注意到所有的请求链接都有带上MmEwMD
这个参数
之前教给大家的搜索大法在这里当然就失效了,毕竟是曾经的天花板,这点小防护还是有的
那么我们应该如何定位这个参数的加密呢?
这里用 hook 大法,定位一波就完事了
把 hook 插件拖到浏览器扩展程序里面,文末有获取代码的方式
然后直接刷新页面,可以看到断点停在下面的位置
然后向上一个堆栈就能看到加密的入口了
这里的_$lT
就是MmEwMD
加密的入口函数了
那么现在知道了这个MmEwMD
入口之后,我们之后可以直接搜索进到这个位置分析吗?
答案当然是不行的,因为某数的 js 是动态生成的,每次的变量名都不一样,所以我们想要每次都能很方便定位还是要继续分析
既然这里定位的位置是动态的,那我们找一个不会变的位置作为标记点不就好了
所以继续向前找堆栈,你可以看到下面这个代码
这个代码的位置是在jquery_xx.js
里面,这个 js 库是不会变得,所以我们把断点下在这个位置
然后关掉上面的 hook 插件,重新刷新页面
断点会断在我们截图的位置,这个时候只要简单的几次F11
就能运行到加密入口的地方
这不就到了吗,解决完定位加密位置的部分,我们来分析一下他都检测了什么
分析加密
刚刚我们点位到了入口,现在进入_$Yr
看看他都做了什么
这里传入的是接口链接的一部分,可以理解为path
+params
的组合
然后第一步进行了_$Bi
类型的判断
然后进入了_$Xt
的逻辑
这里的_$hA
只是对_$Bi
去空格,然后就进入了_$eC
的逻辑
这一步返回了_$sS
,这里的_$sS
返回的是一个对象,这个对象在_$Yr
的逻辑中参与了很多逻辑
所以这里的_$sS
是比较关键的参数
现在看看_$sS
都是怎么赋值的?
进入_$eC
的逻辑,这里_$eC
在开头就先给了_$sS
赋了一个空对象,并且定义了一系列的key
,并赋了初始值
接下来就是一系列的判断和try catch
检测
ps:这里有一个调试小技巧,接下来会有很多if..return
逻辑
这样的判断一般都是 false,毕竟这里 return 了后面的逻辑不就没检查了嘛
反之,在我们补环境的时候,这里if
中判断条件也是我们需要注意的点,如果我们自己的环境走到这个位置是true
就凉凉了。
我们继续分析,看了一下大概的逻辑,在创建了_$sS
后,第一个try catch
先完成了Location
的检测,并且通过location.port
完成了_$yk
的赋值
完成这步之后,接下来很多的逻辑都用到了_$oM
这个对象
这个_$oM
是在逻辑中创建的a
标签对象
这里的_$yT[_$xe[92]]
就是document.createElement
在上面的逻辑创建了a
标签
完成了a
的创建之后,接下来就是完成对a
的属性的赋值
_$oM[_$aY] = _$Bi;
_$oM[_$aY] = _$oM[_$aY];
_$oM[_$aY]
,通过_$Bi
完成了_$oM[_$aY]
的赋值,_$Bi
是刚刚开始传入的path + params
,然后再将_$oM[_$aY]
赋值回来
这一步没有注意的朋友可能会感觉这是废话
但是这里赋值后_$oM[_$aY]
的结果并不是_$Bi
,而是location.origin + path + params
需要注意的是到这里,a
标签现在所有的属性值就初始化完了,这里在我们自己的环境补a
的环境的时候需要注意的
这一步如果很生硬的给一个{}
那么接下来就不好过了
接下来就是对_$oM
的属性取值然后再判断,判断之后再对_$sS
不同的key
进行赋值,再对_$sS
的key
进行判断【就是这么啰嗦】
所以只要你a
标签创建的好,这个还是很好过的,因为接下来都是水磨功夫,如果你一下记不住,可以像我一样做个笔记
这里很简单就完成_$sS
对象的构造,然后我们就可以回到主逻辑_$Yr
部分
如果上一步_$sS
补的好的话接下来的逻辑你就很轻松了
接下来需要注意的是_$R6
、_$W7
、_$v5
这三个逻辑
这里的_$R6
是对你传入的path + parmas
进行计算,会生成一个长度 16 的数组
然后_$W7
继续进入控制流计算
这一步会生成MmEwMD
的前部分的值
然后在开头拼接上?
进入_$v5
的逻辑
这里是最后生成MmEwMD
后一部分的逻辑,然后再拼接会刚刚生成的MmEwMD
上
完成这一步的逻辑之后,就生成最后的MmEwMD
了
其实MmEwMD
还是很简单的,难点就是调试麻烦
开头的 hook 的 demo 代码是百度 cv 的如果有使用上的 bug 大家见谅