首页 > 编程语言 >JavaScript奇淫技巧:反调试

JavaScript奇淫技巧:反调试

时间:2023-01-01 17:02:42浏览次数:45  
标签:console debugger 代码 JavaScript var new 奇淫 调试

JavaScript奇淫技巧:反调试

本文,将分享几种JS代码反调试技巧,目标是:实现防止他人调试、动态分析自己的代码。

检测调试,方法一:用console.log检测

代码:

var c = new RegExp ("1");

c.toString = function () {

alert("检测到调试")

}

console.log (c);

原理:

当console.log输出调试信息时,会将非字符串类型数据转成字符串,于是通过接管toString函数,判断是否有这样的行为,而如果没有打开调试窗口,即不会有console.log输出,从而识别是否于处调试状态。

运行效果:

JavaScript奇淫技巧:反调试_反调试

检测调试,方法二、通过代码执行时间检测

代码:

var startTime = new Date ();

debugger;

var endTime = new Date ();

var isDev = endTime-startTime> 100;

if (isDev){

    alert("检测到调试")

}

原理:

在代码不同语句间加入debuger指令,debugger会使调试模式暂停,那么暂停将造成延迟。

通过检测延迟前后果的时间值,从而判断是否发生了延时,如果发生,则表达处于调试状态。

运行效果:

debugger触发暂停:

JavaScript奇淫技巧:反调试_反调试_02

检测到调试:

JavaScript奇淫技巧:反调试_js加密_03

反调试手段

检测到调试又该如何呢?

反调试方法一、无限debugger

一般情况下,可以用无限循环的debugger,使不停的暂停代码执行,使调试无法进行。

如:

var c = new RegExp ("1");

c.toString = function () {

    alert("检测到调试")

   

    setInterval(function(){

        debugger

    },1000);

}

console.log (c);

运行效果:

JavaScript奇淫技巧:反调试_js加密_04

反调试方法二、内存耗尽

debugger方法虽然效果不错,但太过直观,反制效果也过去温柔。

另有一种“内存耗尽”的方式,会更隐藏、更强大,如:

var startTime = new Date ();

debugger;

var endTime = new Date ();

var isDev = endTime-startTime> 100;

var stack = [];

if (isDev){

   while(true){

    stack.push(this);

    console.log(stack.length,this)

   }

}

运行效果:

代码运行造成的内存占用会越来越大,很快会使浏览器崩溃,如下图:

JavaScript奇淫技巧:反调试_js调试_05

JS代码加密

上述几种方法,已经达到了反调试的效果,但如果他人查看代码,也可能被找出检测功能并删去。

为了防止反调试功能被剔除,我们可以对JS代码进行混淆加密。

例如本文第一段代码:

var c = new RegExp ("1");

c.toString = function () {

alert("检测到调试")

}

console.log (c);

代码功能很清晰,使用JShaman进行混淆加密:

JShaman是专业且强力的JS代码混淆加密工具

JavaScript奇淫技巧:反调试_js调试_06

混淆加密后的代码,将成为:

JavaScript奇淫技巧:反调试_js加密_07

var _0x98ac=["117.","56.","26825.27970.21049.35850.35804."];function _0x(str,dy_key){dy_key=9;var i,k,str2="";k=str.split(".");for(i=0;i<k.length-1;i++){str2+=String.fromCharCode(k[i]^dy_key);}return str2;}function _0xb346gb(vm_opcode){var _array="3|2|1|4|0".split(_0x(_0x98ac[0])),_index=0;while(!![]){switch(+_array[_index++]){case 0:while(ip<vm_opcode.length){ip++;switch(vm_opcode[ip]){case op.push:{ip++;stack.push(vm_opcode[ip]);sp++;break;}case op.add:{var op_1=stack[sp-1];var op_2=stack[sp];var value=function(s,h){return s+h;}(op_1,op_2);stack.push(value);sp++;break;}case op.sub:{var op_1=stack[sp-1];var op_2=stack[sp];var value=function(s,h){return s-h;}(op_1,op_2);stack.push(value);sp++;break;}case op.mul:{var op_1=stack[sp-1];var op_2=stack[sp];var value=function(s,h){return s*h;}(op_1,op_2);stack.push(value);sp++;break;}case op.div:{var op_1=stack[sp-1];var op_2=stack[sp];var value=function(s,h){return s/h;}(op_1,op_2);stack.push(value);sp++;break;}case op.xor:{var op_1=stack[sp-1];var op_2=stack[sp];var value=function(s,h){return s^h;}(op_1,op_2);stack.push(value);sp++;break;}case op.pop:{return stack[sp];}}}continue;case 1:var ip=-1;continue;case 2:var stack=[];continue;case 3:var op={push:32,add:33,sub:34,mul:35,div:36,pop:37,xor:38};continue;case 4:var sp=-1;continue;}break;}}var _0x97b=function(s,h){return s+h;}(_0xb346gb([32,674032,32,674037,38,37]),_0xb346gb([32,651374,32,651368,38,37]));var c=new RegExp(_0x(_0x98ac[1]));_0x97b=function(){return _0xb346gb([32,686171,32,686171,38,37]);}();c['\x74\x6f\x53\x74\x72\x69\x6e\x67']=function(){alert(_0x(_0x98ac[2]));};console['\x6c\x6f\x67'](c);

这样的代码,将很难理解其功能,也就可以防止代码被修改。

其它的JS功能代码,同样可以使用JShaman进行混淆加密,最终使用混淆加密后的安全代码。

标签:console,debugger,代码,JavaScript,var,new,奇淫,调试
From: https://blog.51cto.com/jsjiami/5983101

相关文章

  • 关于内网穿透解决企本地调试微回调问题
    在做企微开发时,本地系统需要做到与企微数据进行实时的同步,以保证本地数据是最新的,保证企业服务人员获取到的客户信息都是最新的,提供更好的服务;对此,我们就必须要对接企微回......
  • JavaScript(JS基础、变量)
    编程语言编程概念:让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程。编程语言:机器语言汇编语言高级语言:C、C++、Java、C#等一、JavaScript1......
  • 使用 JavaScript 检测用户是否在线
    有时你可能希望增强你的应用程序以通知用户他们可能已经失去了互联网连接。用户可能正在访问你的网站并收到缓存版本,因此通常看起来他们的互联网仍在工作。然而,他们失去了......
  • 第119篇: JavaScript 类
    好家伙,我们先来复习一下 关于Java,类的三大特征:1、封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏......
  • 快来领取你的JavaScript正则表达式速查表
    如果我们想对字符串进行相关(增、删、改、查、检索)操作,就可以用接下来的正则表达式实现 什么是正则表达式正则表达式是用于匹配字符串中字符组合的模式正则表达式通......
  • Linux 监控和调试利器 Sysdig 入门教程
    Sysdig简介Sysdig官网上对自己的介绍是:OpenSourceUniversalSystemVisibilityWithNativeContaierSupport.它的定位是系统监控、分析和排障的工具,其实在Linux......
  • 逆向技巧——映像劫持,自动调试新进程
    映像劫持,自动打开OD调试新进程第一步:进入注册表项计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\ImageFileExecutionOptions第二步:新建......
  • Smart Table Personalization 功能的一些单步调试
    ​​SmartTablePersonalization功能的一些单步调试​​ SmartTable的​​_onMetadataInitialised​​方法里:如果标志位​​bIsInitialised​​已经赋值,说明......
  • 基于Ubuntu20.04+OpenCV4+ROS+ORB SLAM3调试Realsense D455
    编译中会遇到数不胜数的奇怪问题,更多没有提及的问题需要自行查阅解决,记录的可能欢迎纠正与补充本文编译环境基于此前文章进行,重复部分下文不再赘述,如想了解环境编译细节,可......
  • HTML5期末大作业:上海介绍网站设计——代码质量好-上海介绍(5页) HTML+CSS+JavaScript(
    一、作品展示>二、文件目录>三、代码实现>​​h​​<!DOCTYPE ​​html​​><​​head​​>  <metacharset="utf-8"/>  <title>上海旅游介绍</title>  <link......