1、jsnice 簡(jiǎn)介
- jsnice 是一個(gè)反混淆利器之一,可以將混淆后的代碼進(jìn)行更加有好的展示,從而提升代碼的可讀性;
- jsnice 在元素關(guān)系的建立上大部分來(lái)自于 AST 語(yǔ)法樹,同時(shí)采用了概率圖模型進(jìn)行 推理 和 聯(lián)想,通過樣本學(xué)習(xí)推測(cè)出未混淆JS腳本的 概率圖;
jsnice 本質(zhì)上是一種 機(jī)器學(xué)習(xí)。

v2-02f60359336f7352fb24517775e7278d_r.jpg
- 詳細(xì)的工作原理,強(qiáng)烈推薦閱讀一下這篇文章:《 代碼理解之代碼可讀性:代碼反混淆(https://zhuanlan.zhihu.com/p/311907878)》,以加強(qiáng)對(duì)其的理解;
2、jsnice 使用實(shí)例
- 我們以 jsnice 網(wǎng)站的實(shí)例進(jìn)行說明,下面的代碼,是我們常見的經(jīng)過混淆處理的代碼:
// Put your JavaScript here that you want to rename, deobfuscate,
// or infer types for:
function chunkData(e, t) {
var n = [];
var r = e.length;
var i = 0;
for (; i < r; i += t) {
if (i + t < r) {
n.push(e.substring(i, i + t));
} else {
n.push(e.substring(i, r));
}
}
return n;
}
// You can also use some ES6 features.
const get = (a,b) => a.getElementById(b);
- 使用 jsnice 進(jìn)行 nicefy 操作,得到下面的代碼,代碼的變量名、參數(shù)名等都被以很友好的方式進(jìn)行了解讀,代碼可讀性大大提高:
'use strict';
/**
* @param {string} bin
* @param {number} size
* @return {?}
*/
function chunkData(bin, size) {
/** @type {!Array} */
var results = [];
var length = bin.length;
/** @type {number} */
var i = 0;
for (; i < length; i = i + size) {
if (i + size < length) {
results.push(bin.substring(i, i + size));
} else {
results.push(bin.substring(i, length));
}
}
return results;
}
const get = (doc, key) => {
return doc.getElementById(key);
};
3、jsnice 只能處理普通混淆
- jsnice 實(shí)際上只能處理 80% 的混淆代碼,如果代碼經(jīng)過 加密壓縮 等方式混淆后, jsnice 反混淆也會(huì)失敗,這種情況下我們除非知道其加密算法,否則無(wú)法反混淆出來(lái);
jsnice 處理不了經(jīng)過 復(fù)雜加密壓縮混淆 的代碼!
- 復(fù)雜的混淆如何處理呢,請(qǐng)參考文章《JS逆向:復(fù)雜混淆代碼的處理策略(http://www.itdecent.cn/p/318b2da7e75a)》