【反爬虫】极验4 W参数逆向分析

声明
本文只讲快速定位 跟栈过程 不提供完整代码 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关

逆向分析


验证接口当中 主要参数为W 其余参数在请求验证码时返回 W明文如下

python 复制代码
{"passtime":3151,"userresponse":[2,2],"device_id":"","lot_number":"ed912d7b613d457784a0e0a183c2a128","pow_msg":"1|14|sha256|2026-04-14T09:14:53.636482+08:00|08c16c99330a5a1d6b7f4371bbd5a978|ed912d7b613d457784a0e0a183c2a128||99f6d6260560cb6f","pow_sign":"000097ffb9d37b0d88115d9eba712e73e5f89b01e27ed8ba3a19b439f8715a58","geetest":"captcha","lang":"zh","ep":"123","biht":"1426265548","yDWL":"hZGx","c2a14577":{"84a0e0a1":"7b61"},"em":{"ph":0,"cp":0,"ek":"11","wd":1,"nt":0,"si":0,"sc":0}}

其中userresponse会根据验证码类型的不同而不同,其中就是识别结果

快速定位

找到4代的JS代码 script断点或者直接根据请求的堆栈跟 很容易找到 名字叫做gcaptcha4.js的代码 直接全局搜索 symmetrical 或者 asymmetric

这就是加密的位置可以直接在这个function里打断点,粗略看一下 猜测2应该是个aes 1是个什么暂时不知道 断点直接打到return

可以看到是两段拼接的 第一段如下图

第二段

粗略看一下代码逻辑 第一段是一个AES加密 直接鼠标放到第一步搜索出来那里就会显示 模式为CBC 偏移量固定值"0000000000000000" 密钥n 是前面生成的 一会再弄

这里要注意一下 return (0, _ᖈᖂᕸᕴ[_ᕸᕿᕸᖉ(161)])(u) + _ }

采用的是16进制编码 不能直接tostring

第一段 可以其实是一个rsa 只不过公钥直接搜索不到 使用模数n和指数e的十六进制字符串 生成公钥或者直接使用

python 复制代码
function get__(plainText) {
    const nHex = '00C1E3934D1614465B33053E7F48EE4EC87B14B95EF88947713D25EECBFF7E74C7977D02DC1D9451F79DD5D1C10C29ACB6A9B4D6FB7D0A0279B6719E1772565F09AF627715919221AEF91899CAE08C0D686D748B20A3603BE2318CA6BC2B59706592A9219D0BF05C9F65023A21D2330807252AE0066D59CEEFA5F2748EA80BAB81';
    const eVal = 10001;
    const nBigInt = BigInt('0x' + nHex);
    const nBuffer = Buffer.from(nBigInt.toString(16), 'hex');
    const eBuffer = Buffer.from(eVal.toString(16), 'hex');
    const jwk = {
        kty: 'RSA',
        n: nBuffer.toString('base64url'),
        e: eBuffer.toString('base64url')
    };
    const publicKey = crypto.createPublicKey({key: jwk, format: 'jwk'});
    const message = Buffer.from(plainText, 'utf8');
    const encrypted = crypto.publicEncrypt(
        {
            key: publicKey,
            padding: crypto.constants.RSA_PKCS1_PADDING  // 对应 PKCS1_v1_5
        },
        message
    );
    let hexResult = encrypted.toString('hex');
    if (hexResult.length % 2 !== 0) {
        hexResult = '0' + hexResult;
    }
    return hexResult
}

然后将两段破解的加起来 关于密钥n 往上跟可以看到e() + e() + e() + e() 这样的东西 e函数很简单

相关推荐
许彰午5 小时前
38_Java设计模式之装饰器模式
java·设计模式·装饰器模式
折哥的程序人生 · 物流技术专研5 小时前
Java 23 种设计模式:从踩坑到精通 | 组合模式 —— 树形结构处理,部分与整体一视同仁
java·组合模式·java面试·springsecurity·结构型模式·java设计模式·从踩坑到精通
郝学胜-神的一滴5 小时前
完全二叉树与堆底层原理深度剖析 | 手写C++大顶堆实现
java·开发语言·数据结构·c++·python·算法
农民小飞侠5 小时前
[leetcode] 165. Compare Version Numbers
java·算法·leetcode
饼饼饼5 小时前
React19 新手指南:JSX 没那么难,用好这几条规则就够了
前端·javascript·react.js
砍材农夫5 小时前
物联网实战|Spring Boot + Netty 搭建 MQTT 消息路由与流转层
java·spring boot·后端·物联网·spring
黄毛火烧雪下5 小时前
Java 基础笔记:文件、递归与字符编码
java·开发语言·笔记
学计算机的计算基5 小时前
链表算法上篇:LeetCode 206/234/141/142/160/21 题解与易错点
java·笔记·算法·链表
丷丩5 小时前
MapLibre GL JS第50课:用表达式创建虚线渐变线
javascript·gis·mapbox·maplibre gl js
信也科技布道师5 小时前
从Istio 503 NC 错误深入理解 Mesh 路由全链路原理
java·服务器·网络