声明
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请练习作者删除!
逆向目标
-
目标:某团滑块,behavior和_token参数分析
进入网页后,F12 进行抓包
-
request_code:验证码 id;
-
feVersion:yoda.seed.js 返回;
-
source:yoda.seed.js 返回;
-
layer:yoda.seed.js 返回;
响应预览中返回的关键内容如下:
-
session:behavior和_token 的加密关键
-
isDegerade:behavior和_token 加密时用到
-
timestamp:后续请求用到
滑动滑块到指定位置,抓包到 verify
校验接口:
一些重要的参数:
-
request_code: 与page_data接口一样;
-
behavior:浏览器参数,由一些浏览器参数和滑块轨迹构成;
-
_token : 加密参数;
逆向分析
behavior 参数
先全局搜索 "behavior"
,找到对应的 js 文件,点击进去格式化后,再 ctrl + f 局部搜索定位关键位置:
在第 7706 行打下断点,移动移动滑块到指定位置即会断住:
PY(this[yi5cw_D(0x22)], bv, this[yi5cw_D(0x51b)][yi5cw_D(0xe8)])
-
this[yi5cw_D(0x22)] : 可视化参数和浏览器参数;
-
bv : request_code ;
-
this[yi5cw_D(0x51b)][yi5cw_D(0xe8)] : page_data 返回的 isDegrade 参数 ;
再跟进加密函数py 里:
behavior 由bg 和 bi 经过加密函数Pc 生成的,而 bg 又由 this[yi5cw_D(0x22)] 转成的字符串和加密后的request_code 再加密得到的:
进入加密函数 Pc 中 :
最终进入 Pw函数,behavior 参数就是由 bu,bj 加密 得到的:
bj + '#' + Pa[yi5cw_D(0x567)](bU, bj);
再看一下bj怎么生成的,在4617 行打下断点,重新滑动验证码:
bj 由 window.f 函数生成在进行base64加密,在通过hook window.f 的位置,断点断在4491行:
bg 由 page_data 返回的 sgin 解密生成,base 64 加密 window.f 得到前缀;
_token 参数
在7199 行打下断点:
bu[yi5cw_D(0x165)] = bt(bk, bz[yi5cw_D(0x109)]())
_token 在此处已经被加密 ,bk 为 False
进入 bz[yi5cw_D(0x109)]中 定位到3830行,bz[yi5cw_D(0x109)]() 就是 对象bz 经过bQ 加密得到的
进入bQ 函数,定位到3763 行可知 bz[yi5cw_D(0x109)]() 就等于 window.boat(encodeURIComponent(bz))
后序的加密方式和 behavior 参数加密方式一样;
Authencation 参数
在6818 行 断点,Authencation 就是 bR, bR 又为 bV 加密的到的;
bv = 'HTTPMethod=POST&Content-MD5=' + bI + '&Content-Type=' + 'application/x-www-form-urlencoded' + '&Date=' + bt + '&Url=' + bT
特别说明:
-
window.f 前缀里来大量的控制流平坦化,直接补环境调试很费时间,可以直接使用自动化工具如
selenium等工具运行的得到结果
-
behavior 参数里 point 参数 和 _token参数里 mT 参数 是有一定联系的,point 记录的是滑块的轨迹,mT 记录的是鼠标移动最后的 60 个坐标
-
point 轨迹要符合轨迹离散分布的规律