1. eval 混淆
Javascript 提供了將字符串當(dāng)做代碼執(zhí)行(evaluate)
的能力季俩,可以通過 Function
構(gòu)造器、eval
、setTimeout
同廉、setInterval
將字符串傳遞給 js 引擎進(jìn)行解析執(zhí)行埋心。其最明顯的特征是生成的代碼以 eval(function(p,a,c,k,...){...})
開頭指郁。
這類混淆的關(guān)鍵思想在于將需要執(zhí)行的代碼進(jìn)行一次編碼,在執(zhí)行的時(shí)候還原出瀏覽器可執(zhí)行的合法的腳本拷呆,然后執(zhí)行之闲坎,看上去和可執(zhí)行文件的加殼有那么點(diǎn)類似。
逆向特征
- 無論代碼如何進(jìn)行變形,其最終都要調(diào)用一次
eval
房官、throw
等函數(shù)苍碟。 - 解密的方法不需要對(duì)其算法做任何分析,只需要簡(jiǎn)單地找到這個(gè)最終的調(diào)用悯恍,改為
console.log
或者其他方式,將程序解碼后的結(jié)果按照字符串輸出即可伙狐。 - 關(guān)鍵字:
eval
涮毫、throw
;
2. AA 混淆
有如下 js 代碼:
var test = function(x){console.log(x)}
test('1')
使用 https://www.jsjiami.com/aaencode.html
工具贷屎,經(jīng)過 AA 混淆后得到:
?ω??= /`m′)? ~┻━┻ //*′?`*/ ['_']; 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))+ (o^_^o)+ (?Д?)[?ε?]+(?Θ?)+ ((o^_^o) +(o^_^o))+ (???)+ (?Д?)[?ε?]+(???)+ (c^_^o)+ (?Д?)[?ε?]+((???) + (o^_^o))+ ((???) + (?Θ?))+ (?Д?)[?ε?]+(???)+ (c^_^o)+ (?Д?)[?ε?]+(?Θ?)+ (???)+ ((o^_^o) +(o^_^o))+ (?Д?)[?ε?]+(?Θ?)+ ((o^_^o) +(o^_^o))+ ((???) + (?Θ?))+ (?Д?)[?ε?]+(?Θ?)+ ((???) + (?Θ?))+ ((o^_^o) +(o^_^o))+ (?Д?)[?ε?]+(?Θ?)+ (???)+ (o^_^o)+ (?Д?)[?ε?]+(?Θ?)+ ((o^_^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^_^o))+ (?Д?)[?ε?]+(?Θ?)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (?Д?)[?ε?]+(?Θ?)+ ((???) + (?Θ?))+ ((???) + (o^_^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^_^o))+ (o^_^o)+ (?Д?)[?ε?]+(?Θ?)+ ((o^_^o) +(o^_^o))+ (???)+ (?Д?)[?ε?]+((???) + (?Θ?))+ (c^_^o)+ (?Д?)[?ε?]+(???)+ ((???) + (o^_^o))+ (?Д?)[?ε?]+((o^_^o) +(o^_^o))+ (?Θ?)+ (?Д?)[?ε?]+(???)+ ((???) + (o^_^o))+ (?Д?)[?ε?]+((???) + (?Θ?))+ (?Θ?)+ (?Д?)[?o?]) (?Θ?)) ('_');
經(jīng)過美化后罢防,展示如下:
?ω?? = /`m′)? ~┻━┻ //*′?`*/
['_'];
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)) + (o ^ _ ^ o) + (?Д?)[?ε?] + (?Θ?) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (???) + (?Д?)[?ε?] + (???) + (c ^ _ ^ o) + (?Д?)[?ε?] + ((???) + (o ^ _ ^ o)) + ((???) + (?Θ?)) + (?Д?)[?ε?] + (???) + (c ^ _ ^ o) + (?Д?)[?ε?] + (?Θ?) + (???) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (?Д?)[?ε?] + (?Θ?) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ((???) + (?Θ?)) + (?Д?)[?ε?] + (?Θ?) + ((???) + (?Θ?)) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (?Д?)[?ε?] + (?Θ?) + (???) + (o ^ _ ^ o) + (?Д?)[?ε?] + (?Θ?) + ((o ^ _ ^ 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 ^ _ ^ o)) + (?Д?)[?ε?] + (?Θ?) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (o ^ _ ^ o) + (?Д?)[?ε?] + (?Θ?) + ((???) + (?Θ?)) + ((???) + (o ^ _ ^ 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 ^ _ ^ o)) + (o ^ _ ^ o) + (?Д?)[?ε?] + (?Θ?) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (???) + (?Д?)[?ε?] + ((???) + (?Θ?)) + (c ^ _ ^ o) + (?Д?)[?ε?] + (???) + ((???) + (o ^ _ ^ o)) + (?Д?)[?ε?] + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (?Θ?) + (?Д?)[?ε?] + (???) + ((???) + (o ^ _ ^ o)) + (?Д?)[?ε?] + ((???) + (?Θ?)) + (?Θ?) + (?Д?)[?o?])(?Θ?))('_');
反混淆工具
注意:不同站點(diǎn)的混淆工具,得到的混淆結(jié)果不盡相同唉侄,在一個(gè)站點(diǎn)生成的混淆代碼咒吐,在另一站點(diǎn)不一定能反混淆成功。
https://www.qtool.net/decode
https://cat-in-136.github.io/2010/12/aadecode-decode-encoded-as-aaencode.html
http://www.hiencode.com/jjencode.html
3. JJ 混淆
有如下 js 代碼:
var test = function(x){console.log(x)}
test('1');
設(shè)全局變量 $
,經(jīng)過 jj 混淆后將代碼如下:
$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+"\\"+$.__$+$.$$_+$.$$_+$.$_$_+"\\"+$.__$+$.$$_+$._$_+"\\"+$.$__+$.___+$.__+$.$$$_+"\\"+$.__$+$.$$_+$._$$+$.__+"\\"+$.$__+$.___+"=\\"+$.$__+$.___+$.$$$$+$._+"\\"+$.__$+$.$_$+$.$$_+$.$$__+$.__+"\\"+$.__$+$.$_$+$.__$+$._$+"\\"+$.__$+$.$_$+$.$$_+"(\\"+$.__$+$.$$$+$.___+"){"+$.$$__+$._$+"\\"+$.__$+$.$_$+$.$$_+"\\"+$.__$+$.$$_+$._$$+$._$+(![]+"")[$._$_]+$.$$$_+"."+(![]+"")[$._$_]+$._$+"\\"+$.__$+$.$__+$.$$$+"(\\"+$.__$+$.$$$+$.___+")}\\"+$.__$+$._$_+$.__+$.$$$_+"\\"+$.__$+$.$$_+$._$$+$.__+"('"+$.__$+"');"+"\"")())();
美化展示恬叹,得到下面的代碼:
$ = ~[];
$ = {
___: ++$,
$$$$: (![] + "")[$],
__$: ++$,
$_$_: (![] + "")[$],
_$_: ++$,
$_$$: ({} + "")[$],
$$_$: ($[$] + "")[$],
_$$: ++$,
$$$_: (!"" + "")[$],
$__: ++$,
$_$: ++$,
$$__: ({} + "")[$],
$$_: ++$,
$$$: ++$,
$___: ++$,
$__$: ++$
};
$.$_ = ($.$_ = $ + "")[$.$_$] + ($._$ = $.$_[$.__$]) + ($.$$ = ($.$ + "")[$.__$]) + ((!$) + "")[$._$$] + ($.__ = $.$_[$.$$_]) + ($.$ = (!"" + "")[$.__$]) + ($._ = (!"" + "")[$._$_]) + $.$_[$.$_$] + $.__ + $._$ + $.$;
$.$$ = $.$ + (!"" + "")[$._$$] + $.__ + $._ + $.$ + $.$$;
$.$ = ($.___)[$.$_][$.$_];
$.$($.$($.$$ + "\"" + "\\" + $.__$ + $.$$_ + $.$$_ + $.$_$_ + "\\" + $.__$ + $.$$_ + $._$_ + "\\" + $.$__ + $.___ + $.__ + $.$$$_ + "\\" + $.__$ + $.$$_ + $._$$ + $.__ + "\\" + $.$__ + $.___ + "=\\" + $.$__ + $.___ + $.$$$$ + $._ + "\\" + $.__$ + $.$_$ + $.$$_ + $.$$__ + $.__ + "\\" + $.__$ + $.$_$ + $.__$ + $._$ + "\\" + $.__$ + $.$_$ + $.$$_ + "(\\" + $.__$ + $.$$$ + $.___ + "){" + $.$$__ + $._$ + "\\" + $.__$ + $.$_$ + $.$$_ + "\\" + $.__$ + $.$$_ + $._$$ + $._$ + (![] + "")[$._$_] + $.$$$_ + "." + (![] + "")[$._$_] + $._$ + "\\" + $.__$ + $.$__ + $.$$$ + "(\\" + $.__$ + $.$$$ + $.___ + ")}\\" + $.__$ + $._$_ + $.__ + $.$$$_ + "\\" + $.__$ + $.$$_ + $._$$ + $.__ + "('" + $.__$ + "');" + "\"")())();
注意:美化后的 jj 混淆代碼可能無法進(jìn)行直接解碼候生。
使用 http://www.hiencode.com/jjencode.html
解碼工具,將美化后的 jj 混淆代碼進(jìn)行 decode 解碼時(shí)绽昼,會(huì)有 no match
報(bào)錯(cuò)唯鸭,如下圖:
而如果 jj 混淆代碼是未經(jīng)美化的,那就可以順利的解碼硅确,如下圖:
4. jsfuck
參見:《JS逆向:jsfuck 技術(shù)原理解析》目溉。
5. 隱寫術(shù)
嚴(yán)格說這不能稱之為混淆,只是將 js 代碼隱藏到了特定的介質(zhì)當(dāng)中菱农。如通過最低有效位(LSB)算法嵌入到圖片的 RGB 通道缭付、隱藏在圖片 EXIF 元數(shù)據(jù)、隱藏在 HTML 空白字符等循未。
比如這個(gè)聳人聽聞的議題:《一張圖片黑掉你》在圖片中嵌入惡意程序蛉腌,正是使用了最低有效位平面算法。結(jié)合 HTML5 的 canvas 或者處理二進(jìn)制數(shù)據(jù)的 TypeArray只厘,腳本可以抽取出載體中隱藏的數(shù)據(jù)(如代碼)烙丛。
6. 復(fù)雜表達(dá)式
代碼混淆不一定會(huì)調(diào)用 eval,也可以通過在代碼中填充無效的指令來增加代碼復(fù)雜度羔味,極大地降低可讀性河咽。Javascript 中存在許多稱得上喪心病狂的特性,這些特性組合起來赋元,可以把原本簡(jiǎn)單的字面量(Literal)忘蟹、成員訪問(MemberExpression)、函數(shù)調(diào)用(CallExpression)等代碼片段變得難以閱讀搁凸。
舉個(gè)簡(jiǎn)單的例子媚值,可能會(huì)更好理解:
- 訪問一個(gè)對(duì)象的成員有兩種方法——點(diǎn)運(yùn)算符和下標(biāo)運(yùn)算符。調(diào)用
window
的eval
方法护糖,既可以寫成window.eval()
褥芒,也可以window[‘eval’]
; - 為了讓代碼更變態(tài)一些嫡良,混淆器選用第二種寫法锰扶,然后再在字符串字面量上做文章。先把字符串拆成幾個(gè)部分:
’e’ + ‘v’ + ‘a(chǎn)l’
寝受; - 這樣看上去還是很明顯坷牛,再利用一個(gè)數(shù)字進(jìn)制轉(zhuǎn)換的技巧:
14..toString(15) + 31..toString(32) + 0xf1.toString(22)
; - 一不做二不休很澄,把數(shù)字也展開:
(0b1110).toString(4<<2) + (‘ ‘.charCodeAt() - 1).toString(Math.log(0x100000000) / Math.log(2)) + 0xf1.toString(11 << 1)
京闰; - 最后的效果:
window[(2*7).toString(4<<2) + (‘ ‘.charCodeAt() - 1).toString(Math.log(0x100000000) / Math.log(2)) + 0xf1.toString(11 << 1)](http://jartto.wang/2017/10/31/js-anti-aliasing/'alert(1)‘)
在 js 中可以找到許多這樣互逆的運(yùn)算颜及,通過使用隨機(jī)生成的方式將其組合使用,可以把簡(jiǎn)單的表達(dá)式無限復(fù)雜化蹂楣。
- 隱寫的方式同樣需要解碼程序和動(dòng)態(tài)執(zhí)行俏站,所以破解的方式和前者相同,在瀏覽器上下文中劫持替換關(guān)鍵函數(shù)調(diào)用的行為捐迫,改為文本輸出即可得到載體中隱藏的代碼乾翔。
7. ob 混淆
TODO