本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
此文章重在学习调试技巧。模拟参数生成。
目标网站: aHR0cHM6Ly93d3cuaXNodW1laS5jb20vdHJpYWwvY2FwdGNoYS5odG1s
简述:
数美验证码不难,甚至有点简单。简单到感觉逆向它,对于自己逆向能力没有提升。
逆向分析
此验证码传了两个接口
验证码接口
一个是图片生成接口

生成背景图和滑块图,还有验证接口携带的rid
此接口不需要做任何参数加密,直接请求即可
验证接口

除了以上四个参数,其它参数都基本不变,因为密钥不变,加密参数也不变。
调试方式非常简单,直接搜'wn'

基本都是用同一种加密

xa值
这个参数是x坐标除以整个图x长度

这是函数内部,打上日志断点就知道了,别打断点,因为点击也会断住,

可以打条件断点,设置当
_0x427dd6 == 300时


进入函数内部,看return ,然后搜索

发现加密是个des加密。既然des加密,基本就可以采用扣代码了,但是貌似有点困难
用补环境比较简单,环境很少,就这么多
head = {}
window = globalThis
Document = function Document() {
}
Document.prototype.getElementsByTagName = function getElementsByTagName(args) {
// console.log('Document - >getElementsByTagName->', args)
if (args == 'head') {
return head
}
}
HTMLDocument = function HTMLDocument() {
}
Object.setPrototypeOf(HTMLDocument.prototype, Document.prototype)
document = new HTMLDocument()
Navigator = function Navigator() {
}
Navigator.prototype.userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36"
navigator = new Navigator()
然后导出这个对象
搜最后一个,注销然后用自己参数赋值

然后再导出这个参数

类似这样子

一开始我传参固定。请求的值都是变化的
有个注意点

导致这里不成立

所以值是对的
但是在node里,这是true

导致node的参数会跟时间戳有关联,然后就错了
直接换成0就对了

wn轨迹值
这轨迹其实是一坨屎。没有任何难度可言
轨迹要如何模拟

可以一开始要滑块拖到最低

然后断住,copy这段轨迹

用ocr识别后x值,在这段轨迹哪个与哪个值中间,然后切割轨迹就行了。
track=[[0,0,0],[0,0,105],[1,0,200],[1,0,307],[4,0,415],[4,0,508],[6,0,601],[12,1,710],[14,1,801],[18,1,901],[18,1,1004],[19,1,1108],[24,1,1202],[27,1,1300],[27,1,1401],[27,1,1502],[28,1,1603],[30,3,1700],[31,3,1812],[31,3,1906],[31,3,2014],[31,3,2108],[31,3,2201],[43,3,2300],[60,3,2401],[75,3,2501],[90,3,2605],[92,3,2702],[97,2,2808],[97,2,2901],[102,2,3004],[113,0,3100],[113,0,3201],[125,-1,3301],[128,-1,3400],[142,-3,3501],[143,-3,3601],[149,-3,3701],[150,-3,3800],[154,-3,3900],[166,-3,4001],[166,-3,4111],[175,-4,4204],[183,-4,4301],[189,-4,4406],[190,-4,4501],[204,-5,4605],[209,-5,4701],[214,-5,4803],[228,-6,4901],[250,-8,5001],[252,-8,5103],[260,-9,5201],[260,-9,5301],[260,-9,5401],[260,-9,5500]]
function get_data(x) {
function get_x_track(x) {
arr = []
for (i = 0; i < track.length; i++) {
if (track[i][0] < x) {
arr.push(track[i])
}
if (track[i][0] >= x) {
track[i][0] = x
arr.push(track[i])
break
}
}
return arr
}
这是一段有效轨迹,传入X值,切割
还有个时间差的值,直接轨迹最后的时间加1到100随机值就行。

这一段没有效验那么严,写死也行
像其它参数的值也是固定的

一个注意点,从接口获取的图片大小比实际网页大两倍,所以得缩小,python代码如下:
def get_smaller_bytes(bytes):
img = Image.open(io.BytesIO(bytes))
new_size = (img.width // 2, img.height // 2)
img_resized = img.resize(new_size, Image.LANCZOS)
out = io.BytesIO()
img_resized.save(out, format=img.format)
smaller_bytes = out.getvalue()
return smaller_bytes
传入得是字节流,返回得也是字节流,然后用ddddocr解决即可
或者ocr识别值除以2也行
总结:

REJECT代表参数要错了,要么轨迹错了,要么识别错了,出现这个别担心,多试几次说不定就过了。
![]()
PASS代表过了
2080

被折叠的 条评论
为什么被折叠?



