发票查验平台JS混淆文件反编译原理分析兼谈obfuscator反编译步骤分析
发票查验平台JS混淆文件反编译原理分析兼谈obfuscator反编译步骤分析之所以带上 发票查验平台,是因为,这个 发票查验平台的大多数JS是经过 obfuscator加密混淆的处理过的,对于我自己练练手比较合适。本文只分析 obfuscator混淆反编译的原理方法及步骤,权当是静态分析的一种尝试,不讨论动态调试分析。
obfuscator混淆的特征及几种格式。
为了能够使读者可以明白分析的过程,主要举例几个js例子文件。eab23.js,validate.js 属于一种类型。 eaPqe3.js, VM649.js 属于另外一种类型,
阅读本文前,请注意如下说明:
1. 本文主要使用 eab23.js 和 eaPqe3.js 中的 变量名进行分析说明,否则,只靠文字说明,很难讲明白。
2. 本文属于静态反编译JS文件,对于反编译出来的js文件,再次替换加载到网站中时,会报错,查原因: 可能是js语法有问题,本人对js语法不精通,故不在为了js语法问题,对反编译出来的js文件进行修改。
3. 本人使用EditPlus文本编辑软件,对js文件进行 UTF8 -> ANSI,或 ANSI -> UTF8 格式转换。
4. 使用本文方法之前,请先将js文件存成ANSI编码格式,UTF8格式反编译可能会出错,待反编译js成功后,在使用EditPlus转成UTF8格式。
5. 本文方法适用:无格式化(美化)的js文件。若你的js已经格式化(美化),请自己先处理为无格式化(美化)的js文件,反编译后的文件,为阅读方便,在进行格式化(美化)操作。
一. 特征
先看eab23.js文件头部,是个定义的大数组大概这个样子:(不是这个样式的头部,不适合本文)
var _0x4d2a = ['A8kXwSouyG', 'i2zWzg0', 'W6Smpta', 'jmoCyNb0', 'amkyBSoCW5y', 'W47dTLGTW4JcRNi', 'i3L6Bv91BNvZzv9PBwC', 'pYZdOsG', 'W4bvhtFdRXFcQGa', 'W67dRCojoG', 'mYldOsVdPG', 'rK9Hy0S', 'WORcPmkTW7y', ... ... , 'EgnNC2i', 'W4mboWug', 'WPbecc0', 'CCo7W5/cLa', 'z2v0vgLTzq'];
var _0x5e21 = function(_0x4d2ad2, _0x5e214d) {
_0x4d2ad2 = _0x4d2ad2 - 0x0;
再看eaPqe3.js文件头部,是个定义的大数组大概这个样子:(不是这个样式的头部,不适合本文)
var _0xc03f = ['YnRuLXBpbmsgYnRuLXdoaXRl', 'd2hpdGU=', 'bm8tc2tpbiBza2luLTEgc2tpbi0yIHNraW4tMw==', 'YnRuLXByaW1hcnkgYnRuLXdoaXRl', 'c2tpbg==', 'bm8tc2tpbg==', 'c2tpbi0x', 'MnwxfDB8NHwz', 'LmJ0bg==', ... ... ... , 'YnRuLXN1Y2Nlc3M=', 'YnRuLWluZm8=', 'YnRuLXdhcm5pbmc=', 'YnRuLWRhbmdlcg==', 'bm8tYm9yZGVyIG1hcmdpbi0x', 'LnNpZGViYXItc2hvcnRjdXRzIC5idG4=']; (function(_0x4cd309, _0x19a697) {
var _0x4b7cf2 = function(_0x341b9a) {
while (--_0x341b9a) {
_0x4cd309['push'](_0x4cd309['shift']());
}
};
有了这个样式的头部,基本可以确定是 obfuscator混淆了。
在反编译时,这个变量_0x4d2a或_0xc03f 定义成:ABC 一个大数组,
正确加载这个大数组数据:
eab23.js:定义的数组 _0x4d2a 就是可以拿来使用的数组。
eaPqe3.js: 定义的数组 _0xc03f 经过下面的函数,运算,成为可以正常使用的数组。
(function(_0x4cd309, _0x19a697) { ... ... ... _0x328575(); } (_0xc03f, 0x114));
二. 归类几种加密形式
根据大数组,末尾 ]; 的不同,可以判断出来是哪种类型加密,一共可以归纳出来2种类型,4种加密函数加密。
- 类型一
eab23.js:
... , 'EgnNC2i', 'W4mboWug', 'WPbecc0', 'CCo7W5/cLa', 'z2v0vgLTzq'];
var _0x5e21 = function(_0x4d2ad2, _0x5e214d) {
_0x4d2ad2 = _0x4d2ad2 - 0x0;