浏览器反调试绕过无限debugger及代码执行器检测 |
您所在的位置:网站首页 › 爬虫定时器 › 浏览器反调试绕过无限debugger及代码执行器检测 |
背景
现在做数据爬虫的朋友常有的方法就是利用浏览器的调试能力分析别人JS代码逻辑。如果遇到复杂的代码可能会第三方代码执行功能。例如使用puppeteer的evalute方法执行代码获取结果。 而我们做反爬遇到这种情况就是进行调试干扰,例如加入定时器,重复调用debugger,那么调试模式下就影响调试。 而对于类似通过evalute方法执行代码进行抓取的爬虫通过异常调用栈即可检测。例如执行代码中故意插入一段代码,并产生错误,那么通过调用栈可以检测到函数名,这样就可以进行识别。 let checkFunc = function () { let detected = false; let stack; try { (void 0).c; } catch (error) { stack = (error || {}).stack; detected = (stack && typeof stack === "string" && (stack.indexOf("eval") > -1)); } return detected; }; 解决办法我很久前也写过一些文章,介绍了处理思路,“拦截及预处理”,任何场景下这些前端的具体问题都会想到解决办法。第一个debugger问题。虽然很好的干扰调试者,但也暴露的自身的调用栈。通过定时器产生周期调用,最终通过concat拼接构成字符串,最后通过构造器来完成执行。 function e(t) { if ("string" == typeof t) return function(t) {} .constructor("while (true) {}").apply("counter"); 1 !== ("" + t / t).length || t % 20 == 0 ? function() { return !0 } .constructor("".concat(y).concat(x).concat(b)).call("action") : function() { return !1 } .constructor("".concat(y).concat(x).concat(b)).apply("stateObject"), e(++t) }那我们知道了这个问题,按照拦截及预处理的思路,只要在concat过程中干扰debugger生成,换成无关紧要的方法即可。我们将下面的代码在浏览器控制台中执行。随后看到debugger干扰调试就不会再生效。 String.prototype.concat = new Proxy(String.prototype.concat,{ apply:function(target,ctx,param) { let value = target.call(ctx,...param); if(value.indexOf("debugg") > -1) { value = 'console'; } return value; } });接着就可以舒服的看代码了。这也不是唯一的办法,替换文件,响应替换都可以。这里仅是一个思路,对于不同人看到还会想到不同的思路。 此外我们会发现页面刷新后代码就会失效。只需要找一个在页面加载前执行代码的浏览器插件即可。 debugger这个问题清楚了,那么对于evalute执行代码被检测的处理也就知道了如何应对了。思路有很多,当然也是可以修改框架代码解决。 String.prototype.indexOf = (function(){ let oIndexOf = String.prototype.indexOf; return function(value,from) { if(value === 'eval') { debugger; return -1; } else { return oIndexOf.call(this,value,from); } } })(); 总结拦截的方法也仅仅是对语言认知加深即可提升。当然自己思考过了有思路,也只是查手册的问题。 我们遇到的很多这些问题google后,会发现很早很早以前已经有人提出,这些办法不一定解决一个具体的问题,但是确是很好的思路,因此看到别人的思路,自己多思考就能想到扩展点。而不是记录一大推实例,一但现象不同了,就懵了。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |