Заменить преобразованные в массив переменные фактическим именем / строкой переменной?

Я пытаюсь отредактировать сценарий 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, как было предложено здесь и в дублированном вопросе, но ничего не изменилось, кроме «отступа».

Он не заменял переменные массива декодированными именами.
Например:

  1. jsbeautifier по-прежнему дает: month = date[_0x21e9[0]]().
  2. Но мне нужно: month = date["getMonth"]().

Похоже, что ни один из онлайн-деобфускаторов этого не делает, как я могу?


Есть ли способ поделиться кодом с кем-нибудь, по крайней мере, его частью? Я читал, что не могу опубликовать здесь pastebin или подобное. Я не могу выложить здесь полный код.

Вот еще одна часть кода:

$(_0x21e9[8] + vid)[_0x21e9[18]]();    

[8] - это "." и [18] - «удалить». Ручная замена дает странный результат.


person nex    schedule 23.12.2014    source источник
comment
Зачем вам заменять квадратные скобки фактическим именем переменной? Какова будет точка доступа к переменной с именем _0x21e9getMonth для получения строки getMonth. ?   -  person hofan41    schedule 23.12.2014
comment
Это огромный список из 500+ строк. Чтобы знать, что [0] - это getMonth, мне нужно вручную проверить список и посчитать. Если это [500], мне нужно будет считать строки, разделенные запятой. Как я могу это сделать? Это не мой сценарий, я просто хочу удалить то, что не буду использовать.   -  person nex    schedule 23.12.2014
comment
Этот код довольно "запутанный" ... Вы пытаетесь расшифровать чей-то javascript и использовать его? Это означает, что этот код, вероятно, был запутан по какой-то причине, и если вы знаете, кто это сделал, они могут так же легко вернуть его.   -  person BuddhistBeast    schedule 23.12.2014
comment
Это не мой сценарий. Он добавляет некоторые функции к форуму, который я использую, например, блокирование пользователей, добавление некоторых меню и т. Д. Я хочу удалить все это и оставить только функцию обновления страницы. Некоторые пользователи даже говорили, что это кейлоггер. Я просто хочу убрать некоторые функции для личного пользования, даже скрипт сюда не выкладывал.   -  person nex    schedule 23.12.2014
comment
Хорошо, я вижу, что это новая морщина в стандартных вопросах деобфускации. Чтобы делать то, что вы хотите, вам нужно будет написать фильтр для анализа текста JS, подставляя значения массива - в основном, автоматический поиск и замену. Я ухожу в офлайн, но через несколько часов отправлю ответ, если меня не опередят.   -  person Brock Adams    schedule 24.12.2014
comment
PS: Совершенно нормально сделать ссылку на PasteBin, и в этом случае это поможет. Единственное требование - вопрос должен стоять сам по себе, как будто pastebin никогда не существовал.   -  person Brock Adams    schedule 24.12.2014
comment
Это не, что запутано. Я видел гораздо хуже. Но потом вы понимаете, что это PITA для использования обфусцированного кода и что проще написать свой собственный код с нуля.   -  person Alex    schedule 24.12.2014
comment
См. Также Как восстановить запутанные имена свойств?   -  person Bergi    schedule 18.07.2016


Ответы (3)


Я еще не видел онлайн-деобфускатора, который бы делал это, но принцип прост.
Создайте текстовый фильтр, который анализирует «ключевой» массив, а затем заменяет каждый экземпляр, на который ссылается этот массив, соответствующим значением массива.

Например, предположим, что у вас есть файл 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);

В этом случае «ключевой» переменной будет _0xf17f, а «ключевым» массивом будет ["(", ")", ...].

Процесс фильтрации будет выглядеть так:

  1. Извлеките имя ключа с помощью обработки текста в файле js. Результат: _0xf17f
  2. Извлеките строку src из массива ключей. Результат:

    keyArrayStr = '["(", ")", \'div\', "createElement", "id", "log", "console"]';
    
  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);

если вы запустите этот код, вы получите:

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

- который немного легче читать / понимать.


Я также создал онлайн-страницу, которая берет исходный код JS и выполняет все 3 шага переназначения немного более автоматизированным и надежным способом. Вы можете увидеть это по адресу:

jsbin.com/hazevo

(Обратите внимание, что этот инструмент ожидает, что источник будет начинаться с объявления "ключевой" переменной, как это делают ваши образцы кода)

person Brock Adams    schedule 26.12.2014

Решение @Brock Adams великолепно, но есть небольшая ошибка: оно не принимает во внимание простые цитируемые переменные.

Пример:

var _0xbd34 = ["hello ", '"my" world'];
(function($) {
  alert(_0xbd34[0] + _0xbd34[1])
});

Если вы попытаетесь расшифровать этот пример, это приведет к следующему:

alert("hello " + ""my" world")

Чтобы решить эту проблему, просто отредактируйте replacedSrc.replace в коде @Brock:

replacedSrc     = replacedSrc.replace (nameRegex, function (matchStr, p1Str) {
    var quote = keyArry[parseInt (p1Str, 10)].indexOf('"')==-1? '"' : "'";
    return quote + keyArry[ parseInt (p1Str, 10) ] + quote;
} );

Здесь у вас есть исправленная версия.

person Ivan    schedule 22.02.2016

for (var i = 0; i < _0x21e9.length; i++) {
  var funcName = _0x21e9[i];
  _0x21e9[funcName] = funcName;
}

это добавит все имена функций в качестве ключей к массиву. позволяя вам делать

date[_0x21e9["getMonth"]]()
person hofan41    schedule 23.12.2014