sasaffcxzc 2026-02-09 12:51 采纳率: 74.2%
浏览 7

网页调试如何解决这种无限debug(语言-javascript)

调试地址

这是一个音频地址,F12抓包之后就会无限出现反调试,简单的反调试我倒是能应对,但是这个不简单。

我主要想抓到他获取音频有个请求 sc 和st的传递的值是什么,其实加密算法已经用AI找出来了,但是由于JS文件使用jsjiami.com.v7 严重混淆,实在是不知道 加密成sp值钱传递了什么值。

至于sc的值是html源码动态生成倒是好找。

说明一下我尝试了哪些办法。

他的主要加密文件 mian.js 但是每次刷新他都会重生生成一个main.js?d1770612284,后面数字会随机更换,导致js替换无法生效,然后用Resource Override 倒是替换生效了,但是最终的音频请求没有加载出来,捣鼓了几天一直没捣鼓明白。

主要在学习这个调试之类的实战,倒不是真想抓这个网站,但是这个算法我解决不了心理总觉得不得劲那种,不知道你们明白明白这种心理。

我感觉我直接过了这种 无限生成 main.js文件 + jsjiami.com.v7 混淆, 心情都好一办,以后在遇到那就简单了
我就想知道这种如何断点

我看好像无法猫腻提问了,成功解决问题并采纳,我打赏二十,如果觉得难度大可再加

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2026-02-09 12:52
    关注

    中午好🌞🌞🌞
    本答案参考通义千问

    你描述的这个问题非常典型,尤其是在反调试JS混淆(如 jsjiami.com.v7)的场景下,确实会让人感到非常棘手。不过,我完全理解你的“心理不得劲”的感觉,这种挑战正是我们提升调试和逆向能力的好机会。


    ✅ 一、问题总结

    你遇到的核心问题是:

    1. main.js 每次刷新都会生成一个新的文件名(例如:main.js?d1770612284),导致常规的资源替换失效。
    2. JS 文件使用了 jsjiami.com.v7 的高级混淆技术,使得代码难以阅读和分析。
    3. 音频请求中的 scst 参数需要解密,虽然加密算法已知,但无法确定实际传递的值。
    4. 尝试用 Resource Override 替换 main.js 后,音频请求仍未加载成功,说明可能还有其他隐藏逻辑或动态生成内容。

    ✅ 二、解决方案详解

    1. 解决 main.js 动态生成的问题

    ✅ 方法一:使用浏览器开发者工具的 "Sources" 面板 + 拦截请求

    • 打开 F12,进入 Network 面板,勾选 "Preserve log"
    • Sources 面板中,找到 main.js 的请求,点击它,进入源码视图。
    • 不要刷新页面,直接在 Sources 面板中进行调试,避免重新加载新的 main.js。

    重点:不要刷新页面!否则新生成的 main.js 会覆盖旧的,导致调试中断。

    ✅ 方法二:使用 Chrome 插件Proxy 工具 拦截并缓存 main.js

    • 使用 FiddlerCharles Proxy 拦截请求,将 main.js 的响应保存为本地文件。
    • 修改响应头,让浏览器始终从本地读取该文件,而不是每次请求新的。

    ✅ 方法三:使用 JavaScript Hooking 技术

    • 利用 Chrome DevTools 的 "Break on all exceptions""Break on function call" 来捕获 JS 加载过程。
    • 使用 evalFunction 等函数的 hook,拦截 JS 执行流程。

    2. 处理 jsjiami.com.v7 混淆

    ✅ 方法一:使用 Deobfuscator 工具

    • 有些工具可以自动去混淆 jsjiami 的代码,比如:
    • main.js 的内容复制到这些工具中,看看是否能还原部分可读代码。

    ✅ 方法二:手动分析关键函数

    • 虽然代码被混淆,但你可以通过以下方式识别关键函数:
      • 查找与 scst 相关的变量名(如 a1, b2, c3 等)。
      • 使用 console.log() 注入到关键函数中,查看参数值。
      • 使用 debugger; 停止执行,观察当前上下文中的变量值。

    ✅ 方法三:使用 AST 解析器(如 Babel)

    • 使用 BabelEsprima 解析 JS 代码,生成更清晰的 AST 结构,有助于理解逻辑。

    3. 获取 sc 和 st 的值

    ✅ 方法一:使用 断点调试

    • 在音频请求发送前设置断点,查看 scst 的赋值逻辑。
    • 在 DevTools 中打开 Sources > Network,找到音频请求,点击它,在右侧的 Headers 中查看请求参数。
    • Sources 面板中,查找 fetchXMLHttpRequest 的调用位置,设置断点。

    ✅ 方法二:注入日志输出

    • 在 DevTools 控制台中运行以下代码,强制打印出 sc 和 st 的值:
    (function() {
        var origOpen = XMLHttpRequest.prototype.open;
        XMLHttpRequest.prototype.open = function() {
            console.log('Request URL:', arguments[1]);
            console.log('Request Headers:', arguments[2]);
            return origOpen.apply(this, arguments);
        };
    })();
    

    重点:此方法可以在不修改源码的情况下,监控所有 XHR 请求。

    ✅ 方法三:使用 Hook 函数

    • 如果 scst 是通过某个函数生成的,可以通过 hook 该函数来获取值:
    (function() {
        var originalFunction = window.someFunctionName;
        window.someFunctionName = function() {
            console.log('Generated sc and st:', arguments);
            return originalFunction.apply(this, arguments);
        };
    })();
    

    4. 音频请求未加载的原因分析

    ✅ 可能原因:

    • main.js 未正确加载或替换:即使你替换了 main.js,如果其依赖的其他文件也未加载,可能导致后续逻辑失败。
    • 动态生成的请求地址:某些网站会动态生成音频地址,需要通过 JS 生成后再发起请求。
    • 请求头缺失或错误:某些网站会检查请求头(如 User-AgentReferer)等信息,若缺失会导致请求失败。

    ✅ 解决方案:

    • 使用 Postmancurl 模拟请求,看是否能成功获取音频。
    • 检查请求头是否完整,包括 CookieRefererX-Requested-With 等。
    • 使用 Mock Server 拦截请求,模拟返回正确的音频数据。

    ✅ 三、示例代码:hook XHR 请求并打印 sc/st

    (function () {
        var origOpen = XMLHttpRequest.prototype.open;
        XMLHttpRequest.prototype.open = function (method, url, async, user, password) {
            this.addEventListener('load', function () {
                console.log('XHR Response:', this.responseText);
                if (url.includes('audio')) {
                    console.log('Audio request response:', this.responseText);
                }
            });
            origOpen.call(this, method, url, async, user, password);
        };
    
        // 如果有 fetch 请求
        var origFetch = window.fetch;
        window.fetch = function () {
            return origFetch.apply(this, arguments).then(function (response) {
                response.clone().text().then(function (text) {
                    console.log('Fetch response:', text);
                    if (text.includes('audio')) {
                        console.log('Audio Fetch response:', text);
                    }
                });
                return response;
            });
        };
    })();
    

    ✅ 四、总结与建议

    | 问题 | 解决方法 | |------|----------| | main.js 每次刷新都变名 | 不要刷新页面,使用 Sources 面板调试;或使用 Proxy 工具缓存 | | JS 混淆严重 | 使用 Deobfuscator 工具、AST 分析、手动 hook 关键函数 | | sc/st 值获取困难 | 设置断点、注入日志、hook 函数、监听 XHR/Fetch | | 音频请求未加载 | 检查请求头、模拟请求、确保 main.js 正确加载 |


    ✅ 五、心理建议

    你提到“心理不得劲”,其实这是很多程序员在面对复杂反调试时的正常反应。这不是失败,而是成长的机会

    记住:每一次调试都是对 JavaScript 运行机制的深入理解。

    如果你愿意,我可以帮你一起逐步破解这个案例,甚至写出完整的脚本,帮你抓到 sc 和 st 的值。


    如果你愿意,我们可以继续一步一步来,我会陪你完成这个挑战。你不是一个人在战斗 😄

    评论

报告相同问题?

问题事件

  • 修改了问题 2月9日
  • 创建了问题 2月9日