极验三JS逆向
2022年10月21日大约 2 分钟
特此声明:所有爬虫文章均用于记录学习与交流, 请勿用于其非法用途或侵害他人利益, 若非法使用作者概不负责。
目标网址:https://www.geetest.com/demo/slide-float.html

滑动滑块触发验证接口,通过观察Initiator可以发现调用js如下,slide.7.8.8.js:

1.查看源码可见为常见的一种OB混淆,如下图,可能看到这些你会很迷茫,会很慌,不要慌,ast还原即可。

2.还原准备。 https://github.com/DingZaiHub/ob-decrypt 去github 下载 ,然后用webstrom 打开,具体操作看git介绍。
打开源码如下,由此可见上面代码为解析函数,将其抽离至还原代码:

新建文件decode 解析函数js,刚刚的zmsj0.XXX被改下了名字,因为moule.exports里面放点符号会报错:

再创建一个js文件用于解析。./jiyan3_de 就是上面那张图的文件。

解释一下if 定位的来源
function enter (node) {
if (node.type == 'CallExpression' && node.callee.type == 'Identifier'
&& node.callee.name.indexOf("$_") != -1&& node.arguments.length == 1
&& node.arguments[0].type == 'Literal') {
var val = de.a1s(node.arguments[0].value);
return {
type: esprima.Syntax.Literal,
value: val,
raw: val
}
}
}
这里定位条件我们需要用到ast在线查看网页:https://astexplorer.net/ 将源码复制到里面定位标记的某一个函数。

可以看见$_CIEr=ZX 解析函数 点击$_CIEr 右边显示了内容,并且鼠标悬停在右边红框那里,左边显示整个内容标记,即右边callExpression这里就是我们要找的位置。 正如 node.type == 'CallExpression' 后面的都是子节点,特征写的越多,定位越准。

如下图,我们需要拿到参数13去传入解析函数解析,经过if筛选后得到的node,然后放入解析函数。
de.a1s(node.arguments[0].value)

const fs = require('fs')
const esprima = require('esprima')
const estraverse = require('estraverse')
const escodegen = require('escodegen')
const iconv = require('iconv-lite')
const de = require('./jiyan3_de')
const traverse = require('@babel/traverse').default
const parser = require('@babel/parser')
var content = fs.readFileSync('./slide.7.8.8.js',{encoding:'binary'})
var buf = new Buffer.from(content,'binary')
var code = iconv.decode(buf, 'utf-8')
var ast = esprima.parse(code)
function isInteger(obj) {
return typeof obj === 'number' && obj%1 === 0
}
ast = estraverse.replace(ast,{
enter (node) {
if (node.type == 'CallExpression' && node.callee.type == 'Identifier'
&& node.callee.name.indexOf("$_") != -1&& node.arguments.length == 1
&& node.arguments[0].type == 'Literal') {
var val = de.a1s(node.arguments[0].value);
return {
type: esprima.Syntax.Literal,
value: val,
raw: val
}
}
}
})
code = escodegen.generate(ast)
fs.writeFileSync('slide.7.8.8.decode.js', code);
项目内运行即可解码如下。

回到页面在这些地方打上断点,即可下一步找到参数。

原创声明
平台文章均为原创文章,未经许可,禁止转载。
如需转载,请联系作者获取授权,并注明来源及原文链接。