点击“Python编程与实战”,选择“置顶公众号”node
第一时间获取 Python 技术干货!git

今天给你们来分析并还原某验的 JS 加密,作过爬虫的应该都知道遇到过这个验证码,若是你还没遇到之后你会碰到的相信我github
话很少说,时间宝贵,进入正题!web
抓包
进入官网,点击选择今天的主题滑动验证,其余验证类型的加密大同小异,只要你掌握了下面的方法!编程

点击按钮抓包,随意拖动一下,请求数据包以下数组

能够看到一堆请求参数,其实你要作的就是实现 w 的加密浏览器

点击进去,就能看到加密的 JS 文件,为便于分析将其保存到本地。微信
AST 还原
经过调试能够看到有大量的 unicode 格式的编码以及数组名称的混淆babel

传统解决方法是在浏览器 console 端输入就能看到它的庐山真面目,可是这种方法太麻烦了,接下来咱们用 AST 来将其还原!app
首先还原 unicode 编码,打开 AST 在线解析网站(https://blogz.gitee.io/ast/[1])
将待还原的代码放进去

能够看到只须要把 extra 属性删掉就能还原原来的值。遍历代码以下:
const parser = require("@babel/parser");
const traverse = require("@babel/traverse").default;
const t = require("@babel/types"); //操做节点的函数,好比判断节点类型,生成新的节点等:
const generator = require("@babel/generator").default; //生成还原后的代码
const fs = require('fs');
var jscode = fs.readFileSync("./slide.js", {
encoding: "utf-8"
});
const visitor = {
StringLiteral(path) {
delete path.node.extra
}
}
let ast = parser.parse(jscode);
traverse(ast, visitor);
let {code} = generator(ast, opts = {jsescOption: {"minimal": true}});
fs.writeFile('decode_slide.js', code, (err)=>{});
注意 jscode 就是以前扣下来的 JS 代码, 最后将还原后的代码写入到 decode_slide.js 文件中
接下来是混淆数组的还原。观察调试代码,全部的数组都是基于 JS 文件中开头的大数组 KBBji.$_Co,同时将该数组赋值给不少变量,这些变量名都是随机生成的。
因此接下来咱们要作的找出这些变量名称,而后将其替换成对应的字符串值!
AST 在线解析一下

根据解析结果,编写相应的遍历代码
const visitor = {
VariableDeclaration(path){
const {declarations} = path.node;
if(!t.isMemberExpression(declarations[0].init))return;
if(declarations[0].init.property.name !== "$_Co")return;
if(declarations.length !==3 || declarations[0].init.property === undefined)return;
let value1 = declarations[0].id.name;
let value2 = declarations[2].id.name;
new_array.push(value1, value2);
}
};
上面就将全部的变量名找出来了,找到以后就能将全部的这种形式 $_DFCB(66) 代码还原了,这样代码就能有个直观感觉!

相信聪明的你很快就能写出还原的代码。通过上面几步总体还原后的代码是这样的

根据关键词很快就能搜索到加密所在位置,清晰可见!若是不还原你是搜不到的.. 还原后在网站上咱们也能很快定位到加密位置,打上断点

一样的代码可读性相差多大,相信你一眼就能看到。你觉得这样就完了?No!
Reres 替换
既然代码已经还原了,可是咱们在网站上调试的时候仍是混淆的代码,那怎么办呢?
接下来上另外一个神器 Reres, 它的做用是将请求映射到本地,即你能够用本地 JS 来代替远程 JS 文件。
用法直接参考它的 github https://github.com/annnhan/ReRes[2]
好了有了这个东西,咱们就能在网站上用还原后的 JS 来进行调试,太强了把!
效果以下:

tql,这下加密参数扣起来就没压力了吧!
后台回复 tql 获取相关代码!
参考资料
https://blogz.gitee.io/ast/: https://blogz.gitee.io/ast/
[2]https://github.com/annnhan/ReRes: https://github.com/annnhan/ReRes
推荐阅读
THANKS
- End -
点个“在看”必升职加薪喔!
本文分享自微信公众号 - Python编程与实战(GoPy1024)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。