前言:
继续上一篇:https://blog.csdn.net/m0_56758840/article/details/136633897
正文:
在这一篇讲混淆的时候,需要先清除一个概念!! 什么是Unicode~
Unicode编码
定义
Unicode是一种字符编码标准,用于表示世界上几乎所有的字符集。它为每个字符分配了一个唯一的标识符,称为码点(code point),可以用十六进制数表示。Unicode标准定义了不同字符的编码,并为字符赋予了唯一的编号,包括各种语言的字符、符号、标点符号等。
JavaScript(JS)支持Unicode主要出于以下几个原因:
-
多语言支持:Unicode标准支持全球范围内的各种语言字符集,包括非欧洲语言字符集。由于JS是一种广泛应用于全球范围的编程语言,支持Unicode使得JS可以轻松处理多语言环境下的字符串,使其能够正确地解析、处理和显示各种字符。
-
一致性和互操作性:Unicode作为全球公认的字符编码标准,各种编程语言和应用程序在处理和传递文本数据时都应该支持Unicode。通过JS支持Unicode,可以确保与其他编程语言和平台之间的数据交换和互操作性。
-
处理复杂文本内容:随着互联网和移动设备的发展,文本内容变得越来越丰富多样。支持Unicode使JS能够处理包含表情符号、特殊符号、复杂排版等复杂文本内容的字符串,提供更好的用户体验。
-
国际化和本地化:Unicode的支持也使得JS可以方便地进行国际化和本地化处理,例如根据用户的语言环境显示特定的文本、日期、货币等。
总之,JS支持Unicode是为了适应全球化的需求,保证JS可以正确处理各种语言和复杂文本内容。通过支持Unicode,JS可以更好地与其他编程语言进行协作,提供更强大和全面的字符处理能力。
Unicode的JS混淆
当涉及到Unicode的案例时,一个常见的例子是使用Unicode字符表示特殊符号或表情符号。
假设我们想在字符串中使用一个笑脸表情符号,可以通过Unicode码点来表示。
例如,笑脸表情符号的Unicode码点是U+1F600。在JavaScript中,可以使用\u加上码点的十六进制形式来表示该字符。下面是一个使用Unicode表示笑脸表情符号的示例:
var smiley = "\u1F600";
console.log(smiley);
在这个示例中,我们使用"\u1F600"来表示笑脸表情符号,然后将其打印到控制台。当运行代码时,将会显示笑脸表情符号。
关于JavaScript混淆中的Unicode案例,常见的一种情况是使用Unicode转义序列来混淆代码。通过将源代码中的字符替换为Unicode转义序列表示的字符,可以增加代码的可读性和理解难度。
例如,假设原始代码中有一个变量名为"myVariable",我们可以将字母替换为相应的Unicode转义序列来混淆代码。下面是一个简单示例:
var \u006D\u0079\u0056\u0061\u0072\u0069\u0061\u0062\u006C\u0065 = 10;
console.log(\u006D\u0079\u0056\u0061\u0072\u0069\u0061\u0062\u006C\u0065);
在这个示例中,我们使用Unicode转义序列来表示"myVariable"变量名中的每个字符。尽管代码看起来很混乱,但依然可以正常工作并打印变量的值。
仅使用Unicode字符和转义序列进行混淆不足以提供真正的安全性,因为源代码仍然可以通过逆向操作进行还原。在实际情况中,需要使用更强大的混淆技术和工具来保护代码的安全性和保密性。
混淆AA
用到Unicode的特性,就会对js代码进行各种加密了! 例如
JS加密,JS 安全加密, AAencode 加密 —在线加密
在这个在线加密里面,我们随便测试一个js代码:
得到结果:
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`sojson.com*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚) .゚ω゚ノ+ (c^_^o)+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚) .゚Θ゚ノ+ (゚Д゚) ['c']+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚o゚])(゚Θ゚))((゚Θ゚)+(゚Д゚)[゚ε゚]+((゚ー゚)+(゚Θ゚))+(゚Θ゚)+(゚Д゚)[゚o゚]);
说明:
1.加密后基本不像是 JavaScript 代码,或者说根本就不是代码,甚至有点卡哇伊,缺点是压栈严重,不适合较大脚本加密。
2.如果加密之后用不了,有几种原因如下:,先加密再混淆效果最佳。再混淆效果如下:
- JavaScript 代码不规范,如 if、for 循环没有花括号“{}”,代码没有以“;”结束,如 var a=0;var b=1;如果没有“;”那就是var a=0var b=1,明白了吗?
- JavaScript 代码中有大量或者复杂的正则表达式,导致加密的过程中失效。
- 变量,方法,JavaScript 脚本的顺序导致依赖关系的混乱,导致整个 JavaScript 运行失效。
混淆JJ
结果:
sojson=~[];/*sojson.com*/sojson={___:++sojson,/*sojson.com*/$$$$:(![]+"")[sojson],__$:++sojson,$_$_:(![]+"")[sojson],_$_:++sojson,$_$$:({}+"")[sojson],$$_$:(sojson[sojson]+"")[sojson],_$$:++sojson,$$$_:(!""+"")[sojson],$__:++sojson,$_$:++sojson,$$__:({}+"")[sojson],$$_:++sojson,$$$:++sojson,$___:++sojson,$__$:++sojson};sojson.$_=(sojson.$_=sojson+"")[sojson.$_$]+(sojson._$=sojson.$_[sojson.__$])+(sojson.$$/*sojson.com*/=(sojson.$+"")[sojson.__$])+((!sojson)+"")[sojson._$$]+(sojson.__=sojson.$_[sojson.$$_])+(sojson.$=(!""+"")[sojson.__$])+(sojson._=(!""+"")[sojson._$_])+sojson.$_[sojson.$_$]+sojson.__+sojson._$+sojson.$;/*sojson.com*/sojson.$$=sojson.$+(!""+"")[sojson._$$]+sojson.__+sojson._+sojson.$+sojson.$$/*sojson.com*/;sojson.$=(sojson.___)[sojson.$_][sojson.$_];sojson.$(sojson.$(sojson.$$+"\""+"\\"+sojson.__$+sojson.$$_+sojson.$$_+sojson.$_$_+"\\"+sojson.__$+sojson.$$_+sojson._$_+" "+sojson.$$__+sojson.$$$_+"\\"+sojson.__$+sojson.$$_+sojson._$$+"\\"+sojson.__$+sojson.$_$+sojson.___+"\\"+sojson.__$+sojson.$_$+sojson.__$+" \\"+sojson.$$$+sojson.$_$+" \\\"\\"+sojson._+sojson.$_$+sojson._$_+sojson.$_$_+sojson.___+"\\"+sojson._+sojson.$_$+sojson.$_$$+sojson.$$__+sojson.$$_+"\\"+sojson.__$+sojson.__$+sojson._$_+"\\"+sojson.__$+sojson.__$+sojson._$_+"\\\"\\"+sojson.$$$+sojson._$$+"\"")())(sojson={___:++sojson,$$$$:(![]+"")[sojson]});
说明:
1.加密后基本不像是 JavaScript 代码,或者说根本就不是代码,缺点是压栈很严重,js 很大去做加密可能内存溢出,所以适合核心功能加密。
2.如果加密之后用不了,有几种原因如下:,先加密再混淆效果最佳。再混淆效果如下:
- JavaScript 代码不规范,如 if、for 循环没有花括号“{}”,代码没有以“;”结束,如 var a=0;var b=1;如果没有“;”那就是var a=0var b=1,明白了吗?
- JavaScript 代码中有大量或者复杂的正则表达式,导致加密的过程中失效。
- 变量,方法,JavaScript 脚本的顺序导致依赖关系的混乱,导致整个 JavaScript 运行失效。
总结:
我们通过上面两个大概可以清除; 对于混淆JS,如果他是乱码,至少我们能够知道他是用什么方式进行混淆的
- 1.长得比较卡哇伊,有很多表情符号,那就是AA混淆
- 2.有很多`$$` 符号的,大概率就是JJ混淆
当然,还有很多种不同的混淆方式~大家可以自己去试试看!