此前發佈過關於aaencode的混淆編碼,此篇文章繼續說同做者的jjencode混淆編碼的具體過程。javascript
首先是jjencode的做者提供的編碼測試頁:http://utf-8.jp/public/jjenco...html
能夠將任何合法的JavaScript代碼進行編碼,首先咱們能夠簡單測試將如下代碼進行編碼。java
編碼前:函數
alert("Hello, JavaScript" )
編碼後:測試
$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\"\\"+$.__$+$.__$+$.___+$.$$$_+(![]+"")[$._$_]+(![]+"")[$._$_]+$._$+",\\"+$.$__+$.___+"\\"+$.__$+$.__$+$._$_+$.$_$_+"\\"+$.__$+$.$$_+$.$$_+$.$_$_+"\\"+$.__$+$._$_+$._$$+$.$$__+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$$_+$.___+$.__+"\\\"\\"+$.$__+$.___+")"+"\"")())();
可見,編碼後的JS也是頗有意思,僅由符號組成的JS代碼。編碼
經過源代碼,咱們能夠看到具體將JS進行編碼的函數過程,以下所示:spa
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; }
使用方式便是:3d
jjencode( '$', 'alert("Hello, JavaScript" )' )
參數1,就相似於混淆代碼中的一個全局變量,參數2就是具體要進行混淆的原JS代碼。code
接下來咱們將這段JS函數進行解析,將混淆後的代碼進行閱讀,以便更好的理解其編碼的思路。htm
首先編碼一個「空文本代碼」混淆後的代碼,以及一個JS僅有字符「a」混淆後的代碼,並將其格式化對比查看。
左邊是由空字符構成的混淆後代碼,右邊是由字符a構成的混淆後代碼。
由此咱們基本能夠看出其中多出來的部分就是具體咱們本來的JS代碼。
爲了測試,咱們這次混淆一段代碼並將其執行,以下:
其實際就是:
console.log("tokyo")
待更新。。。。