js混淆與反混淆

介紹幾種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混淆工具地址

  1. https://jscrambler.com/products/code-integrity/javascript-obfuscation
  2. https://obfuscator.io/

再記錄幾個免費的反混淆工具地址

  1. https://beautifier.io/
  2. http://www.jsnice.org/
  3. https://lelinhtinh.github.io/de4js/

參考文章

  1. http://blog.w3cub.com/blog/2019/04/01/js-confusion/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章