用实际变量名/字符串替换数组映射变量?
我正在尝试编辑Greasemonkey / jQuery脚本。 我不能在这里发布链接。
使用minify对代码进行模糊处理和压缩。
它是这样开始的:
var _0x21e9 = ["\x67\x65\x74\x4D\x6F\x6E\x74\x68", "\x67\x65\x74\x55\x54\x43\x44\x61\x74\x65", ...
在解码之后,我得到了这个:
var _0x21e9=["getMonth","getUTCDate","getFullYear", ...
这是一个巨大的名单(500+)。 然后,它有一些像这样的变量:
month = date[_0x21e9[0]](), day = date[_0x21e9[1]](), ...
_0x21e9 [0]是getMonth,_0x21e9 [1]是getUTCDate等。
是否可以用实际变量名替换方括号? 怎么样?
我对javascript / jQuery知之甚少,无法按照现在的方式“读取”代码。
我只是想使用这个巨大的脚本中的一些函数,并删除我不需要的其他函数。
更新:我尝试使用jsbeautifier.org,如此处和重复的问题所示,但没有改变,除了“缩进”。
它没有用解码的名称替换数组变量。
例如:
- jsbeautifier仍然给出:
month = date[_0x21e9[0]]()
。 - 但我需要:
month = date["getMonth"]()
。
在线反混淆器似乎没有这样做,我怎么办?
有没有办法让我与某人分享代码,至少是其中的一部分? 我看过我不能发贴pastebin,或类似的。 我不能在这里发布完整的代码。
这是代码的另一部分:
$(_0x21e9[8] + vid)[_0x21e9[18]]();
[8]是“。” [18]是“删除”。 手动更换它会产生奇怪的结果。
我还没有看到任何这样做的在线反混淆器,但原理很简单。
构造一个文本filter,用于解析“key”数组,然后用适当的数组值替换该数组所引用的每个实例。
例如,假设你有一个文件, evil.js看起来像这样(你通过jsbeautifier.org运行它与Detect packers and obfuscators?
和Unescape 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);
在这种情况下,“key”变量为_0xf17f
,“key”数组为["(", ")", ...]
。
filter过程如下所示:
- 使用js文件上的文本处理提取密钥名称。 结果:
_0xf17f
-
提取键数组的字符串src。 结果:
keyArrayStr = '["(", ")", \'div\', "createElement", "id", "log", "console"]';
-
在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);
如果你运行该代码 ,你会得到:
var _0x41dcx3 = eval("(" + '{id: 3}' + ")"); var _0x41dcx4 = document["createElement"]("div"); var _0x41dcx5 = _0x41dcx3["id"]; window["console"]["log"](_0x41dcx5);
– 这更容易阅读/理解。
我还创建了一个获取JS源代码的在线页面,并以更加自动化和健壮的方式完成所有3个重新映射步骤。 你可以在以下地址看到它:
jsbin.com/hazevo
(请注意,该工具希望源代码以“key”变量声明开头,就像您的代码示例一样)
@Brock Adams解决方案很棒,但有一个小错误:它没有考虑简单的引用变量。
例:
var _0xbd34 = ["hello ", '"my" world']; (function($) { alert(_0xbd34[0] + _0xbd34[1]) });
如果你试图破译这个例子,它将导致:
alert("hello " + ""my" world")
要解决此问题,只需将replacementSrc.replace编辑为@Brock代码:
replacedSrc = replacedSrc.replace (nameRegex, function (matchStr, p1Str) { var quote = keyArry[parseInt (p1Str, 10)].indexOf('"')==-1? '"' : "'"; return quote + keyArry[ parseInt (p1Str, 10) ] + quote; } );
在这里你有一个修补版本 。
for (var i = 0; i < _0x21e9.length; i++) { var funcName = _0x21e9[i]; _0x21e9[funcName] = funcName; }
这会将所有函数名称添加为数组的键。 允许你这样做
date[_0x21e9["getMonth"]]()