声明
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在公众号【K哥爬虫】联系作者立即删除!
前言
粉丝答疑又双叒来了!最近仍有不少粉丝咨询逆向相关问题,K哥会尽力回复,不过毕竟精力有限,不可能说是面面俱到(忙忘了@.@)。当然,还是会尽可能多筛选些典型的案例,产出相关文章,以供大伙学习交流。本期分析的验证码,如果没有相关业务,可能很多人不会接触到,也算是较为新颖,话不多说,开始正文:
逆向目标
目标:xx 滑块逆向分析
网站:aHR0cHM6Ly9wYXNzcG9ydC4xMTE4NS5jbi9jYXMvbG9naW4=
抓包分析
抓包分析,先看图片接口 gen:
返回的内容比较多,后面估计会用到,我们留意一下就行,clientUid 后文分析:
再来看验证接口,即发验证码的接口:
- id : 图片接口返回;
- bgImageHeight: 写死即可;
- bgImageWidth:写死即可;
- clientUid:同图片接口参数 clientUid;
- deviceId:图片接口返回 deviceId;
- enmiid:需要分析;
- entSlidingTime:结束验证时间,模拟一下,校验不严;
- print:需要分析;
- sliderImageHeight:写死即可;
- sliderImageWidth:写死即可;
- startSlidingTime:开始验证时间,模拟一下,校验不严;
- trackList:轨迹列表。
验证结果:
- 失败
- 成功
逆向分析
gen 接口
该接口有个 clientUid 参数,目测是 uuid 类型, 我们全局搜索一下,发现只在 main.js 文件中存在,进去后发现被 ob 混淆:
又是经典的 ob 混淆, 这里直接借用 v佬 的插件快速还原,工具地址如下:
Github 仓库:https://github.com/cilame/v_jstools
在线分析工具:https://astexplorer.net
还原之前还需要稍微的预处理一下,比如下面这样一堆常量的花指令,以及十六进制形式的数字:
比如下面这样一堆常量的花指令,以及十六进制形式的数字
附上简单的预处理 AST 代码:
// 字符串美化
const simplifyLiteral = {
NumericLiteral({
node }) {
if (node.extra && /^0[obx]/i.test(node.extra.raw)) {
node.extra = undefined;
}
},
StringLiteral({
node }) {
if (node.extra && /\\[ux]/gi.test(node.extra.raw)) {
node.extra = undefined;
}
},
}
traverse(ast, simplifyLiteral);
let my_obj = {
};
const merge_odj = {
VariableDeclarator(path){
let {
init} = path.node;
if (!types.isObjectExpression(init)) return;
let {
properties} = init;
properties.forEach(property => {
// 确保属性值是字面量
if (types.isLiteral(property.value)) {
my_obj[property.key.name] = property.value;
}
});
}
};
traverse(ast, merge_odj);
const clearObjectofValue = {
MemberExpression(path){
let {
object, property} = path.node
if (!property || !types.isIdentifier(property) || !types.isIdentifier(object)) return;
let key = property.name
let value = my_obj[key]
if (!value) return;
console.log(