分析目标
-
微信公众号: y小白的笔记 ((https://mp.weixin.qq.com/s/Py7I6RG7UT9EtdpXlV98aA)
-
只分析验证码加载流程, 不说具体细节
-
版本 226
-
目标参数
slidedata.n
-
成功返回
{"code":0,"result":{"code":0,"sig":"from bx"},"success":true}
并且响应头有bx-x5sec: ***
-
滑块初始化(主逻辑),
fireyejs.js
-
暴露接口
awsc.js
流程分析
1, 初始化
-
点击密码输入框会触发滑块, 所以点击输入框之前下断点
脚本第一条语句
, 会发现滑块已经开始了初始化,window._config_
,
-
一直F8, 直到看到目标js
fireyejs.js
, 稍微梳理下, 会发现最后调用了i(49)
, 并且 上面声明了a = []
;, 在i(49)执行之后会发现a里面已经有95位
-
document.currentScript
为当前加载的script节点
, 没有dom解析的需要自己去构造 -
lswucn
可以直接复制, 但是后面的时间戳不可写死
-
其中
36/37/94位索引
, 本质为时间戳
, 但是被重写了 toString
,84
位索引本质是不存在
的, 但是调用了被重写之后的toString
之后, 84则会被push
, 可以手动定位索引push的位置, 然后手动跟几步, 会发现toString重写的位置, 删了就好 -
并且设置了
定时器
,异步方法调用
, 在初始化完成之后需要在合适的时机去调用 -
注意: 存在的索引要和浏览器一致
-
快速定位索引
function hookArray(target, index) {
return new Proxy(target, {
set(target, property, value) {
if (property === (index + "")){ debugger }
console.log(`setArray index->${property} = ${value}`);
target[property] = value;
},
get(target, property){
if (property === (index + "")){ debugger }
let result = target[property];
try{ console.log(`getArray index->${property} = ${result}`); }catch(e){}
return result;
},
deleteProperty(target, property) {
console.log(`deleteArray index->${property}`);
delete target[property];
}
});
}
a = hookArray(a, 37);
2, 事件触发
-
浏览器获得鼠标操作, 本质是注册了鼠标事件
-
在初始化的时候, js注册了几个事件
-
deviceorientation
为陀螺仪
事件, 在load
事件之后调用, 由于这里没有注册load事件, 所以在fireyejs.js
初始化之后, 浏览器会异步执行deviceorientation
事件 -
本地在js初始化完成之后, 手动调用这个事件
3, 滑块初始化-结果
-
先触发滑块 然后打开浏览器鼠标
mousedown
断点 -
点击滑块之后最终会断到这里
-
__fy
其实是上面AWSC.configFYEx(function(n) {
, 通过回调方法返回, 并设置到全局的返回值
-
结果获取
4, 流程总结
-
初始化目标js
-
运行
陀螺仪事件
及异步方法
-
初始化滑块(AWSC.configFYEx)
-
startRecord
-
鼠标事件调用(通过事件调用, 无需关注加密, 只需要喂进去对的参数)
-
getFYToken
获得加密结果值
总结
-
可以适当的挂上代理去看缺少了什么环境
-
要去对比98位数组 浏览器和本地的差异, hook数组去快速定位,
-
缺啥补啥
-
图是糊了点, 糊了好, 糊了安全