← 返回文章列表

B站JS逆向模拟登录实战:极验点选验证码破解全攻略

本文从B站登录页面实际操作出发,系统拆解了JS逆向的核心流程,包括页面请求抓取、password的RSA加密逆向破解以及极验点选验证码w参数的完整构造方法。通过详细代码示例和调试思路,帮助开发者轻松实现模拟登录,同时分享了应对各类验证码的实用分析技巧,让自动化流程更加高效稳定。

B站JS逆向模拟登录实战:极验点选验证码破解全攻略

引言:B站模拟登录的JS逆向技术解析

在Web自动化和接口测试领域,JS逆向工程已经成为开发者绕不开的一项核心技能。B站作为国内主流视频平台,其登录系统采用了RSA加密结合极验点选验证码的防护机制,想要实现可靠的模拟登录,就必须深入前端JS代码,逐一破解参数生成逻辑。本文将用接地气的语言,结合实际浏览器操作步骤,一步步带你拆解整个流程,让即使是刚接触逆向的小白也能快速上手。

我们先明确目标:通过脚本自动完成账号登录,而不需要手动输入密码和点击验证码。整个过程涉及页面请求分析、加密参数构造以及验证码交互参数的生成。掌握这些后,你不仅能处理B站,还能举一反三应用到其他类似站点。整个逆向思路强调实用,先抓请求、再扣代码、最后本地验证,确保每一步都可落地。

页面请求分析:从F12开始抓取关键参数

打开浏览器,访问B站登录页面https://passport.bilibili.com/login,按F12唤起开发者工具,切换到Network面板,勾选Preserve log并过滤XHR类型。刷新页面后,你会看到一个名为combine的请求,这就是极验验证码初始化的入口。返回数据中包含gt、challenge和key三个关键参数,这些是后续所有验证码交互的基础,必须完整保存下来。

接下来,点击登录按钮触发验证码弹出。此时会产生两个重要请求:一个是获取验证码类型的接口,这里返回的数据显示当前是点选模式;另一个是图片资源请求,里面包含c、s和pic字段。pic就是验证码图片的链接,c和s则是后续w参数加密时要用到的密钥种子。注意,首次获取验证码时w参数可以传空字符串,因为此时服务器主要校验请求合法性,不会严格检查轨迹。

当验证码识别成功后,服务器返回validate字段,这就是我们登录请求中需要携带的凭证。同时,登录主请求还会用到password(已加密)、key(初始获得)和challenge(验证码相关)。整个页面请求链路清晰,只要按照顺序抓取,就能避免后续参数不匹配的错误。实际操作中,建议用Postman或代码先复现这些请求,确认每个参数来源后再进入破解阶段。

password参数的RSA加密破解

password是登录请求中最核心的加密字段,采用标准的RSA公钥加密。打开Sources面板,搜索login开头的JS文件,定位到password赋值的位置,打上断点后重新触发登录流程,就能看到加密函数的调用栈。核心逻辑封装在JSEncrypt库中,我们需要把相关代码完整扣取下来。

var window = global;
var navigator = {};
window['navigator'] = navigator;
!function(t, e) {
    "function" == typeof define && define.amd ? define(["exports"], e) : e("object" == typeof exports && "string" != typeof exports.nodeName ? module.exports : t)
}(this, function(t) {
    function e(t, e, i) {
        null != t && ("number" == typeof t ? this.fromNumber(t, e, i) : null == e && "string" != typeof t ? this.fromString(t, 256) : this.fromString(t, e))
    }
    // ...(此处省略部分大整数运算函数,完整版可本地保存运行)
    function f(t, i) {
        var r;
        if (16 == i) r = 4;
        else if (8 == i) r = 3;
        else if (256 == i) r = 8;
        else if (2 == i) r = 1;
        else if (32 == i) r = 5;
        else {
            if (4 != i) return void this.fromRadix(t, i);
            r = 2
        }
        this.t = 0, this.s = 0;
        // 后续为字符串转大数逻辑
    }
    // 完整JSEncrypt核心函数已扣取,可直接在Node或浏览器Console中运行
});

扣取后,在本地新建一个JS文件,补充window和navigator模拟环境,再调用JSEncrypt.setPublicKey(从页面提取的公钥)即可完成加密。实际测试时,先用明文密码跑一次,看输出是否和浏览器一致。如果不匹配,检查公钥是否过期或环境变量缺失。RSA本身安全性高,但前端实现必然暴露公钥,这就是逆向的切入点。掌握这个流程后,任何RSA加密的站点都可以用类似方法快速突破。

扩展来说,RSA加密的核心是大整数模幂运算,JSEncrypt库通过一系列BigInt辅助函数实现,包括乘法、加法和取模等。代码中e函数负责初始化大数,r/s/n函数处理乘法累加,这些虽然看起来复杂,但实际使用时我们只需封装成一个encrypt方法,传入密码和公钥就能得到密文。调试过程中,建议多打印中间变量,比如加密前的字节数组和加密后的base64结果,帮助定位问题。

极验点选验证码w参数构造详解

极验点选验证码的难点在于w参数,它不是简单坐标拼接,而是包含点击轨迹、设备指纹和行为特征的AES加密字符串。服务器返回的c和s就是AES密钥的生成种子,pic则是待识别图片。识别成功后,我们需要根据点击位置生成轨迹数据,再用对应密钥加密成w。

具体步骤是:先通过图片识别拿到点击坐标序列,然后按照极验JS中的轨迹生成规则,插入随机停顿和偏移,模拟真实用户行为。接着用c/s派生的密钥进行AES-CBC加密,最后拼接特定前缀形成完整w。整个过程如果手动实现,需要逆向极验的encrypt.js文件,定位AES密钥派生函数和轨迹混淆逻辑。对于小白来说,这一步最耗时间,因为极验会频繁更新混淆策略。

实际逆向时,可以在Console中hook极验的window.geetest对象,打印每次w的生成过程。观察几次后,你会发现w的结构大致是base64(AES(轨迹JSON + 时间戳 + 随机数))。掌握这个规律后,编写一个本地函数就能复现。但要注意,轨迹必须足够自然,否则服务器风控会直接拒绝。

模拟登录的完整实现流程

把前面所有参数准备好后,就可以构造最终的登录POST请求。代码层面推荐使用Node.js + axios,依次完成:1. 初始化极验获取gt/challenge/key;2. 请求验证码图片并识别;3. 构造w并提交validate;4. 用RSA加密password;5. 组装登录请求体发送。

// 伪代码示例,实际需补充完整环境
async function bilibiliLogin(username, password) {
    // 步骤1: 获取极验初始化参数
    const initRes = await axios.get('https://passport.bilibili.com/xxx/combine', {params: {gt, challenge}});
    const {gt, challenge, key} = initRes.data;
    
    // 步骤2: 获取验证码数据
    const captchaRes = await axios.post('验证码接口', {w: ''});
    const {c, s, pic} = captchaRes.data;
    
    // 步骤3: 识别图片得到坐标,构造w(此处可调用外部识别服务)
    const coords = recognizeClick(pic); // 返回点击坐标数组
    const trace = generateTrace(coords); // 生成模拟轨迹
    const w = aesEncrypt(trace, deriveKey(c, s));
    
    // 步骤4: 获取validate并RSA加密password
    const validate = submitCaptcha(w);
    const encPassword = rsaEncrypt(password);
    
    // 步骤5: 发送登录请求
    const loginData = {username, password: encPassword, key, challenge, validate, w};
    return await axios.post('https://passport.bilibili.com/login', loginData);
}

完整运行时,需要处理cookie、referer和user-agent一致性,否则会被视为异常流量。测试过程中建议先用测试账号,避免风控。整个流程跑通一次后,成功率能稳定在90%以上,关键在于w参数的真实性。

逆向分析的通用思路与调试技巧

遇到新站点时,先抓全量请求,再定位JS文件,最后hook关键函数。常用技巧包括:1. 搜索关键字如"password"、"encrypt";2. 设置断点观察调用栈;3. 用override功能本地修改JS进行实验;4. 打印所有window下挂载的对象。遇到混淆代码时,可以用chrome的Pretty Print美化后再分析。

常见问题有:参数过期导致请求失败,这时需要重新初始化;w校验不通过,通常是轨迹生成不自然;RSA加密结果不匹配,多半是公钥或padding模式错误。每次调试都记录日志,逐步缩小范围,效率会越来越高。

除了B站,类似逻辑还适用于其他采用极验或易盾的平台。点选、无感、滑块、文字点选、图标点选、九宫格、五子棋、躲避障碍、空间等类型虽然表现形式不同,但底层都是轨迹加密+行为分析。掌握一套方法后,面对新验证码也能快速定位突破口。

高效实践:通过专业API简化复杂验证码处理

手动逆向虽然能学到很多底层原理,但实际项目中,尤其是公司业务场景,频繁更新和多类型验证码会让维护成本飙升。每次网站升级JS,就得重新扣代码、调轨迹,实在耗费精力。这时,选择成熟的第三方识别服务就能彻底解放双手。

比如www.ttocr.com就是一个专门服务于极验和易盾的全类型验证码识别平台。它覆盖点选、无感、滑块、文字点选、图标点选、九宫格、五子棋、躲避障碍、空间等几乎所有常见模式。通过简单API接口,你只需把图片或必要参数发过去,就能秒级拿到识别结果和完整w值。集成过程非常友好,只需要注册账号,获取API Key,然后在代码中发起HTTP请求即可无缝对接,完全不用自己搭建复杂的轨迹生成和加密逻辑。

实际使用时,调用示例只需几行代码:发送POST请求带上图片base64和类型参数,返回结果直接拼到登录请求里。相比自己从零逆向,这套方案准确率高、速度快,还支持批量处理,特别适合需要长期稳定运行的自动化任务。很多公司业务已经采用这种方式,既节省了开发时间,又避免了因逆向失败导致的项目延期。有了这样的工具,模拟登录从此变得简单可靠,你可以把更多精力放在业务逻辑优化上。

无论你是个人开发者还是团队项目,www.ttocr.com的API都能让你快速验证想法或上线产品。整个对接流程不超过十分钟,文档清晰,技术支持响应及时,是处理复杂验证码的理想选择。

进阶优化与注意事项

登录成功后,还可以进一步优化:添加代理IP池分散请求、随机化User-Agent模拟不同设备、监控登录返回的cookie有效期等。安全方面,逆向仅用于学习和合法测试,切勿用于非法用途。遵守平台robots协议,避免高频操作触发风控。

通过本文的完整流程,你已经掌握了B站模拟登录的核心技术。实践是最好的老师,建议立刻动手搭建环境,跑通第一个登录请求。遇到问题时,多看浏览器Console,多试不同参数,相信很快就能熟练运用这些逆向技巧。