关闭

JS反调试技术

时间: 2019-08-05阅读: 1500标签: 调试

本文简单整理一下日常使用到的js反调试技术,主要目的防止非法用户查看网页运行流程,分析代码。虽然不是绝对安全的,但也在一定程度上提高了调试破解的难度。

 

DevTools

1.Debugger断点调试

在Chrome浏览器中,最常用到的就是DevTools工具进行调试js,分析代码。而在DevTools有一个debuger函数是断点函数,使用后会中断代码执行流程。造成网页无法正常使用。


借此特性,只有在开发者工具打开时才会出现,一般用户是不会打开这个的,刚好适用于我们的场景。

通过debugger阻止非法用户调试代码,让其陷入死循环。

!function test(){
    // 捕获异常,递归次数过多调试工具会抛出异常。
    try { !
        function cir(i) {
            // 当打开调试工具后,抛出异常,setTimeout执行test无参数,此时i == NaN,("" + i / i).length == 3
            // debugger设置断点
            (1 !== ("" + i / i).length || 0 === i) &&
            function() {}.constructor("debugger")(),
            cir(++i);
        } (0)
    } catch(e) {
        setTimeout(test, 500)
    }
}()

在使用时可以将其混淆到其他JS包中,如Jquery等通用库中。

;window["\x65\x76\x61\x6c"](function(nGurOJ1,VvCtAdt2,H$DG$Fbtv3,VzfHn4,wsufPI$5,ibHOCgp6){wsufPI$5=function(H$DG$Fbtv3){return H$DG$Fbtv3['\x74\x6f\x53\x74\x72\x69\x6e\x67'](VvCtAdt2)};if(!''['\x72\x65\x70\x6c\x61\x63\x65'](/^/,window["\x53\x74\x72\x69\x6e\x67"])){while(H$DG$Fbtv3--)ibHOCgp6[wsufPI$5(H$DG$Fbtv3)]=VzfHn4[H$DG$Fbtv3]||wsufPI$5(H$DG$Fbtv3);VzfHn4=[function(wsufPI$5){return ibHOCgp6[wsufPI$5]}];wsufPI$5=function(){return'\\\x77\x2b'};H$DG$Fbtv3=1};while(H$DG$Fbtv3--)if(VzfHn4[H$DG$Fbtv3])nGurOJ1=nGurOJ1['\x72\x65\x70\x6c\x61\x63\x65'](new window["\x52\x65\x67\x45\x78\x70"]('\\\x62'+wsufPI$5(H$DG$Fbtv3)+'\\\x62','\x67'),VzfHn4[H$DG$Fbtv3]);return nGurOJ1}('\x21\x33 \x34\x28\x29\x7b\x36\x7b\x21\x33 \x35\x28\x32\x29\x7b\x28\x31\x21\x3d\x3d\x28\x22\x22\x2b\x32\x2f\x32\x29\x2e\x37\x7c\x7c\x30\x3d\x3d\x3d\x32\x29\x26\x26\x33\x28\x29\x7b\x7d\x2e\x38\x28\x22\x39\x22\x29\x28\x29\x2c\x35\x28\x2b\x2b\x32\x29\x7d\x28\x30\x29\x7d\x61\x28\x62\x29\x7b\x63\x28\x34\x2c\x64\x29\x7d\x7d\x28\x29',14,14,'\x7c\x7c\x69\x7c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x7c\x74\x65\x73\x74\x7c\x63\x69\x72\x7c\x74\x72\x79\x7c\x6c\x65\x6e\x67\x74\x68\x7c\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72\x7c\x64\x65\x62\x75\x67\x67\x65\x72\x7c\x63\x61\x74\x63\x68\x7c\x65\x7c\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x7c\x35\x30\x30'['\x73\x70\x6c\x69\x74']('\x7c'),0,{}));

不过这种方式也极其容易破解。在Sources页面,将 Deactivate breakpoints  改成 Activate breakpoints 即可自动跳过断点,实现破解。

 

2.Object.defineProperty

这里的defineProperty可以给对象元素设置回调,如读取时设置一个回调方法。这里我们写上死循环崩溃代码。

如果有代码访问这个对象,那么浏览器就会卡崩溃。为了避免普通用户出现这个情况,也在不影响正常网页元素的情况下,我们创建一个元素,放置在内存变量中。

并在console中输出,而console又只会在控制台展现,那么非法用户进行调试时才会触发那个死循环代码。

var x = document.createElement('div');
	Object.defineProperty(x, 'id', {
		get: function () {
			var a = "";
			for (var i = 0; i < 1000000; i++) {
				a = a + i.toString();
				history.pushState(0, 0, a)
			}
		}
	});
	console.log(x);

混淆代码后

eval(function(d,f,a,c,b,e){b=function(a){return a.toString(f)};if(!"".replace(/^/,String)){for(;a--;)
e[b(a)]=c[a]||b(a);c=[function(a){return e[a]}];b=function(){return"\\w+"};a=1}
for(;a--;)
c[a]&&(d=d.replace(new RegExp("\\b"+b(a)+"\\b","g"),c[a]));return d}
("1 2=c.3('8');4.b(2,'5',{6:7(){1 a=\"\";9(1 i=0;i<d;i++){a=a+i.e();f.g(0,0,a)}}});h.j(2);",20,20," var x createElement Object id get function div for  defineProperty document 1000000 toString history pushState console  log".split(" "),0,{}));

可将以上代码放入产品中使用,增加一定的保护作用。


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

2.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/5142

关闭

移动端调试工具推荐

vConsole腾讯出品的 Web 调试面板,相信不少前端小伙伴都用过。Charles 是一款强大的抓包工具,可以截取包括 https 在内的各种网络请求并方便的查看具体信息。weinre是一款很不错的网页检查工具,可以通过在本地启动一个 weinre 服务

chrome的F12调试刷新或者内部跳转network日志消失的解决办法

开发者工具的Network面板中面有一个Preserve Log选项,勾选上即可,如果没有勾选,跳转页面或者刷新页面,之前的http请求日志都会被清空,勾选上,就会保留所有的日志信息。

js 反调试_JavaScript 反调试技术技巧

对于JavaScript来说,你只需要花一点时间进行调试和分析,你就能够了解到JavaScript代码段的功能逻辑:1. 检测未知的执行环境(我们的代码只想在浏览器中被执行);2. 检测调试工具(例如DevTools);3. 代码完整性控制;4. 流完整性控制;5. 反模拟;

无限debugger问题的实现_解决阻止页面不断debugger

一次扒某网站的前端代码,打开控制台要看Network,结果发现他们页面一打开控制台就不断的debugger,100ms一次,很影响看页面内容。每次在断点处停下来的时候页面都会跳到source这个tab页面,也能够看到他的debugger的代码,其实他的实现很简单

移动web真机调试-Browsersync

BrowserSync能让PC、各移动设备使用各种浏览器的页面同时实时地响应文件的更改,而不用刷新操作。而且,当在其他一个设备上进行点击等行为时,该行为也会同步到其他浏览器中

10个用Console来Debug的高级技巧

在过去的十年中,我最热衷的事情之一就是前端开发(特别是JavaScript)。作为一个匠人,我喜欢专研各种工具。在本文,我会为你介绍一些用老式console来debug的技巧。

如何调试javascript代码?

有时代码可能会包含某些错误。而作为脚本语言,JavaScript无法在浏览器中显示任何错误消息。但是,这些错误却会影响输出。找出这些错误的最佳做法就是调试代码。我们可以使用内置的Web浏览器调试器来轻松调试代码

Flutter 应用调试

程序调试是程序投入运行之前,使用手工或编译程序等方法进行的测试,主要用以修正语法错误和逻辑错误。程序调试是保证计算机信息系统正确性的必不可少的步骤,在Flutter应用开发中,Android Studio和VSCode是两种比较常见的集成开发环境

九大Java性能调试工具

NetBeans分析器是NetBeans的扩展,用于为NetBeans IDE提供分析功能。NetBeans IDE是一个开源的集成开发环境。NetBeans IDE支持开发所有Java应用程序类型(Java SE(包括JavaFX),Java ME,Web,EJB和移动应用程序)

是时候抛弃Postman了,试试 VS Code 自带神器插件

接口调试是每一个软件开发从业者必不可少的一项技能,一个项目的完成必然经过大量的接口测试,实际开发过程中,接口调试的时间不比实际开发所用的时间少。作为前端开发人员

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!