官方例子分析
上一篇我們已經解釋了jsfuck的基本原理,簡單來說,如果我們想要用jsfuck加密一段可執行代碼,那麼代碼最後應該是這樣的類型:
Function(code)()
在上一篇中我們提到,Function()()這一段可以轉換成如下代碼:
[]["filter"]["constructor"]( )()
那麼,我們就得到了一段完全由“ ()+[]! ”與字符串組合的代碼,接下來我們只需要把字符串也加密成“ ()+[]! ”就可以了!
所需要加密的字符串,包含了所有可顯示字符在此,我們依然拿“ alert(1) ”來舉例:
字符串“ alert(1) ”可拆解爲a、l、e、r、t、(、1、),八個字符,這些字符我們很容易在上一篇文章中找到:
1 => +!+[]
false => ![]
true => !![]
由上可得:
'a' == 'false'[1] == (false + '')[1] == (![]+[])[+!+[]]
'l' == 'false'[2] == (false + '')[2] == (![]+[])[!+[]+!+[]]
'e' == 'true'[0] == (true + '')[3] == (!![]+[])[!+[]+!+[]+!+[]]
'r' == 'true'[0] == (true + '')[1] == (!![]+[])[+!+[]]
't' == 'true'[0] == (true + '')[0] == (!![]+[])[+[]]
則:'alert' == (![]+[])[+!+[]] + (![]+[])[!+[]+!+[]] + (!![]+[])[!+[]+!+[]+!+[]] + (!![]+[])[+!+[]] + (!![]+[])[+[]]
那麼我們如何得到括號字符呢?首先我們要找到包含括號的字符串--方法,方法的基本樣式就是function name (){ code }這樣我們只需要把它轉換成字符串,按照上面的方法實現一遍就行了。jsfuck官方給出的方法是:
([][[]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[!+[]+!+[]+[!+[]+!+[]]]
拆分可得:
(undefined + []['fill'])['22'] == "undefinedfunction fill() { [native code] }"['22']
這裏只是用了數組的fill方法,和方法本身沒有關係,換成find沒有影響,一樣可以得到括號。即:
(undefined + []['find'])['22'] == "undefinedfunction find() { [native code] }"['22']
既然得到了左括號,那麼右括號只需要把數字22改成23就可以得到,即:
([+[]]+![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[!+[]+!+[]+[+[]]]
把以上加密後的代碼組合(部分代碼記得加上括號),我們便得到了:
(![]+[])[+!+[]] + (![]+[])[!+[]+!+[]] + (!![]+[])[!+[]+!+[]+!+[]] + (!![]+[])[+!+[]] + (!![]+[])[+[]]+([][[]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[!+[]+!+[]+[!+[]+!+[]]]+(+!+[])+([+[]]+![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[!+[]+!+[]+[+[]]] == 'alert(1)'
到目前爲止,字符串我們已經拿到了,接下來只需要按照上面的方法,拿到Function就行了,最終組合成:
[]["filter"]["constructor"]('alert(1)')() == Function('alert(1)')()
這樣一個完美的jsfuck加密代碼已經完成了!