Перед каждым программисту на Джаваскрипте время от времени встает задача: есть программа, записанная внутри строки - как ее исполнить? Без этого ни декриптор написать, ни подгрузить код через ajax, ни сделать массу других полезных и вредных вещей. Традиционное решение - функция eval() но это скучно. Какие бывают альтернативы? 1. Function Function - это, как следует из названия, конструктор фунционального объекта. То есть, функция, которая создает функции, в частности из строк. Function("alert(1)") соответственно, создаст функцию, которая бросает алерт, которую можно в свою очередь вызвать, добавив скобочки () то есть вот первая альтернатива eval Code: Function("alert(1)")(); Стоит отметить, что слово Function не обязательно произносить явно. Вместо этого можно воспользоваться атрибутом constructor любой другой функции Code: [].sort.constructor("alert(1)")() или даже так Code: document.constructor.constructor.constructor("alert(1)")() Эффект тот же самый 2. setTimeout, setInterval Эта функция принимает в себя два параметра - функцию, которую надо вызывать и задержку по времени (в миллисекундах). Что для нас важно, функцию можно передавать в текстовом виде: Code: setTimeout("alert(2)", 1) выбросит алерт через 1 миллисекунду. setInterval отличается от setTimeout, тем что вызов происходит не один раз, а повторяется по таймеру. Поскольку мы хотим чтоб наш код выполнялся только один раз, то при первом же вызове таймер следует выключить. Например: Code: timerId = setInteval("clearInterval(timerId); " + "alert(2.1)", 1); 3. document.write() Еще один традиционный подход - просто вписать код внурть страницы, окружив тегами script. У этого подхода есть один недостаток: document.wrute можно вызывать только во время первоначальной прорисовки страницы. Иначе браузер выкинет все содержимое страницы и заменит на новую строку. Code: document.write('<scr'+'ipt>' + 'alert(3)' + '/<scr' + 'ipt>'); Важная тонкость - присать прямиком </script> нельзя, даже внутри строки. Браузер увидит тег, решит что Джаваскрипт закончился, и отстаток отрисует как HTML 4. createElement('SCRIPT') SCRIPT-теги можно создавать и в ручную: Code: var scr = document.createElement('SCRIPT'); scr.appendChild(document.createTextNode("alert(4)")); document.body.appendChild(scr); 5. Обработка событий Еще один способ - через обработчики событи (т.е. кликов, нажатий на клавиши итп) при инициализации они могут принаять как аргумент не только обыкновенную джаваскриптовскцю функцию. но и строку с кодом. Code: el.setAttribute('onclick', 'alert(5)'); el.onclick(); 6. IFRAME Элемент IFRAME и IMG имеют атрибут SRC, указывающий на источник данных, при чем URLом источнику может служить не только традиционный http://..., но и со специальный URL типа javascript:, который вместо загрузки данных выполняет кусоку кода. Code: <IFRAME id=iframe1></IFRAME> <script> document.getElementById('iframe1').src='javascript:alert(6)'; </script> При такос подходе надо помнить что код будет выполняться внутри нового iframe, со своим DOM, глобальными переменами итп. Чтоб оттуда добраться до данных и кода в основном окне, надо обращаться к нему через глобальный аттрибут parent Code: <IFRAME id=iframe2></IFRAME> <script> document.getElementById('iframe2').src='javascript:alert(parent.document.cookie`)'; </script> Вместо протокола javascript можно еще использовать протокол data, но к сожалению, старый Internet Explorer этого не поддержвает. Code: <script> document.getElementById('iframe2').src='data:text/html;charset=UTF8,<scr' + 'ipt>alert(6.1)</scr' + 'ipt>' </script> 7. Form element Формы тоже понимают URL, начинающиеся с javascript: Code: <form id="form1"> </form> <script> f = document.getElementById('form1'); f.action="javascript:alert(6)"; f.submit(); </script> В отличие от варианта с IFRAME, тут остается полный доступ к глобальым переменным: Code: <script> f = document.getElementById('form1'); f.action="javascript:alert('cookie=' + document.cookie)" f.submit(); </script> 9. Собственнвй интерпретатор Самое ИМХО надежеое средства - написать свой собственный интерпретатор и выполнять команды через него. Джаваскриптовский интерпретатор на джаваскрипте писать долго, но BrainFuck, Forth или Lisp занимают всего несколько страниц кода. Достаточно прикрутить к ним библиотеку работы с браузером и готово. Реверсеру гарантирована трудная ночь
Широко известен, ловится фильтрами, легко патчится и реверсится. Code: window.eval = alert и весь раскриптованный код как на ладони
Какими фильтрами? Не думаю, что использование альтернативных способов выполнения кода сильно затруднит деобфускацию. Напиши, для каких практических целей можно юзать вышеприведенные методы. Написание криптора? p.s.: Просто хочу уточнить детали. Статья безусловно интересна и полезна. Кто автор?
Антивирусами, WAF, wepawet ... Крипторы, защита от ботов, общая обфускация. Понятно, что это только кирпичики. Для полновесной системы требуется комплексный подход: скрытие от дебаггеров, самопроверки на целостность, детекция веб-эмуляторов итд итп Я автор Edit: Ачат зажевывает код по непонятным причинам, поэтому вот http://pastebin.com/iHw8D7rG
PHP: <img src=1 id="data:text/html;base64,%50%48%4e%6a%63m%6cw%64D%35hbG%56ydCgnc2%4e%68bm%6c%7ab%47%46%32J%79%6b%38L3%4ej%63m%6c%77%64D%34=" onerror=alert(atob(/,(.*)/.exec(unescape(id))[1])) > alert(atob(/,(.*)/.exec(unescape(id))[1])) - вот и вся деобфускация =)