论坛首页 密码学讨论区 阅读主题

【JS逆向】某验三代点选逆向分析

348 浏览 18 回复
#1 楼主 2026-06-01 21:09:07
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关.本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责站点:aHR0cHM6Ly93d3cuYmlsaWJpbGkuY29tLw==目标:某某验点选配套视频:视频提前打开F12,进入网站点击登录,手动点错一次提交后,观察发包:这5次请求为核心请求,依次分析。发现其主要参数为gt,且能搜索到是来自于capthca这个接口,再看看这个接口有什么:观察主要返回这些内容,在接下来的流程中可能会用到。响应内容:返回了很多字段,可能后续有用请求参数:gt,challenge上一步我们已经拿到。w看起来似乎要处理。这里就不贴图了,跟第2步的请求参数一样,可能要处理w。至于响应内容,则返回的是当前验证码类型:响应内容:pic返回了图片,以及一些字段后续可能用到请求参数:没有需要特别处理的,此前全都能取到。响应内容:返回fail,正是点击失败的返回,这一步就是去验证验证码了请求参数:除了w,其他参数并无特别以上5次请求,发现2,3,5三个步骤中都有w需要处理,目标则为逆向w值。先说结论,实测下来其实2,3步骤中的w并不校验,本次不分析,着重于分析最后一步提交验证码的w参数分析。先大概看看调用栈,发现都来自于click.3.1.1.js这个文件,那目标明确。发现有大量这种调用,显然是个混淆。我的习惯是面对这种混淆,优先看看AST还原一部分,便于调试。将js拿出来放到vscode收起来观察,4个大方法,一个自执行方法,并不是传统的OB混淆尝试拿自执行方法中的某个调用,来本地执行打印,发现没问题能正常出值。整个自执行的方法中包含大量$_CFAn(86)这种类型调用,结合我们本地能执行的情况,也就是说其实跟OB中的解密函数也差不多一个意思,那就好办了。AST思路,详细过程在:视频将还原后的js本地替换浏览器js后,直接搜索参数之一client_type可以直接定位到目标,接下来开始繁杂的debug可以看到w = p + u,u = n["$_CDGJ"](),p = w["$_EEn"](h),而h = X["encrypt"](ae["stringify"](o), n["$_CDHy"]())。那就先看u吧。跟进 n["$_CDGJ"]()看看。混淆部分在视频中有讲理解,就是赋值新变量+concat+取值,由于我们已经AST处理掉了,这一部分就属于无用代码,后续分析其他方法看到这种直接不用管就是。得益于解混淆后,直接就能跟到:e是undefined,不用管;需要再看new H()["encrypt"] 和 this["$_CDHy"](e)。分别往下看跟进来发现主要逻辑有来自于ve = Q(),继续往下跟:​ 结论:发现这个方法是加在k的原型上的,向上找就能找到var H = function(){}把整个H拿下来,再把4个方法加上,稍微补一补环境,就能搞定。跟网站生成的值一对比,发现不一样,其实也正常,这个算法是rsa,非对称加密,也可以用标准库去解决试试,反正这里我已经扣下来js了就这样不管了。到这里,u已经搞定。重头戏来了,这里p的组成比较复杂,需要逆向的值有好几个。X["encrypt"](ae["stringify"](o), n["$_CDHy"]())p来自于h,那先解决h。观察n["$_CDHy"]()的值跟上一步一样,其实也就是一个加密key值,流程如下:所以h的重点在于X["encrypt"]和(ae["stringify"](o)以及o是什么,那就一个个来,先看oo的组成很复杂,有这么多东西a:其实是点击的坐标,但经过处理ep:看起来像轨迹和环境h9s9:可能要逆向lang、pic:固定或者之前能取到rp、tt:不知道含义,要逆向其实就是JSON.stringify,直接改写就好


回复或点赞可查看完整内容

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-286163.htm
#17 2026-06-01 21:09:07
学习了
#18 2026-06-01 21:09:08
学习一个
#19 2026-06-01 21:09:08
感谢分享!!
‹ 上一页 1 2 下一页 ›

请登录后参与讨论

立即登录 注册账号