运行结不雅如下:
- 1337
- VM146:1We should see this…
- VM147:10
- VM147:11
- VM147:12
- VM147:13
- VM147:14
- VM147:15
- VM147:16
- VM147:17
- VM147:18
- VM147:19
正如之前所说的那样,固然这种办法异常奇妙,但这也是一种异常基本和常见的办法,所以比较轻易被检测到。
二、断点
为了赞助我们懂得代码的功能,JavaScript调试对象(例如DevTools)都可以经由过程设置断点的方法阻拦脚本代码履行,而断点也是代码调试中最根本的了。
如不雅钠揭捉?究过调试器或者x86架构,你可能会比较熟悉0xCC指令。在JavaScript中,我们有一个名叫debugger的类似指令。当我们在代码中声清楚明了debugger函数后,脚本代码将会在debugger指令这里停止运行。比如说:
- console.log("Seeme!");
- debugger;
- console.log("Seeme!");
很多贸易产品会在代码中定义一个无穷轮回的debugger指令,不过某些浏览器会樊篱这种代码,而有些则不会。这种办法的重要目标就是让那些想要调试你代码的人认为腻烦,因为无穷轮回意味着代码会赓续地弹出窗口来询问你是否要持续运行脚本代码:
- setTimeout(function(){while (true) {eval("debugger")
三、时光差别
这是一种大年夜传统反逆向技巧那边借鉴过来的基于时光的反调试技能。当脚本在DevTools等对象情况下履行时,运行速度会异常慢(时光久),所以我们就可以根据运行时光来断定脚本当前是否正在被调试。比如说,我们可以经由过程测量代码中两个设置点之间的运行时光,然后用这个值作为参考,如不雅运行时光跨越这个值,解释脚本当前在调试器中运行。
- VM391:13 I saw your proxy!
演示代码如下:
- set Interval(function(){
- var startTime = performance.now(), check,diff;
- for (check = 0; check < 1000; check++){
- console.log(check);
- console.clear();
- }
- diff = performance.now() - startTime;
- if (diff > 200){
- alert("Debugger detected!");
- }
- },500);
这项技巧应用的是div元素中的id属性,当div元素被发送至控制台(例如console.log(div))时,浏览器会主动测验测验获取个中的元素id。如不雅代码在调用了console.log之后又调用了getter办法,解释控制台当前正在运行。
推荐阅读
沙龙晃荡 | 3月31日 京东、微博拭魅战专家与你合营商量容器技巧实践! 有那么一群人他们生活在那山的那边海的那边,他们活泼又聪慧~他们油滑又聪颖~他们自由安闲的生活在那彩色的代率攀里~>>>详细阅读
本文标题:带你了解JavaScript反调试技巧
地址:http://www.17bianji.com/lsqh/40591.html
1/2 1