代码混淆后的时间检测怎么绕过?

开发者世梅 阅读 14

我在做前端反调试练习,用工具混淆了代码,里面加了时间检测逻辑,一运行就直接跳转或清空页面,根本没法调试。试过在控制台覆盖 Date.now(),但好像没生效。

比如混淆后的代码里有类似这样的判断:

var t1 = Date.now();
// ... 一些操作
if (Date.now() - t1 > 50) {
    window.location.href = 'about:blank';
}

我该怎么绕过这种时间差检测?是不是还有其他隐藏的检测点?

我来解答 赞 5 收藏
二维码
手机扫码查看
1 条解答
シ增梅
シ增梅 Lv1
覆盖 Date.now() 没生效大概率是因为混淆代码在你覆盖之前已经把原方法缓存了,比如 var _now = Date.now 这种写法,你后面怎么改都没用。

几个实用的绕过方案:

第一个方案,用条件断点。找到那段检测代码,在 if 判断那行打个断点,右键选"Never pause here",或者直接在条件表达式里写 false。这样断点命中时你可以手动把跳转逻辑干掉,性能上几乎零开销。

第二个方案,用浏览器的 Overrides 功能。Sources 面板左边有个 Overrides 标签,把混淆的 JS 文件存到本地,把检测逻辑删掉或改成 if(false),刷新页面就会加载你改过的版本。这个方法最彻底。

第三个方案,如果你坚持要 hook 时间函数,得在脚本执行前注入。用 Fiddler 或 Charles 代理,在 HTML 里最前面注入一段:

Date.now = function() { return 0; };
Date.prototype.getTime = function() { return 0; };
performance.now = function() { return 0; };


但说实话这方法有点暴力,可能影响其他正常逻辑。

还有一个隐藏检测点要注意,有些混淆会用 performance.now() 代替 Date.now(),精度更高,你只 hook Date 系列是没用的。另外还有检测 debugger 语句的,会用定时器循环检查,遇到 setInterval 里藏检测逻辑的情况,直接在 Console 里跑 clearInterval 把所有定时器清掉试试。

最省事的还是 Overrides 直接改源码,别跟混淆代码较劲,不值得。
点赞
2026-02-28 20:00