用实际变量名/字符串替换数组映射变量?

nex*_*nex 9 javascript jquery greasemonkey deobfuscation

我正在尝试编辑Greasemonkey/jQuery脚本.我不能在这里发布链接.
使用minify对代码进行模糊处理和压缩.
它是这样开始的:

var _0x21e9 = ["\x67\x65\x74\x4D\x6F\x6E\x74\x68", "\x67\x65\x74\x55\x54\x43\x44\x61\x74\x65", ...
Run Code Online (Sandbox Code Playgroud)

在解码之后,我得到了这个:

var _0x21e9=["getMonth","getUTCDate","getFullYear", ...   
Run Code Online (Sandbox Code Playgroud)

这是一个巨大的名单(500+).然后,它有一些像这样的变量:

 month = date[_0x21e9[0]](), day = date[_0x21e9[1]](), ...
Run Code Online (Sandbox Code Playgroud)

_0x21e9 [0]是getMonth,_0x21e9 [1]是getUTCDate等.

是否可以用实际变量名替换方括号?怎么样?
我对javascript/jQuery知之甚少,无法按照现在的方式"读取"代码.
我只想使用这个巨大脚本中的一些函数并删除其他我不需要的函数.

更新:我尝试使用jsbeautifier.org,如此处和重复的问题所示,但没有改变,除了"缩进".

它没有用解码的名称替换数组变量.
例如:

  1. jsbeautifier仍然给出:month = date[_0x21e9[0]]().
  2. 但我需要:month = date["getMonth"]().

在线反混淆器似乎没有这样做,我怎么能这样做?


有没有办法让我与某人分享代码,至少是其中的一部分?我看过我不能发贴pastebin,或类似的.我不能在这里发布完整的代码.

这是代码的另一部分:

$(_0x21e9[8] + vid)[_0x21e9[18]]();    
Run Code Online (Sandbox Code Playgroud)

[8]是"." [18]是"删除".手动更换它会产生奇怪的结果.

Bro*_*ams 10

我还没有看到任何这样做的在线反混淆器,但原理很简单.
构造一个文本过滤器,用于解析"key"数组,然后用适当的数组值替换该数组所引用的每个实例.

例如,假设你有一个文件,evil.js看起来像这样(你通过jsbeautifier.org运行它,Detect packers and obfuscators?Unescape printable chars...设置了选项):

var _0xf17f = ["(", ")", 'div', "createElement", "id", "log", "console"];
var _0x41dcx3 = eval(_0xf17f[0] + '{id: 3}' + _0xf17f[1]);
var _0x41dcx4 = document[_0xf17f[3]](_0xf17f[2]);
var _0x41dcx5 = _0x41dcx3[_0xf17f[4]];
window[_0xf17f[6]][_0xf17f[5]](_0x41dcx5);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,"key"变量将是_0xf17f"key"数组["(", ")", ...].

过滤器过程如下所示:

  1. 使用js文件上的文本处理提取密钥名称.结果:_0xf17f
  2. 提取键数组的字符串src.结果:

    keyArrayStr = '["(", ")", \'div\', "createElement", "id", "log", "console"]';
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在javascript中,我们可以使用它.replace()来解析JS src的其余部分.像这样:

var keyArrayStr = '["(", ")", \'div\', "createElement", "id", "log", "console"]';
var restOfSrc   = "var _0x41dcx3 = eval(_0xf17f[0] + '{id: 3}' + _0xf17f[1]);\n"
                + "var _0x41dcx4 = document[_0xf17f[3]](_0xf17f[2]);\n"
                + "var _0x41dcx5 = _0x41dcx3[_0xf17f[4]];\n"
                + "window[_0xf17f[6]][_0xf17f[5]](_0x41dcx5);\n"
                ;
var keyArray    = eval (keyArrayStr);
//-- Note that `_0xf17f` is the key name we already determined.
var keyRegExp   = /_0xf17f\s*\[\s*(\d+)\s*\]/g;

var deObsTxt    = restOfSrc.replace (keyRegExp, function (matchStr, p1Str) {
    return '"' + keyArray[ parseInt(p1Str, 10) ] + '"';
} );
console.log (deObsTxt);
Run Code Online (Sandbox Code Playgroud)

如果你运行该代码,你会得到:

var _0x41dcx3 = eval("(" + '{id: 3}' + ")");
var _0x41dcx4 = document["createElement"]("div");
var _0x41dcx5 = _0x41dcx3["id"];
window["console"]["log"](_0x41dcx5);
Run Code Online (Sandbox Code Playgroud)

- 这更容易阅读/理解.


我还创建了一个在线页面,它采用了JS源代码,并以更加自动化和健壮的方式完成了所有3个重映射步骤.您可以在以下位置查看:

jsbin.com/hazevo

(注意,该工具希望源代码以"key"变量声明开头,就像您的代码示例一样)