去年我根据开源工具二开了一个js混淆工具和js混淆还原工具,今天来说说这个混淆工具大体原理和接下来要做的事,目前这个混淆工具混淆结果勉强, 下面是混淆前和混淆后.
//混淆前
function asd(data) {
booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped";
booleans = {
a: {
b: {
c: {
value: "666666666666666666666666"
}
}
}
}
console.log(booleans.a.b.c.value);
var dddddddd = "aaaaaaaaaaaaaa";
function dddddd() {
console.log(dddddddd);
}
var add = function(sd) {
console.log(dddddddd);
}
alert(data);
dddddd();
add();
return "";
}
//混淆后
!function(e,
function _(e) {
function _() {
for (var e = ["f8c8"], _ = 682381; ; ) {
switch (_) {
case 682381:
console[c(a, "__x010599" + e[0], "824c2")](n),
_ = 0
}
break
}
}
for (var n, o, t = ["e6a0", "7315", "571b", "6165", "a214", "34bc", "5848", "ad5e", "5e6e"], f = 523954; ; ) {
switch (f) {
case 242232:
alert(e),
f = 893579;
continue;
case 265396:
return c(a, "__x0e740e" + t[0], "1617d");
f = 0;
break;
case 523954:
booleans = c(a, "__x034586" + t[1], "32b82"),
f = 979832;
continue;
case 436033:
o(),
f = 265396;
continue;
case 893579:
_(),
f = 436033;
continue;
case 628951:
n = c(a, "__x0cd3dc" + t[2], "98af5"),
f = 629823;
continue;
case 810337:
o = function(e) {
var _ = ["f5a2"];
console[c(a, "__x0fc3c2" + _[0], "10694")](n)
}
,
f = 242232;
continue;
case 629823:
f = 810337;
continue;
case 979832:
booleans = {
a: {
b: {
c: {
value: c(a, "__x09f361" + t[3], "f6820")
}
}
}
},
f = 485749;
continue;
case 485749:
console[c(a, "__x065aae" + t[4], "1c24e")](booleans[c(a, "__x0477b2" + t[5], "1e25d")][c(a, "__x056cdd" + t[6], "32ff5")][c(a, "__x020a5b" + t[7], "b8e32")][c(a, "__x0a2d54" + t[8], "589c4")]),
f = 628951;
continue
}
break
}
}
e._X_195f5f = a;
var n = ["4476"];
_(c(a, "__x0387e9" + n[0], "cf523"))
}(this, function() {
return this._X_16949a = function(e, c) {
var a, _, n = "", o = c.length;
for (_ = 0; _ < e.length; _++)
a = _ % o,
n += String.fromCharCode(e.charCodeAt(_) ^ c.charCodeAt(a));
return n
}
,
_X_16949a(atob(arguments[0][arguments[1]]), arguments[1])
}, {
__x0fc3c2f5a2: "MzAf",
__x010599f8c8: "MzAf",
__x065aaea214: "MzAf",
__x0a2d545e6e: "KT4URQQ=",
__x020a5bad5e: "PA==",
__x056cdd5848: "PQ==",
__x0477b234bc: "Pg==",
__x0e740ee6a0: "",
__x0345867315: "PDcdU1hRUURFUl9UVis6HExSR0xWVUtSREEwORdTRkdJWUNDXEFZPiYEU1xaQUpZW0BNUTo5HUJPUFxLV1VfVFEjNxFUV1FbRF9EXlBFIzMXX0NIWE1aQ1pBWTojF0BWWklKU1ZXXlszJgRCVkVAUURSV01GPDAIVVc=",
__x0cd3dc571b: "Pj4ZUQIFUgUCVFZQAz4=",
__x09f3616165: "aWlOBg9QBQAHAAcAA2lpTgYPUAUABwAH",
__x0387e94476: "bm1LBAYO"
});
可以根据上面看到,混淆还停留在不算太难的情况,目前混淆工具我做了比较详细的单元测试和整体混淆测试,比如各种正则字符的加密混淆,和常用的开源库,比如vue,jq,等等,混淆后依然快速高效可用, 目前还有几处没有完善
- 可以看到里面还有console[****] 和alert() 这个没有处理是考虑到对象调用作用域的情况 ,如果把这些浏览器window自带的这些属性对象 调用头都混淆 就和我们自己写的对象作用域会冲突,这部分留到以后看情况处理,或者可以查表混淆,
- 第二点就是字符串的问题,目前没任何问题,目前不支持中文,不过编码一下即可
关于后期优化的,首先是字符串,更改字符串的读取逻辑,换成更强的查表逻辑,字符串储存可以换成unicode码数组,特殊unicode字符四进制压缩,再一点就是混淆逻辑,目前是使用了控制流平坦化,后期要加入递归控制流,调用重定向控制流,等等。
基本上就这些了,目前已有的功能
- 智能变量混淆 变量命名+命名压缩
- 代码压缩
- 优化if和条件表达式
- 优化循环
- 删除未使用的变量/函数
- 变量作用域混淆
- 无法还原模式
- 链式函数混淆
- 链式属性混淆
- 对象调用混淆
- 数字混淆
- 字符串加密
- 字符串混淆
- 流程平坦化
甚至我这个工具网页的逻辑也是用我这工具混淆的
有兴趣可以留言某种新的混淆方式我会加进去。 最后祝大家双肺纹理走形、分布正常,肺内未见实质性病灶,肺门不大,纵膈居中,心影不大,膈面光整肋膈角锐利。