咋了,你遇到无限debugger了?


免责声明
本文技术内容仅供学习研究之用,转载请说明出处,如有侵权联系删除。作者不保证信息完全准确,不对因使用本文导致的任何损失负责。读者应自行承担使用风险,并遵守相关法律法规。

多种方法绕过无限debugger

  1. 永不在此处暂停
  2. 本地替换
  3. hook(控制台注入)
  4. 扩展注入

本文只讲第4种方法 - 扩展注入法,当然需要读者有一定的基础

实现要求和思路

要求

  1. 应该是最先注入,抢占先机
  2. 应该是注入到topiframe,而不单单是扩展的iframe
  3. 可以监控iframe变化,如果有新的iframe立即注入
  4. 注入的代码可以拦截大部分debugger操作

思路

网站实现debugger的方法无非就是

  1. 直接在script标签就有debugger
  2. 通过Function.prototype.constructor
  3. 通过eval
  4. 其他方法,不一一列举

实现

hook函数

hook eval函数
hook Function.prototype.constructor函数
这里需要强调一下,由于我们用的是扩展法,网页一开始就会立即执行,如果我们还用覆盖原来的方法来hook的话,可能会有一些错误,例如:

const ori_eval = eval;
eval = function eval(...arg) {
   console.log(arg);
   return ori_eval(arg);
}

但是如果网页的代码突然要检测eval的原型链之类的不就炸了?当然只是打个比方哈哈,道理类似
所以我们要换个思路,用Proxy嘛,代码检测不出来还安全。
然后就可以:

function removeDebugger(str) {
    return str.replace(/(d|D)(e|E)(b|B)(u|U)(g|G){2}(e|E)(r|R)/g, '');
}

const originaleval = eval;
Object.defineProperty(window, 'eval', {
    value: new Proxy(originaleval, {
        apply(target, thisArg, argumentsList) {
            for (var i = 0; i < argumentsList.length; i++) {
                argumentsList[i] = removeDebugger(argumentsList[i]);
            }
            return Reflect.apply(target, thisArg, argumentsList);
        },
    }),
    enumerable: 1,
})

在这只是举个例子,其他的可以举一反三。

扩展实现

扩展框架

|–manifest.json
|–content-script.js
|–background.js
|–popup.html

其中popup.htmlbackground.js内容可为空

manifest.json
{
    "manifest_version": 3,
    "name": "自定义脚本扩展",
    "version": "1.0",
    "description": "在网页加载时注入自定义脚本",
    "permissions": [
        "scripting",
        "activeTab"
    ],
    "host_permissions": [
        "<all_urls>"
    ],
    "background": {
        "service_worker": "background.js"
    },
    "content_scripts": [
        {
            "matches": [
                "<all_urls>"
            ],
            "js": [
                "content-script.js"
            ],
            "run_at": "document_start",
            "all_frames":true,
            "world":"MAIN"
        }
    ],
    "action": {
        "default_popup": "popup.html"
    }
}
content-script.js

为了过审,在这就不贴了,想要的老铁加微发送hook扩展就可获取源码,在文末。

验证

我已经测试过了,可以过绝大部分网站。
贴个图:
在这里插入图片描述

总结

本文讲了如何用扩展的方法绕过无线debugger
本文仅用于学习交流,勿他用。
祝大家学习愉快 ☺️
python&爬虫逆向交流群:dzEzMDg3MDk4NTU5

### 关于无限调试器 (Infinite Debugger) #### 定义与特性 无限调试器并不是一个标准术语,在常规的软件开发和逆向工程领域中通常指的是能够持续稳定运行而不易崩溃或终止的调试工具。这类调试器可以长时间挂起目标进程,允许开发者反复设置断点、单步执行指令以及查看内存状态等操作[^1]。 #### 实现机制分析 为了构建一个稳定的无限调试器,核心在于处理好以下几个方面: - **异常捕获**:当被调试程序触发特定事件(如访问违例)时,操作系统会通知调试器;此时需确保调试器能正确响应这些信号而不会意外退出。 - **资源管理**:合理分配CPU时间片给调试者界面与目标应用程序之间,防止因过度占用而导致系统性能下降甚至死锁现象发生。 - **稳定性增强措施**:通过优化内部逻辑结构减少潜在错误源,并加入必要的容错设计来应对不可预见的情况。 对于Windows平台而言,`Debug API`提供了创建和控制子进程所需的一系列接口函数,例如`CreateProcess()`用于启动待测项目的同时开启跟踪模式,之后可通过监听各类调试事件来进行交互式排查工作[^5]。 然而值得注意的是,实际应用过程中可能会遇到诸如权限不足等问题阻碍正常运作流程。因此建议使用者充分阅读官方文档并参照成功案例调整参数配置直至达到理想效果[^4]。 ```cpp // 创建带调试属性的新进程实例 BOOL CreateDebuggedProcess(LPCSTR lpApplicationName){ STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); // 启动带有DEBUG_ONLY_THIS_PROCESS标志位标记的目标exe文件 if(!CreateProcess(lpApplicationName,NULL,NULL,NULL,FALSE, DEBUG_ONLY_THIS_PROCESS|CREATE_NEW_CONSOLE, NULL,NULL,&si,&pi)){ printf("Failed (%d)\n", GetLastError()); return false; } return true; } ``` 上述代码片段展示了如何基于WinAPI建立一个新的可调试环境,其中包含了重要的安全选项设定以保障后续工作的顺利开展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值