最近发票查验平台的JS在抓取时,发现JS的内容 被混淆了,一头雾水,整个文件成了这样的样式:即使格式化,美化之后,依然,如此:
return _0x23666d[_0x3d8c('0x299', '@g[H')](_0x23666d[_0x3d8c('0x29a', 'f])s')](_0x205ff1[_0x3d8c('0x197', '*up9')](_0x23666d['RJaFV']($['cs'][_0x3d8c('0x29b', 'e6Te')](_0x23666d[_0x3d8c('0x29c', 'tYe)')](_0x14f1f5, _0x2a1439[_0x3d8c('0x29d', 'aGUp')](_0x205ff1[_0x3d8c('0x29e', '3C*E')](_0x23666d[_0x3d8c('0x29f', 'StyP')](_0x23666d['vUtLx'](_0x52c3d0, _0x53991d[_0x3d8c('0x2a0', 'K%$d')]) + _0x397dcb, _0x397dcb[_0x3d8c('0x107', 'e6Te')]))))) + _0x205ff1['xx'](_0x23666d['vUtLx'](_0x14f1f5, _0x21500b)), _0x21500b)), _0x2a1439[_0x3d8c('0x2a1', '*#dB')](_0x205ff1['xx'](_0x23666d['vUtLx'](_0x52c3d0, _0x21500b)), _0x205ff1[_0x3d8c('0x190', 'f])s')](_0x397dcb))), _0x205ff1[_0x3d8c('0x175', '*94i')](_0x23666d[_0x3d8c('0x2a2', 'aGUp')](_0x2673e3, _0x21500b))[_0x3d8c('0x2a3', 'xip4')]());
网上查了一下,有几位高手,做了反混淆还原的,还是不错的,但对于有的混淆JS文件,还原不了,或者,丢失了部分代码。
怎么办,只有自己动手了。分析每个JS头部:
var _0x3d13 = ['w6tcJcOAbg==', 'wqdYwrEWLw==', 'w7shOQ0B', 'QMKFw7/DmMKP', 'cB1PwpoA', 'w7Z7DMK4XMKGwo4zJcOCw6vCrTnCq8OifMOWwqTCog==', 'wrgufwZP', 'w6PDmgjDpMK0', 'MUzDkcOWFA==', 'bcKLCcKaaw==',。。。。。。
定义了一个大数组。不要认为,这个数组可以拿来使用,那就错了。
分析JS文件头部,发现:
(function(_0x589f7e, _0x199a91) {
var _0x4053b2 = function(_0x5c43c0) {
while (--_0x5c43c0) {
_0x589f7e['push'](_0x589f7e['shift']());
}
};
var _0x464fe7 = function(_0x582ef9, _0x14b5d0) {
_0x582ef9(++_0x14b5d0);
};
_0x464fe7(_0x4053b2, _0x199a91);
}(_0x3d13, 0x187));
var _0x3d8c = function(_0x17ddb8, _0x230eed) {
_0x17ddb8 = _0x17ddb8 - 0x0;
var _0x10d5f3 = _0x3d13[_0x17ddb8];
if (_0x3d8c['WGiXiH'] === undefined) {
(function() {
var _0x26a4de;
try {
var _0x443e41 = Function('return\x20(function()\x20' + '{}.constructor(\x22return\x20this\x22)(\x20)' + ');');
_0x26a4de = _0x443e41();
} catch (_0x4993de) {
_0x26a4de = window;
}
var _0x18e5dc = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
_0x26a4de['atob'] || (_0x26a4de['atob'] = function(_0x23e847) {
var _0x5c40ce = String(_0x23e847)['replace'](/=+$/, '');
for (var _0x14720a = 0x0, _0x184255, _0x229160, _0x21476a = 0x0, _0x5a68a3 = ''; _0x229160 = _0x5c40ce['charAt'](_0x21476a++); ~_0x229160 && (_0x184255 = _0x14720a % 0x4 ? _0x184255 * 0x40 + _0x229160 : _0x229160,
_0x14720a++ % 0x4) ? _0x5a68a3 += String['fromCharCode'](0xff & _0x184255 >> (-0x2 * _0x14720a & 0x6)) : 0x0) {
_0x229160 = _0x18e5dc['indexOf'](_0x229160);
}
return _0x5a68a3;
}
);
}());
var _0x36b965 = function(_0x4ae65f, _0x1310de) {
var _0xa3b65e = [], _0x190871 = 0x0, _0x2884aa, _0x520f67 = '', _0x4a236d = '';
_0x4ae65f = atob(_0x4ae65f);
for (var _0x3547ad = 0x0, _0x29dbd4 = _0x4ae65f['length']; _0x3547ad < _0x29dbd4; _0x3547ad++) {
_0x4a236d += '%' + ('00' + _0x4ae65f['charCodeAt'](_0x3547ad)['toString'](0x10))['slice'](-0x2);
}
_0x4ae65f = decodeURIComponent(_0x4a236d);
for (var _0x4dde59 = 0x0; _0x4dde59 < 0x100; _0x4dde59++) {
_0xa3b65e[_0x4dde59] = _0x4dde59;
}
for (_0x4dde59 = 0x0; _0x4dde59 < 0x100; _0x4dde59++) {
_0x190871 = (_0x190871 + _0xa3b65e[_0x4dde59] + _0x1310de['charCodeAt'](_0x4dde59 % _0x1310de['length'])) % 0x100;
_0x2884aa = _0xa3b65e[_0x4dde59];
_0xa3b65e[_0x4dde59] = _0xa3b65e[_0x190871];
_0xa3b65e[_0x190871] = _0x2884aa;
}
_0x4dde59 = 0x0;
_0x190871 = 0x0;
for (var _0x1da148 = 0x0; _0x1da148 < _0x4ae65f['length']; _0x1da148++) {
_0x4dde59 = (_0x4dde59 + 0x1) % 0x100;
_0x190871 = (_0x190871 + _0xa3b65e[_0x4dde59]) % 0x100;
_0x2884aa = _0xa3b65e[_0x4dde59];
_0xa3b65e[_0x4dde59] = _0xa3b65e[_0x190871];
_0xa3b65e[_0x190871] = _0x2884aa;
_0x520f67 += String['fromCharCode'](_0x4ae65f['charCodeAt'](_0x1da148) ^ _0xa3b65e[(_0xa3b65e[_0x4dde59] + _0xa3b65e[_0x190871]) % 0x100]);
}
return _0x520f67;
};
_0x3d8c['irBVyt'] = _0x36b965;
_0x3d8c['zWQfZu'] = {};
_0x3d8c['WGiXiH'] = !![];
}
var _0x198517 = _0x3d8c['zWQfZu'][_0x17ddb8];
if (_0x198517 === undefined) {
if (_0x3d8c['bbImyS'] === undefined) {
var _0x3b8850 = function(_0x57a92e) {
this['HEozUV'] = _0x57a92e;
this['ZZknVa'] = [0x1, 0x0, 0x0];
this['xwMpUJ'] = function() {
return 'newState';
}
;
this['phHTpU'] = '\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*';
this['yxsFwC'] = '[\x27|\x22].+[\x27|\x22];?\x20*}';
};
_0x3b8850['prototype']['ebxGud'] = function() {
var _0x234ca6 = new RegExp(this['phHTpU'] + this['yxsFwC']);
//var _0x3f03cf = _0x234ca6['test'](this['xwMpUJ']['toString']()) ? --this['ZZknVa'][0x1] : --this['ZZknVa'][0x0];
var _0x3f03cf = -1;
return this['LeLNeI'](_0x3f03cf);
}
;
_0x3b8850['prototype']['LeLNeI'] = function(_0x370b79) {
if (!Boolean(~_0x370b79)) {
return _0x370b79;
}
return this['JErunj'](this['HEozUV']);
}
;
_0x3b8850['prototype']['JErunj'] = function(_0x235751) {
for (var _0x4a6b70 = 0x0, _0x12e50d = this['ZZknVa']['length']; _0x4a6b70 < _0x12e50d; _0x4a6b70++) {
this['ZZknVa']['push'](Math['round'](Math['random']()));
_0x12e50d = this['ZZknVa']['length'];
}
return _0x235751(this['ZZknVa'][0x0]);
}
;
new _0x3b8850(_0x3d8c)['ebxGud']();
_0x3d8c['bbImyS'] = !![];
}
_0x10d5f3 = _0x3d8c['irBVyt'](_0x10d5f3, _0x230eed);
_0x3d8c['zWQfZu'][_0x17ddb8] = _0x10d5f3;
} else {
_0x10d5f3 = _0x198517;
}
return _0x10d5f3;
};
这个代码在浏览器下,是正常的,放到EditPlus里,浏览,就是不行,好在现在的浏览器都有开发功能跟踪,直接修改:
(function(_0x589f7e, _0x199a91) {
var _0x4053b2 = function(_0x5c43c0) {
while (--_0x5c43c0) {
_0x589f7e['push'](_0x589f7e['shift']());
}
};
var _0x464fe7 = function(_0x582ef9, _0x14b5d0) {
_0x582ef9(++_0x14b5d0);
};
_0x464fe7(_0x4053b2, _0x199a91);
}(_0x3d13, 0x187));
var _0x3f03cf = _0x234ca6['test'](this['xwMpUJ']['toString']()) ? --this['ZZknVa'][0x1] : --this['ZZknVa'][0x0];
修改成
var _0x3f03cf = -1;
这样过来检测浏览器的关;
将以上内容做成一个脚本,方便,非JS语言的调用;
增加一条js 最后,
var abc = _0x3d8c('0x8fe', '1np2');
注意,后面 _0x3d8c(‘0x8fe’, ‘1np2’) 不是固定的,是JS文件中,很多这样的 _0x3d8c(‘0x147’, ‘c!jj’), _0x3d8c(‘0x14c’, ‘tYe)’)*
这样我们就可以替换,这些返回的值,替换后的文件,可读性,就相对好些了,做移植也容易了
return _0x23666d['RJaFV'](_0x23666d['RJaFV'](_0x205ff1["encrypt"](_0x23666d['RJaFV']($['cs']['encode'](_0x23666d['VhRUO'](_0x14f1f5, _0x2a1439['moveTo'](_0x205ff1["encrypt"](_0x23666d['vUtLx'](_0x23666d['vUtLx'](_0x52c3d0, _0x53991d['length']) + _0x397dcb, _0x397dcb['length']))))) + _0x205ff1['xx'](_0x23666d['vUtLx'](_0x14f1f5, _0x21500b)), _0x21500b)), _0x2a1439['gen'](_0x205ff1['xx'](_0x23666d['vUtLx'](_0x52c3d0, _0x21500b)), _0x205ff1["encrypt"](_0x397dcb))), _0x205ff1["encrypt"](_0x23666d['PPcKI'](_0x2673e3, _0x21500b))['toUpperCase']()); //hxxc
'RJaFV': function(_0x37841e, _0x41336e) {
return _0x37841e + _0x41336e;
},
写一个小程序:调用 js脚本,查询 替换所有 **_0x3d8c( )**函数,ok。
这个js:
var _0x3d13 = ['w6tcJcOAbg==', 'wqdYwrEWLw==', 'w7shOQ0B', ,,,,,,,,,**自己补齐数组**
(function(_0x589f7e, _0x199a91) {
var _0x4053b2 = function(_0x5c43c0) {
while (--_0x5c43c0) {
_0x589f7e['push'](_0x589f7e['shift']());
}
};
var _0x464fe7 = function(_0x582ef9, _0x14b5d0) {
_0x582ef9(++_0x14b5d0);
};
_0x464fe7(_0x4053b2, _0x199a91);
}(_0x3d13, 0x187));
var _0x3d8c = function(_0x17ddb8, _0x230eed) {
_0x17ddb8 = _0x17ddb8 - 0x0;
var _0x10d5f3 = _0x3d13[_0x17ddb8];
if (_0x3d8c['WGiXiH'] === undefined) {
(function() {
var _0x26a4de;
try {
var _0x443e41 = Function('return\x20(function()\x20' + '{}.constructor(\x22return\x20this\x22)(\x20)' + ');');
_0x26a4de = _0x443e41();
} catch (_0x4993de) {
_0x26a4de = window;
}
var _0x18e5dc = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
_0x26a4de['atob'] || (_0x26a4de['atob'] = function(_0x23e847) {
var _0x5c40ce = String(_0x23e847)['replace'](/=+$/, '');
for (var _0x14720a = 0x0, _0x184255, _0x229160, _0x21476a = 0x0, _0x5a68a3 = ''; _0x229160 = _0x5c40ce['charAt'](_0x21476a++); ~_0x229160 && (_0x184255 = _0x14720a % 0x4 ? _0x184255 * 0x40 + _0x229160 : _0x229160,
_0x14720a++ % 0x4) ? _0x5a68a3 += String['fromCharCode'](0xff & _0x184255 >> (-0x2 * _0x14720a & 0x6)) : 0x0) {
_0x229160 = _0x18e5dc['indexOf'](_0x229160);
}
return _0x5a68a3;
}
);
}());
var _0x36b965 = function(_0x4ae65f, _0x1310de) {
var _0xa3b65e = [], _0x190871 = 0x0, _0x2884aa, _0x520f67 = '', _0x4a236d = '';
_0x4ae65f = atob(_0x4ae65f);
for (var _0x3547ad = 0x0, _0x29dbd4 = _0x4ae65f['length']; _0x3547ad < _0x29dbd4; _0x3547ad++) {
_0x4a236d += '%' + ('00' + _0x4ae65f['charCodeAt'](_0x3547ad)['toString'](0x10))['slice'](-0x2);
}
_0x4ae65f = decodeURIComponent(_0x4a236d);
for (var _0x4dde59 = 0x0; _0x4dde59 < 0x100; _0x4dde59++) {
_0xa3b65e[_0x4dde59] = _0x4dde59;
}
for (_0x4dde59 = 0x0; _0x4dde59 < 0x100; _0x4dde59++) {
_0x190871 = (_0x190871 + _0xa3b65e[_0x4dde59] + _0x1310de['charCodeAt'](_0x4dde59 % _0x1310de['length'])) % 0x100;
_0x2884aa = _0xa3b65e[_0x4dde59];
_0xa3b65e[_0x4dde59] = _0xa3b65e[_0x190871];
_0xa3b65e[_0x190871] = _0x2884aa;
}
_0x4dde59 = 0x0;
_0x190871 = 0x0;
for (var _0x1da148 = 0x0; _0x1da148 < _0x4ae65f['length']; _0x1da148++) {
_0x4dde59 = (_0x4dde59 + 0x1) % 0x100;
_0x190871 = (_0x190871 + _0xa3b65e[_0x4dde59]) % 0x100;
_0x2884aa = _0xa3b65e[_0x4dde59];
_0xa3b65e[_0x4dde59] = _0xa3b65e[_0x190871];
_0xa3b65e[_0x190871] = _0x2884aa;
_0x520f67 += String['fromCharCode'](_0x4ae65f['charCodeAt'](_0x1da148) ^ _0xa3b65e[(_0xa3b65e[_0x4dde59] + _0xa3b65e[_0x190871]) % 0x100]);
}
return _0x520f67;
};
_0x3d8c['irBVyt'] = _0x36b965;
_0x3d8c['zWQfZu'] = {};
_0x3d8c['WGiXiH'] = !![];
}
var _0x198517 = _0x3d8c['zWQfZu'][_0x17ddb8];
if (_0x198517 === undefined) {
if (_0x3d8c['bbImyS'] === undefined) {
var _0x3b8850 = function(_0x57a92e) {
this['HEozUV'] = _0x57a92e;
this['ZZknVa'] = [0x1, 0x0, 0x0];
this['xwMpUJ'] = function() {
return 'newState';
}
;
this['phHTpU'] = '\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*';
this['yxsFwC'] = '[\x27|\x22].+[\x27|\x22];?\x20*}';
};
_0x3b8850['prototype']['ebxGud'] = function() {
var _0x234ca6 = new RegExp(this['phHTpU'] + this['yxsFwC']);
//var _0x3f03cf = _0x234ca6['test'](this['xwMpUJ']['toString']()) ? --this['ZZknVa'][0x1] : --this['ZZknVa'][0x0];
var _0x3f03cf = -1;
return this['LeLNeI'](_0x3f03cf);
}
;
_0x3b8850['prototype']['LeLNeI'] = function(_0x370b79) {
if (!Boolean(~_0x370b79)) {
return _0x370b79;
}
return this['JErunj'](this['HEozUV']);
}
;
_0x3b8850['prototype']['JErunj'] = function(_0x235751) {
for (var _0x4a6b70 = 0x0, _0x12e50d = this['ZZknVa']['length']; _0x4a6b70 < _0x12e50d; _0x4a6b70++) {
this['ZZknVa']['push'](Math['round'](Math['random']()));
_0x12e50d = this['ZZknVa']['length'];
}
return _0x235751(this['ZZknVa'][0x0]);
}
;
new _0x3b8850(_0x3d8c)['ebxGud']();
_0x3d8c['bbImyS'] = !![];
}
_0x10d5f3 = _0x3d8c['irBVyt'](_0x10d5f3, _0x230eed);
_0x3d8c['zWQfZu'][_0x17ddb8] = _0x10d5f3;
} else {
_0x10d5f3 = _0x198517;
}
return _0x10d5f3;
};
var abc = _0x3d8c('0x8fe', '1np2');
需要注意的是,对于不同的js文件,_0x3d13 ,_0x3d8c 是不同的。
分析到这里。