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也可以。

总结一下这三种方式混淆方式的生成工具和应对工具。

混淆方式混淆工具反混淆工具
evalhttp://www.jqueryfuns.com/tools/jsencodehttp://www.jqueryfuns.com/tools/jsencode
javascript-obfuscatorhttps://obfuscator.io/https://github.com/jscck/crack.js
UglifyJShttps://github.com/mishoo/UglifyJS2http://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/
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值