【AI 逆向专栏】古法 AI:某程滑块验证码逆向分析
声明本文章中所有内容仅供学习交流使用不用于其他任何目的不提供完整代码抓包内容、敏感网址、数据接口等均已做脱敏处理严禁用于商业用途和非法用途否则由此产生的一切后果均与作者无关本文章未经许可禁止转载禁止任何修改后二次传播擅自使用本文讲解的技术而导致的任何意外作者均不负责若有侵权请在公众号【K哥爬虫】联系作者立即删除前言最近收到私信询问关于某程滑块的解法难度不大。经过分析完全可以通过 AI 来完成逆向本文将对该站进行相关分析。抓包分析抓包可知触发验证码是由captcha/v4/risk_inspect接口触发的如下参与请求的值有dimensions、extend_param、sign。验证后接口返回 token、rid 以及图片信息。验证接口相比图片接口多了一个verify_msg参数通过校验后 token 被激活古法逆向从risk_inspect包入口进入定位到如下地方发现了载荷中要找的几个值生成逻辑如下r_0x342058(_0x311148[_(0x72)](n),0),a{resolution_width:M[_(0xa5)],resolution_height:M.scrH,language:P},c_0x342058(_0x311148.stringify(a),0),o_0x110baa[_(0x97)](appids_(0x10e)fversionD[_(0x4d)]_(0x74)r_(0x3a)c),G(H[_(0x75)]H[_(0x6c)],{extend_param:encodeURIComponent(c),appid:s,business_site:f,version:D[_(0x4d)],dimensions:encodeURIComponent(r),sign:o[_(0xad)]()第一个参数extend_param是通过c _0x342058(_0x311148.stringify(a), 0)生成的a 为常见的信息{resolution_width:1512,resolution_height:982,language:}同时dimensions生成方式相同也是通过r _0x342058(_0x311148[_(0x72)](n), 0)生成。n 大部分为指纹信息这里做脱敏处理{ rt: fp44779A-738C77-EF371Cvid1779266823753.8bb8R2qxntXkpageId10320670296r06fed28fb6c0464c9201df7d452ba538ip223.104.124.240rg ua: **********************脱敏处理*********************************** p: pc, fp: 44779A-738C77-EF371C, vid: 1779266823753.8bb8R2qxntXk, identify: a44779A-738C77-EF371C, guid: 09031151214445559123, h5_duid: null, pc_duid: null, hb_uid: null, pc_uid: null, h5_uid: null, infosec_openid: null, **********************脱敏处理*********************************** client_type: PC, site: { type: PC, url: , ref: https://www.ctrip.com/, title: 登录首页, keywords: }, device: { width: 1512, height: 982, os: , pixelRatio: 2, did: }, user: { tid: , uid: , vid: } }sign 则是通过o _0x110baa[_(0x97)](appid s _(0x10e) f version D[_(0x4d)] _(0x74) r _(0x3a) c)生成的经过分析_0x110baa[_(0x97)]为 md5 算法。所以现在就剩_0x342058需要分析单步跟进可以发现是 new 了一个方法然后经过 n 函数最终生成的nnew_0x254c65(128,1e3);return0e?n[t(0xcd)](i,x):n[t(0x108)](i,x)进入 n 函数中发现是通过encrypt生成的该 aes 也未经过魔改标准算法returne[x(0x86)][x(0xcd)]function(e,t){varix;return_0x110baa[i(0x94)].encrypt(t,this.key,{iv:_0x110baa[i(0xae)][i(0x2d)][i(0x2c)](e)})[i(0x123)][i(0xad)](_0x110baa[i(0xae)][i(0xf)])},最后一个校验函数与上述流程类似多了一个verify_msg参数定位到下图处同样还是由 n 函数生成_0x13f650包含了轨迹以及少部分浏览器信息这些搞定后即可将整个验证码过掉。篇外实际上手动登陆如果每次清空缓存是不会弹出验证码的频繁点击后必出验证码。经过研究发现dimensions 中的fp与rt即 rmstoken指纹参数很重要决定了是否会触发验证码。定位 rt 相对简单rt 和 fp 参数都是从 M 中取值的向上定位 Mrt:M[_(0x71)],ua:M.userAgent,p:i,fp:M.FP,最终找到下图位置跟进后发现最终生成逻辑是挂到getRmsToken上的同时还挂载到 window 里面直接调用rmstoken window.RMS.getRmsToken()即可rms 的定位也大同小异trigger 中发现其被当参数传进去的继续向上跟最终定位到下图处由cfp函数生成至此我们把环境补齐直接调用这几个函数即可生成相关参数AI 逆向对于 AI 逆向的话能不能搞出来取决于提示词不管是 mcp 还是静态分析都是不错的方法同样还是丢万能提示词再然后就可以解放双手了等个几分钟看一下结果经过验证与古法分析的结果完全一致。结果验证