文档章节

JS反调试技术随笔记录

Eller
 Eller
发布于 09/05 14:49
字数 1037
阅读 20
收藏 0

本文简单整理一下日常使用到的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,{}));

 

可将以上代码放入产品中使用,增加一定的保护作用。如你有更多思路方案欢迎留言或者联系我。

© 著作权归作者所有

Eller
粉丝 15
博文 52
码字总数 48012
作品 0
深圳
程序员
私信 提问
js经验分享 JavaScript反调试技巧

在此之前,我一直都在研究JavaScript相关的反调试技巧。但是当我在网上搜索相关资料时,我发现网上并没有多少关于这方面的文章,而且就算有也是非常不完整的那种。所以在这篇文章中,我打算跟...

前端小攻略
2018/12/18
0
0
保护 JavaScript 客户端 APP 的最有效方法

客户端技术,如 JavaScript,有很多有用的特性,正因为如此,它成为了世界上最流行的语言之一。它有很多优点,即时解析就是其一。即时解析有不少优点,比如可以在浏览器下载代码并立即执行。...

oschina
2016/11/08
295
0
web高性能开发系列随笔

在BlogJava里写了一些关于高性能WEB开发的随笔,因为都是跟前端技术相关(html,http,js,css等),所以也贴到博客园来,吸收下人气。 1、 HTTP服务器. 2、性能测试工具推荐 3、 图片篇. 4、 如何...

晨曦之光
2012/03/09
82
0
基于Metronic的Bootstrap开发框架--资产编码打印处理

在开发业务管理系统的时候,往往涉及到资产信息及编码的打印处理,如我们需要对资产信息、条形码、二维码一起打印,以便贴在具体资产信息上面,方便微信公众号、企业微信进行业务处理,那么编...

伍华聪
02/27
0
0
高性能JavaScript模板引擎原理解析

本文将用最简单的示例代码描述现有的 javascript 模板引擎的原理,包括新一代 javascript 模板引擎 artTemplate 的特性实现原理,欢迎共同探讨。 artTemplate 介绍 artTemplate 是新一代 ja...

李朝强
2013/07/29
262
0

没有更多内容

加载失败,请刷新页面

加载更多

什么是线程死锁,如何解决

产生死锁的条件有四个: 互斥条件:所谓互斥就是进程在某一时间内独占资源。 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 不剥夺条件:进程已获得资源,在末使用完...

苏坡吴
30分钟前
4
0
CSS

一、CSS概述 1、什么是CSS Cascading style sheets,层叠样式表、级联样式表,简称样式表 2、css的作用 设置HTML网页中元素的样式 3、HTML与CSS的关系 HTML:负责网页的搭建,内容展示--网页...

wytao1995
41分钟前
4
0
二叉查找树的第 K 个结点

private TreeNode ret;private int cnt = 0;public TreeNode KthNode(TreeNode pRoot, int k) { inOrder(pRoot, k); return ret;}private void inOrder(TreeNode root......

Garphy
今天
4
0
windo8 weblogic

需要的软件包 现在安装jdk 则先进入你电脑自带jdk \bin目录下 然后java -jar 执行你的jar包就可以了 欢迎界面直接点击下一步,跳到更新界面,直接选择跳过 然后选择安装目录(注意:目录不要有...

恩多
今天
8
0
Activiti 批注

Activiti添加批注(comment)信息 在每次提交任务的时候需要描述一些批注信息,例如:请假流程提交的时候要描述信息为什么请假,如果领导驳回可以批注驳回原因等  1、添加批注 // 由于流程...

奔跑的android
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部