Как деобфусцировать этот код JavaScript?

Возможный дубликат:
Декодировать обфусцированный JavaScript

Вопрос:

У меня есть следующий код javascript:

var _0xe91d=["\x28\x35\x28\x24\x29\x7B\x24\x2E\x32\x77\x2E

...


x5F\x63\x6F\x6E\x74\x5F\x64\x75\x72\x7C\x76\x5F\x74\x61\x62\x73\x5F\x61\x6C\x69\x67\x6E\x7C\x76\x5F\x74\x61\x62\x73\x5F\x64\x75\x72\x7C\x76\x5F\x73\x63\x72\x6F\x6C\x6C\x7C\x63\x6F\x6E\x74\x5F\x61\x6E\x69\x6D\x7C\x63\x6F\x6E\x74\x5F\x66\x78\x7C\x74\x61\x62\x5F\x66\x78\x7C\x72\x65\x70\x6C\x61\x63\x65\x7C\x62\x61\x6C\x69\x67\x6E\x7C\x61\x6C\x69\x67\x6E\x5F\x7C\x75\x6E\x6D\x6F\x75\x73\x65\x77\x68\x65\x65\x6C\x7C\x73\x77\x69\x74\x63\x68\x7C\x64\x65\x66\x61\x75\x6C\x74\x7C\x6A\x51\x75\x65\x72\x79","","\x66\x72\x6F\x6D\x43\x68\x61\x72\x43\x6F\x64\x65","\x72\x65\x70\x6C\x61\x63\x65","\x5C\x77\x2B","\x5C\x62","\x67"];eval(function (_0x173cx1,_0x173cx2,_0x173cx3,_0x173cx4,_0x173cx5,_0x173cx6){_0x173cx5=function (_0x173cx3){return (_0x173cx3<_0x173cx2?_0xe91d[4]:_0x173cx5(parseInt(_0x173cx3/_0x173cx2)))+((_0x173cx3=_0x173cx3%_0x173cx2)>35?String[_0xe91d[5]](_0x173cx3+29):_0x173cx3.toString(36));} ;if(!_0xe91d[4][_0xe91d[6]](/^/,String)){while(_0x173cx3--){_0x173cx6[_0x173cx5(_0x173cx3)]=_0x173cx4[_0x173cx3]||_0x173cx5(_0x173cx3);} ;_0x173cx4=[function (_0x173cx5){return _0x173cx6[_0x173cx5];} ];_0x173cx5=function (){return _0xe91d[7];} ;_0x173cx3=1;} ;while(_0x173cx3--){if(_0x173cx4[_0x173cx3]){_0x173cx1=_0x173cx1[_0xe91d[6]]( new RegExp(_0xe91d[8]+_0x173cx5(_0x173cx3)+_0xe91d[8],_0xe91d[9]),_0x173cx4[_0x173cx3]);} ;} ;return _0x173cx1;} (_0xe91d[0],62,284,_0xe91d[3][_0xe91d[2]](_0xe91d[1]),0,{}));

Как именно я могу его расшифровать и узнать, что он делает?
И какой принцип стоит за этим запутыванием?


person Stefan Steiger    schedule 19.02.2012    source источник
comment
Сначала определитесь со строкой, но я предполагаю, что вы уже это сделали. Затем отформатируйте его рационально. Тогда приступайте к чтению. Не уверен, что вы имеете в виду под принципом, вы спрашиваете, почему это было запутано?   -  person Dave Newton    schedule 20.02.2012
comment
Мне кажется, что код — это сгенерированный вывод какого-то автоматизированного пакета дизайна корпуса. Много лет назад мне пришлось перевернуть целое приложение, которое было таким же в C, где все функции и переменные были просто бессмысленными числовыми именами.   -  person Dampsquid    schedule 20.02.2012
comment
@Dave Newton: Вы не можете просто прочитать его с помощью toString, он зашифрован. К счастью, он должен предоставить функцию расшифровки, чтобы использовать ее в eval, которая может быть перехвачена консолью javascript google-chrome :)   -  person Stefan Steiger    schedule 20.02.2012
comment
Что значит, он зашифрован? Это гекс. Используйте шестнадцатеричное поле на странице home.paulschou.net/tools/xlate. Используйте toString().   -  person Dave Newton    schedule 20.02.2012
comment
@Dave Newton: Нет, это не просто шестнадцатеричный код. Прежде чем строка была зашифрована, она была зашифрована. Поэтому, чтобы его отменить, его нужно расшифровать, а затем расшифровать. И только потом будет обычный текстовый код. Единственное, что не зашифровано, — это функция расшифровки, и она отображается, когда вы выполняете toString. На самом деле, он сначала выполняет подстановку регулярных выражений, чтобы получить функцию расшифровки, но этот результат можно перехватить в консоли отладки :)   -  person Stefan Steiger    schedule 24.02.2012
comment
@Quandary ... Так что это просто шестнадцатеричный код, и расшифровка тут же. Я все еще не понимаю, в чем проблема.   -  person Dave Newton    schedule 24.02.2012


Ответы (2)


Он выполняет некоторую замену некоторого текста, используя регулярное выражение. Выражение находится в шестнадцатеричном коде, вы можете использовать .toString(), чтобы вернуть его в юникод: например:

"\x66\x72\x6F\x6D\x43\x68\x61\x72\x43\x6F\x64\x65".toString() : fromCharCode

or

"\x72\x65\x70\x6C\x61\x63\x65".toString() : replace
person Kamyar Nazeri    schedule 19.02.2012
comment
Забавно, .toString() действительно достаточно информации. Но только в сочетании с небольшой подготовкой в ​​javascript-консоли goole-chrome, как рекомендовано в другом посте. Расшифровал за ‹ 5 минут :) - person Stefan Steiger; 20.02.2012

Это просто шестнадцатеричные коды в строке \x20 - это пробел, который представляет собой десятичное число 32.

print _0xe91d
person freegnu    schedule 19.02.2012
comment
это еще не все - листайте вправо - person Rob Levine; 20.02.2012
comment
Но теперь вы знаете, как превратить его во что-то отличное от шестнадцатеричных кодов. Вы говорите, что не понимаете, что имена переменных также являются шестнадцатеричными кодами? Вам понадобится от 10 минут до 2 часов, в зависимости от ваших навыков отладки, чтобы написать сценарий, который изменит все шестнадцатеричные коды обратно в символьные строки. - person freegnu; 21.02.2012
comment
Я понимаю это, но вы должны отвечать на вопрос или предлагать решение. Я указывал, что ваш ответ на самом деле не соответствует этому. Кажется, я ничего не говорил о моих навыках отладки, так как этот вопрос не обо мне. - person Rob Levine; 21.02.2012
comment
Вопрос заключался в следующем: как именно я могу его расшифровать и узнать, что он делает? И какой принцип стоит за этим запутыванием? Это было не расшифровать это для меня. - person freegnu; 21.02.2012
comment
Это правда - ваш вопрос был полезным первым пунктом - но это было не только это. Поэтому я говорю, что это нечто большее, чем это - person Rob Levine; 21.02.2012