反调试
实现防止他人调试、动态分析自己的代码
检测调试方法
- 无限Debugger技术
- 键盘监听(F12)
- 检测浏览器的高度插值
- 检测开发者人员工具变量是否为true
- 利用console.log调用次数
- 利用代码运行的时间差
- 利用toString
- 检测非浏览器
案例
站点带有反调试,无法使用F12和右键,否则就卡住不动了

绕过技巧:
前三种方法较为简单,但实用性不高
禁用所有断点
可用性最高,但是最大缺点是自己也无法断点了

禁用局部断点
不执行局部语句
案例:https://antispider8.scrape.center/



设置条件断点
与禁用局部断点差不多


都修改条件为false后,其他部分便可正常断点
替换文件执行(修改文件重定向)
最常使用,最实用
js是前端语言,运行在用户的浏览器上,可以找到反调试代码,将涉及到的js文件进行替换
案例1




案例2
https://www.aqistudy.cn/html/city_realtime.php
这个网站使用的检测调试方法有:无限Debugger技术,键盘监听(F12)
也就是右键,F12都无法使用,并且会一直debug

强行多次尝试,打开F12

找不到可能是因为资源没有刷新完全,或者字符被编码了



做完操作后,发现还是不能进行调试,判断出没有删除干净
这里是由于在某php文件中存在加密编码内容

使用控制台看看是什么东西

代码是反调试操作,所以可以尝试替换删除

通过Burp修改匹配(流量到burp修改返回)
类似于自动替换文件执行
burpsuite -> 代理 -> 代理设置 ->响应替换规则
替换尽量置空,否则可能会报错造成网页无法正常运行

注意:必须保证js文件都加载完了
ctrl+F5强制刷新,获取到所有的js相关文件,防止缓存等问题


油管猴插件配合HOOK(插件对浏览器执行JS删除)
插件:油猴/篡改猴/tampermonkey

案例:https://jishulink.com/video/c246316

// ==UserScript==
// @name New Userscript
// @namespace http://tampermonkey.net/
// @version 2025-01-12
// @description 监控Function构造函数调用,并拦截包含'debugger'语句的函数定义,替换为日志记录
// @author xiaodisec
// @match https://jishulink.com/video/c246316
// @icon https://www.google.com/s2/favicons?sz=64&domain=jishulink.com
// @grant none
// ==/UserScript==
// 立即执行函数表达式,返回一个清理函数,用于在必要时恢复Function.prototype.constructor
const cleanup = (function () {
'use strict';
// 保存原始的Function构造函数
const originalConstructor = Function.prototype.constructor;
// 检查Function.prototype.constructor是否可写
if (typeof Object.getOwnPropertyDescriptor(Function.prototype, 'constructor').writable === 'boolean' &&!Object.getOwnPropertyDescriptor(Function.prototype, 'constructor').writable) {
console.error('Function.prototype.constructor is not writable. Cannot hook the constructor.');
return function () {};
}
// 重写Function构造函数
Function.prototype.constructor = function (...args) {
console.log(`Function constructor called on page ${location.href} with arguments:`, args);
if (args.length && args[0].includes("debugger")) {
console.warn(`Attempt to use 'debugger' in Function constructor intercepted on page ${location.href}!`);
args[0] = args[0].replace(/debugger/g, "console.log('debugger intercepted');");
// 这里需要返回一个函数实例,而不是直接返回,否则会导致函数定义失败
return originalConstructor.apply(this, args);
}
return originalConstructor.apply(this, args);
};
console.log("Function.prototype.constructor is now hooked!");
// 返回清理函数,用于恢复原始的Function构造函数
return function () {
Function.prototype.constructor = originalConstructor;
console.log("Function.prototype.constructor has been restored.");
};
})();
// 在脚本卸载或页面卸载时调用清理函数
window.addEventListener('unload', function () {
cleanup();
});
其中@match表示作用的域名
当使用油猴配置如上hook脚本后

本节知识点
JS逆向-反调试检测&方法
JS逆向-反调试案例&绕过
