介紹幾種js混淆方式
1. eval混淆
js中的eval()方法 就是一個js語言的執行器,它能把字符串解析成javascript的語法進行執行。簡單來說就是把原本的js代碼當成eval方法的參數。據說此方法出來的第一天就被破解了。-_-!! 修改一下代碼,console.log一下就可以了。
原代碼
function add(x,y){
return x+y;
}
eval混淆後的代碼
我們稍微變動一下代碼即可反混淆
控制檯查看dd的值
eval混淆方式也有在線的工具 http://www.jqueryfuns.com/tools/jsencode
2. javascript-obfuscator混淆
原代碼
var p = {
x: 1,
y: 2,
z: function () {
return this.x+this.y
}
};
p.x = 3;
p.y = 4;
p.z();
混淆後代碼
var _0x6ba2 = ['input', 'string', 'while\x20(true)\x20{}', 'length',
'constructor', 'gger', 'call', 'debu', 'stateObject', 'apply',
'function\x20*\x5c(\x20*\x5c)',
'\x5c+\x5c+\x20*(?:_0x(?:[a-f0-9]){4,6}|(?:\x5cb|\x5cd)[a-z0-9]{1,4}(?:\x5cb|\x5cd))',
'init', 'test', 'chain'
];
(function(_0xc6491f, _0xc084d) {
var _0x50d6e0 = function(_0x98dec3) {
while (--_0x98dec3) {
_0xc6491f['push'](_0xc6491f['shift']());
}
};
_0x50d6e0(++_0xc084d);
}(_0x6ba2, 0x153));
var _0xf161 = function(_0x4c8f75, _0x4cbfcc) {
_0x4c8f75 = _0x4c8f75 - 0x0;
var _0x4ccf68 = _0x6ba2[_0x4c8f75];
return _0x4ccf68;
};
var p = {
'x': 0x1,
'y': 0x2,
'z': function() {
var _0x44dbe5 = function() {
var _0x4a3b80 = !![];
return function(_0x50ff3e, _0xe2d703) {
var _0x14cce1 = _0x4a3b80 ? function() {
if (_0xe2d703) {
var _0x327fb9 = _0xe2d703[_0xf161(
'0x0')](_0x50ff3e,
arguments);
_0xe2d703 = null;
return _0x327fb9;
}
} : function() {};
_0x4a3b80 = ![];
return _0x14cce1;
};
}();
(function() {
_0x44dbe5(this, function() {
var _0x35ab8f = new RegExp(_0xf161('0x1'));
var _0x4f8e5a = new RegExp(_0xf161('0x2'),
'i');
var _0x57a95d = _0x2f243c(_0xf161('0x3'));
if (!_0x35ab8f[_0xf161('0x4')](_0x57a95d +
_0xf161('0x5')) || !_0x4f8e5a[
_0xf161('0x4')](_0x57a95d + _0xf161(
'0x6'))) {
_0x57a95d('0');
} else {
_0x2f243c();
}
})();
}());
return this['x'] + this['y'];
}
};
p['x'] = 0x3;
p['y'] = 0x4;
p['z']();
function _0x2f243c(_0x524783) {
function _0x59b7e0(_0x310fdd) {
if (typeof _0x310fdd === _0xf161('0x7')) {
return function(_0x2e1ae9) {} ['constructor'](_0xf161('0x8'))[
'apply']('counter');
} else {
if (('' + _0x310fdd / _0x310fdd)[_0xf161('0x9')] !== 0x1 ||
_0x310fdd % 0x14 === 0x0) {
(function() {
return !![];
} [_0xf161('0xa')]('debu' + _0xf161('0xb'))[_0xf161('0xc')]
('action'));
} else {
(function() {
return ![];
} [_0xf161('0xa')](_0xf161('0xd') + _0xf161('0xb'))[_0xf161(
'0x0')](_0xf161('0xe')));
}
}
_0x59b7e0(++_0x310fdd);
}
try {
if (_0x524783) {
return _0x59b7e0;
} else {
_0x59b7e0(0x0);
}
} catch (_0x39e13d) {}
}
這種混淆方式就複雜了許多,大大降低可讀性。但是仔細分析一下發現,多了一個數組,數組裏存了一些方法名稱。大致思路就是運行的時候 還原方法名再執行。這種加密方式幾乎無法還原成它本來的樣子,只能儘量通過一些工具或方法增加它的可讀性。
此種混淆對應的解決方案可參考 https://github.com/jscck/crack.js
使用jsnice解混淆,再使用crack,再使用jsnice
3. UglifyJS混淆
這種混淆方式實驗了一下,貌似只是替換了一些變量名和去掉了縮進,減少了javascript的體積,屬於壓縮類型的混淆方式。
原代碼
function hello(name){
console.log("hello, ", name)
}
var user = "張三";
hello(user);
混淆後代碼
function hello(l){console.log("hello, ",l)}var user="張三";hello(user);
可能我這裏只是進行了最簡單的壓縮混淆,可以看出和原始基本沒什麼大的變化。這種混淆方式相應的反混淆工具就是專門針對它的 UnuglifyJS 使用在線工具jsnice也可以。
總結一下這三種方式混淆方式的生成工具和應對工具。
混淆方式 | 混淆工具 | 反混淆工具 |
---|---|---|
eval | http://www.jqueryfuns.com/tools/jsencode | http://www.jqueryfuns.com/tools/jsencode |
javascript-obfuscator | https://obfuscator.io/ | https://github.com/jscck/crack.js |
UglifyJS | https://github.com/mishoo/UglifyJS2 | http://jsnice.org |
記錄一下js混淆工具地址
- https://jscrambler.com/products/code-integrity/javascript-obfuscation
- https://obfuscator.io/
再記錄幾個免費的反混淆工具地址
- https://beautifier.io/
- http://www.jsnice.org/
- https://lelinhtinh.github.io/de4js/
參考文章
- http://blog.w3cub.com/blog/2019/04/01/js-confusion/