首页
社区
课程
招聘
[原创]数某验证码及风控浅析
发表于: 2026-6-17 10:08 1067

[原创]数某验证码及风控浅析

2026-6-17 10:08
1067

本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!若有侵权,请联系作者删除。

记录一下逆向某登陆的总结!关键部分已做打码处理,网址敏感,暂不分享(笔者可不想再来一发!),后续会提供分析样本,感谢理解。emmm,这次登录总共遇到了某美滑块验证码,某美指纹风控。接下来就进入正题吧老铁们!

提交登录触发事件之后总共出现n个数据包。其中有用的就是验证码接口,风控接口和校验接口。先简单说一下吧,接口返回的顺序就是首先就是register接口,web接口,fverify接口,最后是verify接口。

organization:某数产品唯一标识

callback:回调ID

sdkver:标识版本

captchaUuid:32位随机字符串

model:模式,也就是这次要处理的验证码类型是滑块验证码

其他:都是固定的,不过有些值后续加密的时候会使用到。但是是固定的没必要深究,不过后续会稍微说一下的勒。

指纹的第一个加密的接口。

callback:回调ID

organization:某数产品唯一标识

smdata:指纹加密

os:他写的web,我估计是这个产品使用的是网站或是app。

version:版本

返回值是一个JSONP,看着参数不咋多勒,smCB_*` 函数后续会被调用,并且接收相应的 JSON 数据,完成跨域数据获取。换句话说就是这些返回值后续会直接当作指纹第二次加密的值。为什么前面接口的jsonp不说,这个接口的JSONP我会专门拿来说,就是因为遇到坑了后续会细说,特别是sign跟timestamp和len这三个值特别重要,卡了我很久。

fverify接口就是验证码校验接口

验证码返回值是pass就是通过,没通过就是REJECT。

携带的参数有account,clientId,deviceId,keyPairId,pageToken,password,promotionId,rid,smDeviceId,state,type,uiaType。

account是网站加密之后的账号

password是网站加密之后的密码

其余参数除了固定之外的都在后续验证码跟指纹那块了。

验证码相关的接口就只有register接口,fverify接口和verify接口。话不多说,直接开始逆向分析。

register就只有一个captchaUuid,不去刷新好像不变,参考了b站韭菜何某的教程说是固定的,但是刷新之后又是会变化的,依着知其然知其所以然的原则,我决定深究下去,于是我开始找各种文章,终于参考k佬的文章找出来了加密点,就浅析一下吧!

跟栈进去打断点刷新验证码获取,断点断住了

搜索captchaUuid,可以看到captchaUuid在此文件总共出现了6次。全部打断点逐一分析。

这是所有断点唯一断住的地方,可以看到他是被_0xda8467赋值的,直接搜索_0xda8467,经过断点调试,此时captchaUuid早就被生成了,是从_0x2b2937取的值。

经此断定,captchaUuid生成的地方不在这个文件,想找到生成点,跟栈回溯也好,搜索也罢。我的习惯是先全局搜索,实在找不到再回溯跟栈。全局搜索之后,captchaUuid还出现在smcp.min.js。

在smcp.min.js搜索captchaUuid,发现他是由_0x4954a5赋值的。此处只截图了一个赋值点,代码里面有蛮多的地方captchaUuid都是被_0x4954a5赋值的。

搜索_0x4954a5很容易就找到了生成点,但是代码混淆了。咱们直接手动解混淆看看代码究竟写了什么。

这里有个或运算,它会从左到右求值,返回第一个真值表达式的结果,如果从userConfig取不到captchaUuid,就是undefined,则运行后面的函数。如果userConfig里面有captchaUuid则一直没生成captchaUuid。这也就是为什么过验证码的时候captchaUuid一直没变,刷新之后就变了。而后面的函数就是生成captchaUuid的地方。

进入getCaptchaUuid函数之后下断点,看到返回值是由this['generateTimeFormat']的返回值和_0x137599拼接返回的。

代码上面是混淆的,我们本地扣代码解混淆分析一下。

整段代码的功能是生成一个字符串,表示当前的日期和时间,并将其格式化为字符串。

_0x137599是在getCaptchaUuid生成的。那么分析一下getCaptchaUuid这个函数吧

因为是分析_0x137599,所以代码只提取了_0x137599的生成,与网站源码函数不一致,后续的getCaptchaUuid应该是generateTimeFormat返回值+ _0x137599返回值。而_0x137599就是一个随机生成字符串的作用。最终可得captchaUuid就是时间戳字符串+随机字符串!

fverify接口就有很多加密参数,一看就很头疼,但是其中会变化的参数只有hg,callback,th,rid,gg。callback就是回调ID直接用py生产对应时间戳发包就行了,rid的话就是register接口的返回值,作用就是用来绑定数据包的,所以我们只需要分析三个会变的函数就行了。

进入代码打断点。

此时明文已经被加密了

使用搜索大法~~~~

非常容易就找到了加密函数。

打印_0x58b708对象,里面就是我们需要的参数,接下来就是分析_0x58b708对象所有的值生成的加密函数与其对应的明文。

看下面图片,可以非常的确定第一个参数的0是滑动距离了

而那个290就是渲染的大小了,第二个参数后续跟进getEncryptContent再去分析。

_0x13468f 是一个数组

搜索_0x13468f可以看到他是取的鼠标轨迹放到对象里面

他们走的都是同个加密函数,第二个参数照样还是字符串,先分析第一个传参_0x5eae4a - _0x4dc2d8

_0x5eae4a是取的结束时间,而_0x4dc2d8是开始时间

打印_0x488717发现里面的所有值都跟滑块有关,估计可以猜测_0x5eae4a是取的滑块松开结束时间,而_0x4dc2d8是滑块触摸开始时间


[内核课程]《Windows内核攻防实战》!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。

收藏
免费 10
打赏
分享
最新回复 (2)
雪    币: 158
活跃值: (5026)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习。
2026-6-18 14:44
0
雪    币: 104
活跃值: (8829)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
tql
6天前
0
游客
登录 | 注册 方可回帖
返回