吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2817|回复: 18
上一主题 下一主题
收起左侧

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

  [复制链接]
跳转到指定楼层
楼主
ShriyGo 发表于 2025-3-21 21:46 回帖奖励
本帖最后由 ShriyGo 于 2025-4-2 19:49 编辑

某验3代点选逆向分析

本文中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关.本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责

### 逆向目标

站点:aHR0cHM6Ly93d3cuYmlsaWJpbGkuY29tLw==

目标:某某验点选

抓包分析

提前打开F12,进入网站点击登录,手动点错一次提交后,观察发包:


这5次请求为核心请求,依次分析。

1. gettype.php


发现其主要参数为gt,且能搜索到是来自于capthca这个接口,再看看这个接口有什么:


观察主要返回这些内容,在接下来的流程中可能会用到。

2. get.php

响应内容:返回了很多字段,可能后续有用


请求参数:gt,challenge上一步我们已经拿到。w看起来似乎要处理。

3. ajax.php

这里就不贴图了,跟第2步的请求参数一样,可能要处理w。至于响应内容,则返回的是当前验证码类型:

{"status": "success", "data": {"result": "click"}}
4. get.php

响应内容:pic返回了图片,以及一些字段后续可能用到


请求参数:没有需要特别处理的,此前全都能取到。

5. ajax.php

响应内容:返回fail,正是点击失败的返回,这一步就是去验证验证码了

{
    "status": "success",
    "data": {
        "result": "fail",
        "msg": []
    }
}

请求参数:除了w,其他参数并无特别

流程分析

以上5次请求,发现235三个步骤中都有w需要处理,目标则为逆向w值。先说结论,实测下来其实23步骤中的w并不校验,本次不分析,着重于分析最后一步提交验证码的w参数分析。

逆向分析w

1. 定位js

先大概看看调用栈,发现都来自于click.3.1.1.js这个文件,那目标明确。


发现有大量这种调用,显然是个混淆。


我的习惯是面对这种混淆,优先看看AST还原一部分,便于调试。

2. AST还原

将js拿出来放到vscode收起来观察,4个大方法,一个自执行方法,并不是传统的OB混淆


尝试拿自执行方法中的某个调用,来本地执行打印,发现没问题能正常出值。整个自执行的方法中包含大量$_CFAn(86)这种类型调用,结合我们本地能执行的情况,也就是说其实跟OB中的解密函数也差不多一个意思,那就好办了。

  1. 将unicode编码还原字符串
  2. 将解密函数调用还原
  3. 移除无用代码(基于能正常调试了,这一步我没做)
3. debug调试

将还原后的js本地替换浏览器js后,直接搜索参数之一client_type可以直接定位到目标,接下来开始繁杂的debug


可以看到w = p + uu = n["$_CDGJ"]()p = w["$_EEn"](h),而h = X["encrypt"](ae["stringify"](o), n["$_CDHy"]())

4. u逆向

那就先看u吧。跟进 n["$_CDGJ"]()看看。


混淆部分在视频中有讲理解,就是赋值新变量+concat+取值,由于我们已经AST处理掉了,这一部分就属于无用代码,后续分析其他方法看到这种直接不用管就是。

得益于解混淆后,直接就能跟到:

var t = new H()["encrypt"](this["$_CDHy"](e));

e是undefined,不用管;

需要再看new H()["encrypt"]this["$_CDHy"](e)。分别往下看

1. this["$_CDHy"](e)


跟进来发现主要逻辑有来自于ve = Q(),继续往下跟:



​        结论:

this["$_CDHy"](e) = e() + e() + e() + e();

function e() {
    return (65536 * (1 + Math["random"]()) | 0)["toString"](16)["substring"](1)
}
2. new H()["encrypt"]

发现这个方法是加在k的原型上的,向上找就能找到var H = function(){}


把整个H拿下来,再把4个方法加上,稍微补一补环境,就能搞定。



跟网站生成的值一对比,发现不一样,其实也正常,这个算法是rsa,非对称加密,也可以用标准库去解决试试,反正这里我已经扣下来js了就这样不管了。

到这里,u已经搞定。

5. p逆向

重头戏来了,这里p的组成比较复杂,需要逆向的值有好几个。


X["encrypt"](ae["stringify"](o), n["$_CDHy"]())

p来自于h,那先解决h。观察n["$_CDHy"]()的值跟上一步一样,其实也就是一个加密key值,流程如下:

  1. 先e() + e() + e() + e()生成一个字符串,作为明文来rsa加密
  2. 接下来的所有需要用到这个明文值的地方,都保持为第一次生成的

所以h的重点在于X["encrypt"](ae["stringify"](o)以及o是什么,那就一个个来,先看o

1. o

o的组成很复杂,有这么多东西

a:其实是点击的坐标,但经过处理

ep:看起来像轨迹和环境

h9s9:可能要逆向

lang、pic:固定或者之前能取到

rp、tt:不知道含义,要逆向

2. ae["stringify"]

其实就是JSON.stringify,直接改写就好

3. X["encrypt"]

跟进去看看,跟之前u的 var H = function(){} 一样,直接把整个var X = function(){} 拿出来。这里先不贴图,先往下解决再一起看


到此,h就搞定了,接下来看看p的逻辑。

本质上是调用的this["$_ECS"](e)



$_ECS是属于w = {},把整个w拿下来,再把之前var X = function(){}拿下来,最终js如下:

运行后与网站生成的对比,值一致

到此,p也搞定。但o中还有好几个参数没处理,继续逆他,累鼠了{:301_972:} {:301_972:}

多提一嘴其实这里是aes加密,不过我试过用标准库来解,发现解后的数组跟网站的值对不上,就索性直接扣了,应该是漏了啥,本人对密码学属实不了解

6. o逆向

o有以下字段,实际需要逆向的是a,rp,tt,其他的固定即可,不校验,不过其实也可以跟,大概说下我的理解:

a:点击坐标,要特殊处理

ep:鼠标移动的全部轨迹,还有一些浏览器事件的环境

h9s9:看其他大佬描述为每天变化的值,实际测下来这个值好几天没变了,固定即可

passtime:点击耗时,随机就行

rp、tt:含义未知,逆他就完事

1. a

先看看a吧。在w的位置向上看,定位到a的逻辑,发现是参数过来的,那就下断再往前的栈跟


向前跟一个栈就能看到a其实来自于n["$_BJGs"]["$_EJC"](),继续向前跟。


发现其实来自于e["$_CEFZ"]

​                搜一下"$_CEFZ",发现又来自于t,t在上一个栈,再跟


跟到这里了,下断点刷新在跟


如下分析下:


那就好办了,a的逻辑是这样:

var x1 = Math["round"](100 * Number(x));
var y1 = Math["round"](100 * Number(y));
var a = x1 + '_' + y1
2. tt

​                tt方法传参3个,s = n["$_BHIA"]["$_BGBn"]()r["c"], r["s"]来自于接口返回,至于s的逻辑就自己跟下好了,跟之前流程一样的

3. rp

rp就是r["gt"] + r["challenge"] + o["passtime"]做个md5,可以扣也可以库还原

到这里,所有参数全部搞定,至于o.ep等之类的,网站自己抓一个写死即可。

验证

没毛病

免费评分

参与人数 6威望 +2 吾爱币 +104 热心值 +5 收起 理由
gouzi123 + 1 + 1 谢谢@Thanks!
笙若 + 1 + 1 谢谢@Thanks!
happykeke + 1 + 1 谢谢@Thanks!
wzh103103 + 1 热心回复!
zzbk5269 + 1 用心讨论,共获提升!
涛之雨 + 2 + 100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
chboy 发表于 2025-3-23 12:46
你写的文章,markdown的格式都没弄对。
3#
ch3n4y 发表于 2025-3-26 10:59
h9s9感觉是钓鱼参数,虽然能验证成功,但后期可能被标记黑产。

bc92a402edf5784190879b625d8f81d.png (330.75 KB, 下载次数: 7)

bc92a402edf5784190879b625d8f81d.png
4#
 楼主| ShriyGo 发表于 2025-3-26 14:02 |楼主
ch3n4y 发表于 2025-3-26 10:59
h9s9感觉是钓鱼参数,虽然能验证成功,但后期可能被标记黑产。

吓人 我没深入分析了,主要练练手学习学习
5#
MytokenKing 发表于 2025-3-27 09:42
适合新手  感谢
6#
chathack 发表于 2025-3-27 11:28
很详细的分析  ,先学习,希望多出基础教程啊
7#
Jinmu2001 发表于 2025-3-27 13:45
有店难啊
8#
 楼主| ShriyGo 发表于 2025-3-27 15:36 |楼主

还好 耐心点能分析出来。不过实际应用应该还不够
9#
yujianlixi 发表于 2025-3-29 13:07
chboy 发表于 2025-3-23 12:46
你写的文章,markdown的格式都没弄对。

看的头皮麻了
10#
Knm 发表于 2025-3-30 11:51
感谢大佬分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-4-15 00:34

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表