Python 爬虫进阶必备 | 关于某数 4 代 XHR 参数 MmEwMD 的分析

共 2319字,需浏览 5分钟

 ·

2022-01-16 21:21

点击上方“咸鱼学Python”,选择“加为星标

第一时间关注Python技术干货!


f1d96b4bf98c9a15b2a1b1338283faa9.webp

图源:极简壁纸

今日网站

现在 web js 逆向分析真的好卷啊

关于某数 4 代的 cookie 分析文章网上已经好多了,很多大佬已经开始转战 app 逆向,所以趁着最后蹭一蹭热度发一下关于 XHR 参数 MmEwMD  的分析文章

aHR0cDovL3d3dy5zaHRkc2MuY29t

抓包分析

因为是 xhr 参数,所以主要关注的界面还是xhr过滤器,打开网站可以过滤出下面这样的请求

33bf142832a89ccbf7b642cf581d116e.webp

我们就拿这个请求为例,分析这个例子,先要把 debugger 先过了

7eb4b86ecb138c22cff9b1498a366d91.webp

像这样的 debugger 反调试大家应该都会吧,这里通过never pause here就能绕过了

跳过之后,就是下一个 debugger 了,使用同样的方法就行

7ee5de2df900c827ebb66cffb2f7eb10.webp

至于其他绕过的方法也是可以的,能绕过不影响调试就过。

这里就是简单提一嘴大家注意一下

定位加密

多点几下网页,应该可以注意到所有的请求链接都有带上MmEwMD 这个参数

之前教给大家的搜索大法在这里当然就失效了,毕竟是曾经的天花板,这点小防护还是有的

777cc0f5cd9b13b9f5e538eae859f1ee.webp

那么我们应该如何定位这个参数的加密呢?

这里用 hook 大法,定位一波就完事了

把 hook 插件拖到浏览器扩展程序里面,文末有获取代码的方式

88ef21e6e30c86943a45a78d1de97884.webp

然后直接刷新页面,可以看到断点停在下面的位置

49f9dd950815ed1e478505323110ecab.webp

然后向上一个堆栈就能看到加密的入口了

4addc5c3d75d265b6519d6a90d6d5cdd.webp

这里的_$lT就是MmEwMD加密的入口函数了

那么现在知道了这个MmEwMD入口之后,我们之后可以直接搜索进到这个位置分析吗?

答案当然是不行的,因为某数的 js 是动态生成的,每次的变量名都不一样,所以我们想要每次都能很方便定位还是要继续分析

既然这里定位的位置是动态的,那我们找一个不会变的位置作为标记点不就好了

所以继续向前找堆栈,你可以看到下面这个代码

d27409b5dd42df7550eadda9b6d0e74b.webp

这个代码的位置是在jquery_xx.js里面,这个 js 库是不会变得,所以我们把断点下在这个位置

然后关掉上面的 hook 插件,重新刷新页面

d89309948ce045678cd27aed56e43771.webp

断点会断在我们截图的位置,这个时候只要简单的几次F11就能运行到加密入口的地方

4a904e3ae74347ee5895629efc33509e.webp

这不就到了吗,解决完定位加密位置的部分,我们来分析一下他都检测了什么

分析加密

a3bb588455b11ae4d97af8366828d505.webp

刚刚我们点位到了入口,现在进入_$Yr看看他都做了什么

d836ca259269a30400d8a3d9646d900d.webp

这里传入的是接口链接的一部分,可以理解为path+params的组合

然后第一步进行了_$Bi类型的判断

c030999f5dc7f3a49bf6cf2cbe414867.webp

然后进入了_$Xt的逻辑

aeebdb1368e55ef31df7e2d1bbdb8628.webp

这里的_$hA只是对_$Bi去空格,然后就进入了_$eC的逻辑

这一步返回了_$sS,这里的_$sS返回的是一个对象,这个对象在_$Yr的逻辑中参与了很多逻辑

a38a70f2c91909a56ad952f33430787f.webp

所以这里的_$sS是比较关键的参数

现在看看_$sS都是怎么赋值的?

进入_$eC的逻辑,这里_$eC在开头就先给了_$sS赋了一个空对象,并且定义了一系列的key,并赋了初始值

87d01307e2f47cb22efa3ee3ce8da9cd.webp

接下来就是一系列的判断和try catch检测

ps:这里有一个调试小技巧,接下来会有很多if..return逻辑

7a3113ae3b04e12f7e6863726fb968ab.webp

这样的判断一般都是 false,毕竟这里 return 了后面的逻辑不就没检查了嘛

反之,在我们补环境的时候,这里if中判断条件也是我们需要注意的点,如果我们自己的环境走到这个位置是true就凉凉了。

我们继续分析,看了一下大概的逻辑,在创建了_$sS后,第一个try catch先完成了Location的检测,并且通过location.port完成了_$yk的赋值

146d2da034925dced13cf65f52db07a1.webp

完成这步之后,接下来很多的逻辑都用到了_$oM这个对象

这个_$oM是在逻辑中创建的a标签对象

f89eb7963f401dbae96b4cbc1afa4635.webp

这里的_$yT[_$xe[92]]就是document.createElement

888654a3c7b0bc364ad2f42d624949f4.webp

在上面的逻辑创建了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进行赋值,再对_$sSkey进行判断【就是这么啰嗦】

e44faab7dfd81e5d804002b0a1b771ad.webp

所以只要你a标签创建的好,这个还是很好过的,因为接下来都是水磨功夫,如果你一下记不住,可以像我一样做个笔记

7ff49376f21bf58d673b7689610b46f6.webp

这里很简单就完成_$sS对象的构造,然后我们就可以回到主逻辑_$Yr部分

35b79a7a98d80817b3cac396cd9f6696.webp

如果上一步_$sS补的好的话接下来的逻辑你就很轻松了

接下来需要注意的是_$R6_$W7_$v5这三个逻辑

这里的_$R6是对你传入的path + parmas进行计算,会生成一个长度 16 的数组

然后_$W7继续进入控制流计算

62214d2dbde6159f21835e96d1e7d04a.webp

这一步会生成MmEwMD的前部分的值

0f643138bf83c2848cb8e7440aee06b7.webp

然后在开头拼接上?进入_$v5的逻辑

6cea75ad30655718fb3d1b57125204f0.webp

这里是最后生成MmEwMD后一部分的逻辑,然后再拼接会刚刚生成的MmEwMD

0a7799b9dfcdc0bf0290d7bab7dd7ee8.webp

完成这一步的逻辑之后,就生成最后的MmEwMD

其实MmEwMD还是很简单的,难点就是调试麻烦

开头的  hook 的 demo 代码是百度 cv 的如果有使用上的 bug 大家见谅,插件大家可以在公众号后台回复【hook】获取

完事~

好了,以上就是今天的全部内容了。

我是没有更新就在摸鱼的咸鱼

收到请回复~

我们下次再见。

715f0b7539e3e7f25b39eebced6b3598.webp对了,看完记得一键四连,这个对我真的很重要。

浏览 70
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报