难点
代码混淆 相比 第五题 简单一点
Tip:例子:https://pan.bigdataboy.cn/s/3KXFv
猿人学该题官网:https://match.yuanrenxue.com/match/6
分析参数
有一个
m
是加密值
,q 有点组合
调用栈,进入看看怎么生成的,很简单的逻辑
// 简单分析一下 t = Date.parse(new Date()); var list = { "page": window.page, "m": r(t, window.o), "q": window.i += window.o + '-' + t + "|", }; window.o += 1; 't':每次请求重新生成 'window.i += window.o' --> 'window.i = window.i + window.o' 'window.o' 每次请求一次加一次
进入
r()
函数,来到一个单独的 Js 文件
,一眼就能分析出,最重要的加密函数是z()
函数,window.o
不能大于
6
分析代码
把这个单独的 Js 复制下来在本地看看结构
最上面这种混淆,直接去掉 最后的
('_')
然后控制台就可以打印出源代码了
直接运行,
提示缺少 window
,我们直接补上
,这里有个坑需要注意,在浏览器里
,window
是不能
被重新赋值
了
搜索
Message too long for RSA
,是此处提示错误,打上断点
运行此处,发现堆栈很短,看来并不是加密过程中有什么值有问题,这时可能思路就断了
这时可以折叠代码,看一下整个代码的执行流程,很容易发现此处异常,正常是
false
,本地总会缺少一点东西
,能补的可以补上,那就直接改成false
再次执行,得出结果,对比浏览器的加密结果一样
然后出现
{'0.0': '风控不通过,别匆忙,放慢速度'}
,只有第一页有数据
出现这情况是它代码里有个全局变量,每次加密都会增加,
该值与页面之间有关系
,不对应
就出现风控
,如果用execjs
执行就不行,execjs
每次执行都是重新执行Js
,不会累加
// 测试 js 代码 window = global window.o = 1 function xx() { return window.o++; } module.exports = { // node_vm2 需要导出 xx }
使用 execjs
使用 node_vm2,会延续上下文
使用
node_vm2
执行,正常获得值
验证
版权声明:《 【猿人学】第六题 Js混淆 回溯 逆向分析 》为明妃原创文章,转载请注明出处!
最后编辑:2022-4-25 10:04:50