声明:本篇文章内容是整理并分享在学习网上各位大佬的优秀知识后的实战与踩坑记录
前言
这篇文章主要是研究如何动态生成后缀参数MmEwMD的,它是在文章爬虫逆向学习(六):补环境过某数四代的基础上进行研究的,代码也是在它基础上增加补点的,且下文破解的接口所需的cookie也可以直接用它的代码得到。
MmEwMD
某数针对xhr
请求会在其后缀增加MmEwMD
参数,它魔改了xhr
的open
方法,而MmEwMD
就是在open
方法执行时生成的,某数并没有强制请求一定要携带MmEwMD
参数,但是如果携带了它就一定会校验,校验失败则返回400。
实战
生成位置定位
站点:aHR0cDovL3d3dy5mYW5nZGkuY29tLmNuL25ld19ob3VzZS9uZXdfaG91c2UuaHRtbA==
目标接口:aHR0cDovL3d3dy5mYW5nZGkuY29tLmNuL3NlcnZpY2UvZnJlc2hIb3VzZS9nZXRTZXZlbkRheXNSYW5raW5nLmFjdGlvbg==
其实就是这个排行版,不过所有接口都是一套逻辑,都可以用来实验。
查看包的调用栈,点击下图红框的堆栈进入执行代码
前面我们知道了某数魔改了xhr
的open
方法并在此实现MmEwMD
生成的,这时就直接锁定s.open
,在这里打断点,重新刷新页面,将断点在这里断住后跟进去
可以看到这里就是生成位置了,至于更深入的生成位置这里不研究,因为我在深入研究后发现这个位置比较适合补环境,当然大家学习时可以深入研究,MmEwMD
的生成逻辑并不难,算法实现也未尝不可。
补环境思考
这里是选择补环境的方式进行破解的,如果想算法破解,可以参考瑞数4——MmEwMD逆向分析,这篇文章很详细得分析了MmEwMD
参数的生成逻辑。
在实现参数的补环境时,其实有过思考:
既然某数是魔改了xhr,那能不能在nodejs模拟xhr发包,直接拿到魔改后的url呢?
如果这种方式可以实现,那不需要深入研究代码就能快速拿到加密结果了,但是很遗憾,我使用nodejs包xmlhttprequest进行hook发包,但是没法hook到,浏览器端使用的window.XMLHttpRequest
,没法复现。
生成代码中哪个位置是比较容易执行的?
这个位置其实就是前面生成位置定位
中指明的,我是这么思考的
这里选择的是通过_$O3
得到加密结果,如果直接调用_$xI
,那得创建xhr对象,执行会报错。大家可以去看_$O3
的代码,它只需要一个参数也就是url,且它的代码本身就是在处理url,如果使用比它更细的维度方法,可能会执行异常。
MmEwMD是在VM层生成的,且每次代码都会变化,怎么实现动态生成的?
只要我们能动态拿到_$O3
方法然后将其导出,那无论VM怎么变都不影响了。
这里说一下,VM这一层是调用.call执行得到的,它的代码会根据content和外链js变换而变化,我们在调试时可以直接拿到call后的代码,写死能方便我们调试。在补成功拿到加密结果后,就可以使用正则匹配在执行call前匹配替换加入自己的导出代码。
破解
这里我们还是在原来的代码上处理,我们直接把call后的代码复制给ret,它本身是自执行函数,然后我们创建全局变量params_enc
导出关键代码函数_$d0
注意我调试的代码方法名变了,大家根据自己实际的代码情况处理
这时我们就拿到了目标函数,直接执行它
看执行结果发现并没有加密,这时我们就知道是document.createElement('a')
出的问题了
这里使用debugger将它断住,看看是哪里调用的它
看代码知道它对取值结果做了很多判断
做以下处理,将a加入hook环境中,看看它都做了啥
缺啥补啥,值去浏览器拿
最终需要补全,都是必须要的,补好就能拿到结果了
动态获取
上面我们在代码写死条件下实现了参数加密,不过在调用时总归是要实现动态的,毕竟我们每次获取的content和自执行函数是不同的,上面我们说要用正则匹配来拿到目标函数,其实就是两个地方
- 找到
ret = _$b6.call(_$Yq, _$cZ)
并将_$cZ
拿出来 - 将
params_enc = _$d0;
放进_$cZ
思路就是这个思路,给大家看看我实现的正则匹配后结果
匹配前
匹配后
我实在python层实现的正则匹配