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)》