此前发布过关于aaencode的混淆编码,此篇文章继续说同做者的jjencode混淆编码的具体过程。javascript
首先是jjencode的做者提供的编码测试页:http://utf-8.jp/public/jjencode.htmlhtml
能够将任何合法的JavaScript代码进行编码,首先咱们能够简单测试将如下代码进行编码。java
编码前:函数
alert("Hello, JavaScript" )
编码后:测试
$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\"\\"+$.__$+$.__$+$.___+$.$$$_+(![]+"")[$._$_]+(![]+"")[$._$_]+$._$+",\\"+$.$__+$.___+"\\"+$.__$+$.__$+$._$_+$.$_$_+"\\"+$.__$+$.$$_+$.$$_+$.$_$_+"\\"+$.__$+$._$_+$._$$+$.$$__+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$$_+$.___+$.__+"\\\"\\"+$.$__+$.___+")"+"\"")())();
可见,编码后的JS也是颇有意思,仅由符号组成的JS代码。编码
经过源代码,咱们能够看到具体将JS进行编码的函数过程,以下所示:code
function jjencode( gv, text ) { var r=""; var n; var t; var b=[ "___", "__$", "_$_", "_$$", "$__", "$_$", "$$_", "$$$", "$___", "$__$", "$_$_", "$_$$", "$$__", "$$_$", "$$$_", "$$$$", ]; var s = ""; for( var i = 0; i < text.length; i++ ){ n = text.charCodeAt( i ); if( n == 0x22 || n == 0x5c ){ s += "\\\\\\" + text.charAt( i ).toString(16); }else if( (0x21 <= n && n <= 0x2f) || (0x3A <= n && n <= 0x40) || ( 0x5b <= n && n <= 0x60 ) || ( 0x7b <= n && n <= 0x7f ) ){ //}else if( (0x20 <= n && n <= 0x2f) || (0x3A <= n == 0x40) || ( 0x5b <= n && n <= 0x60 ) || ( 0x7b <= n && n <= 0x7f ) ){ s += text.charAt( i ); }else if( (0x30 <= n && n <= 0x39 ) || (0x61 <= n && n <= 0x66 ) ){ if( s ) r += "\"" + s +"\"+"; r += gv + "." + b[ n < 0x40 ? n - 0x30 : n - 0x57 ] + "+"; s=""; }else if( n == 0x6c ){ // 'l' if( s ) r += "\"" + s + "\"+"; r += "(![]+\"\")[" + gv + "._$_]+"; s = ""; }else if( n == 0x6f ){ // 'o' if( s ) r += "\"" + s + "\"+"; r += gv + "._$+"; s = ""; }else if( n == 0x74 ){ // 'u' if( s ) r += "\"" + s + "\"+"; r += gv + ".__+"; s = ""; }else if( n == 0x75 ){ // 'u' if( s ) r += "\"" + s + "\"+"; r += gv + "._+"; s = ""; }else if( n < 128 ){ if( s ) r += "\"" + s; else r += "\""; r += "\\\\\"+" + n.toString( 8 ).replace( /[0-7]/g, function(c){ return gv + "."+b[ c ]+"+" } ); s = ""; }else{ if( s ) r += "\"" + s; else r += "\""; r += "\\\\\"+" + gv + "._+" + n.toString(16).replace( /[0-9a-f]/gi, function(c){ return gv + "."+b[parseInt(c,16)]+"+"} ); s = ""; } } if( s ) r += "\"" + s + "\"+"; r = gv + "=~[];" + gv + "={___:++" + gv +",$$$$:(![]+\"\")["+gv+"],__$:++"+gv+",$_$_:(![]+\"\")["+gv+"],_$_:++"+ gv+",$_$$:({}+\"\")["+gv+"],$$_$:("+gv+"["+gv+"]+\"\")["+gv+"],_$$:++"+gv+",$$$_:(!\"\"+\"\")["+ gv+"],$__:++"+gv+",$_$:++"+gv+",$$__:({}+\"\")["+gv+"],$$_:++"+gv+",$$$:++"+gv+",$___:++"+gv+",$__$:++"+gv+"};"+ gv+".$_="+ "("+gv+".$_="+gv+"+\"\")["+gv+".$_$]+"+ "("+gv+"._$="+gv+".$_["+gv+".__$])+"+ "("+gv+".$$=("+gv+".$+\"\")["+gv+".__$])+"+ "((!"+gv+")+\"\")["+gv+"._$$]+"+ "("+gv+".__="+gv+".$_["+gv+".$$_])+"+ "("+gv+".$=(!\"\"+\"\")["+gv+".__$])+"+ "("+gv+"._=(!\"\"+\"\")["+gv+"._$_])+"+ gv+".$_["+gv+".$_$]+"+ gv+".__+"+ gv+"._$+"+ gv+".$;"+ gv+".$$="+ gv+".$+"+ "(!\"\"+\"\")["+gv+"._$$]+"+ gv+".__+"+ gv+"._+"+ gv+".$+"+ gv+".$$;"+ gv+".$=("+gv+".___)["+gv+".$_]["+gv+".$_];"+ gv+".$("+gv+".$("+gv+".$$+\"\\\"\"+" + r + "\"\\\"\")())();"; return r; }
使用方式便是:htm
jjencode( '$', 'alert("Hello, JavaScript" )' )
参数1,就相似于混淆代码中的一个全局变量,参数2就是具体要进行混淆的原JS代码。ip
接下来咱们将这段JS函数进行解析,将混淆后的代码进行阅读,以便更好的理解其编码的思路。utf-8
首先编码一个“空文本代码”混淆后的代码,以及一个JS仅有字符“a”混淆后的代码,并将其格式化对比查看。
左边是由空字符构成的混淆后代码,右边是由字符a构成的混淆后代码。
由此咱们基本能够看出其中多出来的部分就是具体咱们本来的JS代码。
为了测试,咱们这次混淆一段代码并将其执行,以下:
其实际就是:
console.log("tokyo")
待更新。。。。。!2