线上javascript防调试破解debugger解决方案

764 阅读1分钟

最近在外网看到个h5小游戏感觉挺有意思,于是用开发工具调试,想看下某些功能具体实现方法。结果一直循环卡在下面这段代码下:

(function a() {
    try {
        (function b() {debugger;b()})()
    } catch (e) {
        setTimeout(a, 5e3)
    }
})()

百度了下,最简单的解决方法————停用断点

虽然可以解决,但是这样就调试不了,与原本想法冲突。。。没其他办法吗?当然不是,下面请看~

通过查看调用堆栈,可以知道这段代码是通过一个方法运行时动态添加,如下:

function _preInit() {
        var s = document.createElement("script");
        s.innerHTML=atob("KGZ1bmN0aW9uIGEoKXt0cnl7KGZ1bmN0aW9uIGIoKXtkZWJ1Z2dlcjtiKCl9KSgpfWNhdGNoKGUpe3NldFRpbWVvdXQoYSw1ZTMpfX0pKCk");
        document.head.appendChild(s)
        }

这样就简单了,只要在document.head.appendChild(s)这里断点,然后通过控制台在添加进去前把s的值改掉就可以。

例如运行到该断点时在控制台输入:s=document.createElement("script");

确认后,s的值就会被设置为空脚本。

最后,看着好像挺简单的,不过现实却并非如此,该方法所在的脚本也是动态生成的,所以需要在动态脚本创建好且防调试方法调用前设置断点,接着确定该动态脚本后才能找到防调试方法设置断点。由于代码进行高频的压缩和混淆,可读性很差,即使一步步调试也很难获取到想要的信息。

果然,最好防破解方法就是让破解的成本远大于创作。