爬虫 | JS逆向某验滑动加密分析
第一时间获取 Python 技术干货!
声明:本文只用于学习研究,禁止用于非法用途,如有侵权,请联系我删除,谢谢!
今天给大家来分析并还原某验的 JS 加密,做过爬虫的应该都知道遇到过这个验证码,如果你还没遇到以后你会碰到的相信我
话不多说,时间宝贵,进入正题!
抓包
进入官网,点击选择今天的主题滑动验证,其他验证类型的加密大同小异,只要你掌握了下面的方法!
点击按钮抓包,随意拖动一下,请求数据包如下
可以看到一堆请求参数,其实你要做的就是实现 w 的加密
点击进去,就能看到加密的 JS 文件,为便于分析将其保存到本地。
AST 还原
通过调试可以看到有大量的 unicode 格式的编码以及数组名称的混淆
传统解决方法是在浏览器 console 端输入就能看到它的庐山真面目,但是这种方法太麻烦了,接下来我们用 AST 来将其还原!
首先还原 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 在线解析一下
image.png
根据解析结果,编写相应的遍历代码
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 获取相关代码!
参考资料
[1]
https://blogz.gitee.io/ast/: https://blogz.gitee.io/ast/
[2]
https://github.com/annnhan/ReRes: https://github.com/annnhan/ReRes
- 用Java实现处理日期的工具类——常用日期处理方法
- ORM查询语言(OQL)简介--实例篇
- 漏洞预警 | 海洋CMS(SEACMS)0day漏洞预警
- 【机器学习】分类算法评价
- Java中图片处理工具类——能满足各种需求
- onclicklistener到底怎么用?
- 如何入侵联网智能灯泡——LIFX智能灯泡
- Java实现的一个编号生成器工具类——5种方法
- 【机器学习】有趣的机器学习:最简明入门指南
- 不使用反射,“一行代码”实现Web、WinForm窗体表单数据的填充、收集、清除,和到数据库的CRUD
- 海量数据处理利器之布隆过滤器
- ORM查询语言(OQL)简介--概念篇
- Discuz! 任意文件删除漏洞重现及分析
- .NET DLR 上的IronScheme 语言互操作&&IronScheme控制台输入中文的问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Golang服务器热重启、热升级、热更新(safe and graceful hot-restart/reload http server)详解
- Nmap NSE 库分析 >>> shortport
- Linux 后门系列之 python3 反弹shell & 隐藏后门
- nc 反弹shell | Linux 后门系列
- dash & rbash & nc.openbsd | Linux 后门系列
- 通达OA getshell | Nmap 脚本
- Golang的优雅重启
- 通达OA文件包含全版本 getshell | Nmap 脚本
- NSE代码生成器 | Nmap 脚本
- shell 加密传输 | Linux后门系列
- msf反弹一把梭 | Linux后门系列
- IDEA 远程调试
- 不落地反弹meterpreter | Linux后门系列
- rsyslog的安装、使用、详解
- Nmap NSE 库分析 >>> stdnse