Ali_V3拼图验证 JS逆向 IV8 纯python环境
技术背景与目标
目标网址:aHR0cHM6Ly93d3cuY2VhaXIuY29tLw==
JS逆向分析流程
打开目标网址,随便输入手机号,点击获取验证码,会触发验证码。
人工通过验证码后,接口会响应T001.这是正常通过后的请求,相似的还有F015位置不对,F001环境采集不对等等。具体响应解释,可以看官方文档服务端接入-验证码(Captcha)-阿里云帮助中心
观察抓包情况标准v3发包流程。v3发包流程:init初始化-->log1-->upload(可省)-->log2-->log3(动态轨迹)-->veruftCaotcgaV3(验证)
init接口
里面变化参数是:Timestamp时间戳,SceneId(每个厂商分配的标识) signatureNonce(随机数)Signature(签名参数加密)

全局搜一下singatureNonce并打上断点刷新,此时signatureNonce通过dr()方法生成。singature是通过整个参数加上fpOKzILEajkqgSpr9VvU98FwAgIRcX秘钥(可固定)来进行加密
signatureNonce:进入dr方法是一个随机数。可以用uuid代替
sigature:base64+sha1算法
获取完之后得到响应,里面响应了背景图,缺口图,以及pe.js
LOG1
刷新页面,重新触发Log1断点跟栈,此时已经生成data
搜索c.data并打上断点重新触发。u为ab034ec0643f91399eb33e062dc7fae1固定key。第二个参数固定为w,第三个参数f是上一行生成。第四个参数固定W20220202。第六个参数固定CLOUD,第七个固定空
f参数:W.10001.c+ appName+sceneId+"#captcha-front#"+prefix+"cn"
f = i.PLATFORM + "#" + a + "#" + (i.sceneId || "") + "#captcha-front#" + i.prefix + "#" + i.region,

we加密行数进去是一个AES加密
Log1请求成功会获取一个DeeviceConfig,里面会解密出feilin.js,ip等设备信息
DeviceConfig解密:全局搜一下DeviceCongig并打上断点

继续跟栈会发现AES加密。然后并以#来分割数据。解析的数据分别是:fp_key,switch,session_id(log2/3/deviceToken使用),feilin.js,ts,ip
LOG2
重新触发断点跟栈,在动态feilin.js里面找到变量,t0是生成的log2接口的data
打上断点重新触发此时T0是原始值,继续跟栈
重新打上断点,这里是data的生成。这是外层的加密
继续回到传入数据那里跟栈。往上走。入口在这,
跟栈,具体入口是一个pomise格式
继续跟栈,会进入一个巨大的混淆,用ats结一下。或者慢慢跟栈。会看到生成的值
加密逻辑是先采集浏览器 133 个特征字段拼成指纹串,用 Log1 下发的 fp_key 做第一次 AES 加密,再套上 UPLOAD_KEY 做第二次 AES 加密,最终以 HMAC-SHA1 签名(浏览器采集的指纹特征下面用iv8采集)
LOG3:
检测浏览器插件,自动化检测,环境检测。这一步是来区分机器和人为的。(实测可以忽略,不影响最终结果)
UPLOAD
检测验证码发送时间,用来监控性能(可省略)
VERIFY(验证接口)
重复刚才的断点操作,找到verify接口然后跟栈,最下面的是最初的格式,带着缺口坐标,时间戳,页面的坐标去转换
继续跟栈,还是一个pomise格式。随后进入一个大的混淆循环里面生成。

最终数据生成逻辑是
deviceToken:
enc = AES_CBC_encrypt(fingerprint_133字段, fp_key) ← 密钥来自 Log1 下发的 fp_key
md5_in = "WEB" + "#" + session_id + "#" + enc + "#" + counter + "#" + "daye,raolewoba!"
deviceToken = base64( "WEB#sessionId#enc#counter#md5的hex" )
data:
nc_json = {"TrackList": {...}, "xPos": "143", "arg": "base64密文", ...}
step 1: checksum(nc_json) + nc_json ← 32字节校验和 + 原文
step 2: base64( deflate.level6(step1结果) ) ← 压缩
step 3: vm_encode(step2结果, data_key) ← RC4变体加密
IV8获取feilin
因为feilin版本是动态替换的,每次逻辑一样,但是里面的变量和方法名不一样,所以说。这个feilin采集不能用python代替,否则时不时就要去适配新的版本。用node来实现的话,一方面是跨语言调用,一方面是补环境相对于繁琐,这时候iv8可以拿来使用。跟补环境一样,唯一不足的是iv8有些原生浏览器的api没有(免费的iv8)
log2接口的133字段采集:接口返回的feilin.js下载完,直接加载生成,挂载到iv8里面(图一是iv8的调用,图二是部分加载的环境)

成功检验
实测多个版本可适应,无需担心feilin版本替换,成功率在80%左右,缺口识别用自己写的ocr识别。具体思路是:读取图片-->转通道--》降噪--》判断区域噪点来识别缺口

反反爬策略与优化
常见优化:ip代理,ua随机,屏幕大小随机(要确定好比例,不然动态轨迹生成不准确)
法律与伦理边界
- 逆向技术的合法使用范围
- 企业防护与用户隐私的平衡
- 个人观点,禁止商业行为,侵权请联系下架
更多推荐



所有评论(0)