1、jsnice 簡介
- jsnice 是一個反混淆利器之一,可以將混淆後的代碼進行更加有好的展示,從而提升代碼的可讀性;
- jsnice 在元素關係的建立上大部分來自於 AST 語法樹,同時採用了概率圖模型進行 推理 和 聯想,通過樣本學習推測出未混淆JS腳本的 概率圖;
jsnice 本質上是一種 機器學習。
- 詳細的工作原理,強烈推薦閱讀一下這篇文章:《 代碼理解之代碼可讀性:代碼反混淆(https://zhuanlan.zhihu.com/p/311907878)》,以加強對其的理解;
2、jsnice 使用實例
- 我們以 jsnice 網站的實例進行說明,下面的代碼,是我們常見的經過混淆處理的代碼:
// 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 進行 nicefy 操作,得到下面的代碼,代碼的變量名、參數名等都被以很友好的方式進行了解讀,代碼可讀性大大提高:
'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 實際上只能處理 80% 的混淆代碼,如果代碼經過 加密壓縮 等方式混淆後, jsnice 反混淆也會失敗,這種情況下我們除非知道其加密算法,否則無法反混淆出來;
jsnice 處理不了經過 複雜加密壓縮混淆 的代碼!
- 複雜的混淆如何處理呢,請參考文章《JS逆向:複雜混淆代碼的處理策略(https://www.jianshu.com/p/318b2da7e75a)》