咋了,你遇到无限debugger了?
免责声明
本文技术内容仅供学习研究之用,转载请说明出处,如有侵权联系删除。作者不保证信息完全准确,不对因使用本文导致的任何损失负责。读者应自行承担使用风险,并遵守相关法律法规。
多种方法绕过无限debugger
- 永不在此处暂停
- 本地替换
- hook(控制台注入)
- 扩展注入
本文只讲第4种方法 - 扩展注入法
,当然需要读者有一定的基础
实现要求和思路
要求
- 应该是最先注入,抢占先机
- 应该是注入到
top
的iframe
,而不单单是扩展的iframe
- 可以监控
iframe
变化,如果有新的iframe
立即注入- 注入的代码可以拦截大部分
debugger
操作
思路
网站实现debugger
的方法无非就是
- 直接在
script
标签就有debugger
- 通过
Function.prototype.constructor
- 通过
eval
- 其他方法,不一一列举
实现
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.html
和background.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