我的反调试代码在真机测试时总被绕过怎么办?

萌新.彤彤 阅读 43

我在开发电商H5页面时想加反调试功能,写了检查navigator.webdriver和debugger事件监听的代码,但用Xposed模块启动APP后还是能正常调试我的JS。尝试过检测USB调试状态:navigator.userAgent也没法准确判断。有大佬遇到过类似问题吗?

之前试过这种检测方法:


function antiDebug() {
  if (window.navigator.webdriver || 
      /debugger/.test(window.location.href)) {
    alert('检测到调试行为!');
  }
}

但用腾讯Bugly的真机平台测试时,弹窗根本没触发,明明打开了开发者工具啊…是不是还需要结合原生层检测?

我来解答 赞 4 收藏
二维码
手机扫码查看
2 条解答
程序员朱莉
试试看结合定时器检测控制台方法被覆盖的情况,比如用setInterval检查console.log.toString()是否包含[native code],另外用new Function('debugger')创建调试断点,配合原生WebView的onJsPrompt拦截调试信号。
点赞 10
2026-02-06 23:06
宇文树甜
反调试这玩意儿确实头疼,我之前也碰到过类似问题。单靠前端 JS 的检测手段太容易被绕过了,特别是用 Xposed 这种框架,基本可以 hook 任意变量。

你可以尝试下面几个方向加强检测:

### 1. 多种检测方式叠加
不要只依赖 navigator.webdriver 或 URL 中的关键词,可以多加几个检测点,比如:

function checkDebug() {
const devTools = /Android/.test(navigator.userAgent) && /Chrome/.test(navigator.userAgent) ? true : false;
const isInspectable = (function () {
try {
return /./.toString.call(window.location).indexOf('native code') !== -1;
} catch (e) {
return false;
}
})();

if (window.navigator.webdriver || devTools || isInspectable) {
alert('检测到调试行为!');
return;
}
}


### 2. 使用定时器循环检测
调试器加载是有延迟的,你可以用定时器一直检测:

setInterval(() => {
// 上面的检测函数放这里
}, 1000);


### 3. 结合原生层判断
如果你的 H5 是嵌在 APP 里,可以让原生层注入一个标识,比如在 WebView 初始化时加一个自定义 header 或全局变量:

window.isFromApp = true;


然后再配合 JS 检测:

if (typeof window.isFromApp === 'undefined') {
alert('检测到异常环境!');
}


### 4. 使用混淆和加密
把你的检测函数名、变量名混淆掉,防止被轻易 hook。还可以用 eval、Function 构造器等动态执行代码,增加逆向成本。

### 5. 崩溃检测(比较狠的办法)
可以在关键逻辑里插入 debugger,然后监听 console 方法是否被覆盖,如果发现 console 被代理了,就直接抛错或退出。

### 最后吐槽一句
反调试这东西,其实永远防不住高级玩家,只能提高门槛。重点逻辑还是得靠后端兜底,前端只是辅助。别像我一样死磕半天最后发现别人改几行 native 代码就绕过了 😂

试试上面这些方法组合起来用,应该能抗住大部分情况了。有问题再问我。
点赞 5
2026-02-03 23:04