为了账号安全,请及时绑定邮箱和手机立即绑定
首页 手记 【AI 逆向专栏】古法 &...
  • 推荐
    评论
    收藏
    分享

【AI 逆向专栏】古法 & AI:某程滑块验证码逆向分析

标签:
Python

NhhCrs.png

声明

本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!

本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在公众号【K哥爬虫】联系作者立即删除!

前言

最近收到私信,询问关于某程滑块的解法,难度不大。经过分析,完全可以通过 AI 来完成逆向,本文将对该站进行相关分析。

Nhhjy7.png

抓包分析

抓包可知触发验证码是由 captcha/v4/risk_inspect 接口触发的,如下:

Ngh44j.png

参与请求的值有 dimensionsextend_paramsign。验证后接口返回 token、rid 以及图片信息。验证接口相比图片接口多了一个verify_msg 参数:

Ng8mMJ.png

通过校验后 token 被激活:

Ng8L3G.png

古法逆向

risk_inspect 包入口进入,定位到如下地方:

NhbA2O.png

发现了载荷中要找的几个值,生成逻辑如下:

r = _0x342058(0x311148_(“0x72”), 0),
a = {
resolution_width: M[
(“0xa5”)],
resolution_height: M.scrH,
language: P
},
c = _0x342058(0x311148.stringify(a), 0),
o = 0x110baa[(“0x97”)](“appid=” + s + (“0x10e”) + f + “&version=” + D[(“0x4d”)] + (“0x74”) + r + (“0x3a”) + c),
G(H[
(“0x75”)] + H[
(“0x6c”)], {
extend_param: encodeURIComponent©,
appid: s,
business_site: f,
version: D[
(“0x4d”)],
dimensions: encodeURIComponent®,
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”: “fp=44779A-738C77-EF371C&vid=1779266823753.8bb8R2qxntXk&pageId=10320670296&r=06fed28fb6c0464c9201df7d452ba538&ip=223.104.124.240&rg
"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 函数最终生成的:

n = new _0x254c65(128,1e3);
return 0 === e ? n[t(“0xcd”)](i, x) : n[t(“0x108”)](i, x)

进入 n 函数中,发现是通过 encrypt 生成的,该 aes 也未经过魔改,标准算法:

return e[x(“0x86”)][x(“0xcd”)] = function(e, t) {
var i = x;
return _0x110baa[i(“0x94”)].encrypt(t, this.key, {
iv: _0x110baa[i(“0xae”)][i(“0x2d”)]i(“0x2c”)
})[i(“0x123”)]i(“0xad”)
}
,

最后一个校验函数与上述流程类似,多了一个 verify_msg 参数,定位到下图处,同样还是由 n 函数生成:

Nhbccf.png

_0x13f650 包含了轨迹以及少部分浏览器信息,这些搞定后即可将整个验证码过掉。

篇外

实际上,手动登陆如果每次清空缓存是不会弹出验证码的,频繁点击后必出验证码。经过研究发现,dimensions 中的 fprt(即 rmstoken) 指纹参数很重要,决定了是否会触发验证码。

定位 rt 相对简单,rt 和 fp 参数都是从 M 中取值的,向上定位 M:

rt: M[_(“0x71”)],
ua: M.userAgent,
p: i,
fp: M.FP,

最终找到下图位置:

Nhb4nZ.png

跟进后发现最终生成逻辑是挂到 getRmsToken 上的:

NhbJLU.png

同时还挂载到 window 里面,直接调用 rmstoken = window.RMS.getRmsToken() 即可:

NhbXxq.png

rms 的定位也大同小异,trigger 中发现其被当参数传进去的,继续向上跟:

NhbI9a.png

最终定位到下图处,由 cfp 函数生成:

NhbMK7.png

至此,我们把环境补齐,直接调用这几个函数即可生成相关参数:

Nhbf1I.png

AI 逆向

对于 AI 逆向的话,能不能搞出来取决于提示词,不管是 mcp 还是静态分析都是不错的方法,同样还是丢万能提示词:

Nhg0aQ.png

再然后就可以解放双手了,等个几分钟看一下结果:

Nhg3If.png

经过验证,与古法分析的结果完全一致。

结果验证

Nhg70c.png

点击查看更多内容
发表于 2026年06月29日 17:43, 共 31 人浏览

本文原创发布于慕课网 ,转载请注明出处,谢谢合作

TA 点赞

若觉得本文不错,就分享一下吧!

评论
评论

共同学习,写下你的评论

评论加载中...

展开查看更多评论

作者其他优质文章

正在加载中
Python工程师
手记
粉丝
31
获赞与收藏
47

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的〜
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

慕课手记新用户专享福利
恭喜你,你的运气太好了,居然抽中了 100个积分!
恭喜你,抽中了价值 元的专栏 !
太棒了, 直接落到你账户里!
积分商城里的罗技鼠标、机械键盘、
Kindle 阅读器、小米平衡车
Apple iPad (10.2英寸)、大额优惠券
在等着你去兑换了噢
作者:
免费赠送
兑换码:1111222211
优惠券可用于购买实战课、体系课
无门槛使用
先去看看,有什么好东西 马上兑换 我爱学习,选课去

举报

0/150
提交
取消

AltStyle によって変換されたページ (->オリジナル) /