Альтернаитивы eval() в Джаваскрипте

Discussion in 'PHP' started by scanislav, 4 Feb 2012.

  1. scanislav

    scanislav Elder - Старейшина

    Joined:
    25 Jun 2010
    Messages:
    87
    Likes Received:
    22
    Reputations:
    31
    Перед каждым программисту на Джаваскрипте время от времени встает задача: есть программа, записанная внутри строки - как ее исполнить? Без этого ни декриптор написать, ни подгрузить код через 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 занимают всего несколько страниц кода. Достаточно прикрутить к ним библиотеку работы с браузером и готово. Реверсеру гарантирована трудная ночь :D
     
    3 people like this.
  2. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Что скучного в eval()?
     
  3. scanislav

    scanislav Elder - Старейшина

    Joined:
    25 Jun 2010
    Messages:
    87
    Likes Received:
    22
    Reputations:
    31
    Широко известен, ловится фильтрами, легко патчится и реверсится.

    Code:
    window.eval = alert
    и весь раскриптованный код как на ладони
     
  4. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Какими фильтрами?
    Не думаю, что использование альтернативных способов выполнения кода сильно затруднит деобфускацию.

    Напиши, для каких практических целей можно юзать вышеприведенные методы. Написание криптора?


    p.s.:
    Просто хочу уточнить детали. Статья безусловно интересна и полезна. Кто автор?
     
  5. scanislav

    scanislav Elder - Старейшина

    Joined:
    25 Jun 2010
    Messages:
    87
    Likes Received:
    22
    Reputations:
    31
    Антивирусами, WAF, wepawet ...


    Крипторы, защита от ботов, общая обфускация. Понятно, что это только кирпичики. Для полновесной системы требуется комплексный подход: скрытие от дебаггеров, самопроверки на целостность, детекция веб-эмуляторов итд итп


    Я автор

    Edit:
    Ачат зажевывает код по непонятным причинам, поэтому вот http://pastebin.com/iHw8D7rG
    :D
     
    #5 scanislav, 6 Feb 2012
    Last edited: 6 Feb 2012
  6. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Что этот код должен был делать?
     
  7. scanislav

    scanislav Elder - Старейшина

    Joined:
    25 Jun 2010
    Messages:
    87
    Likes Received:
    22
    Reputations:
    31
    Скопировал строку неверно, отредактировал. :(
    А вообще это alert
     
    #7 scanislav, 6 Feb 2012
    Last edited: 6 Feb 2012
  8. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    PHP:
    <img
    src
    =1
    id
    ="&#x64&#x61&#116&#97&#58&#x74&#101&#120&#x74&#47&#x68;t&#x6d&#x6c;;b&#x61&#x73&#x65&#54&#x34&#x2c&#x25&#x35&#48&#x25&#52;8&#37&#52&#x65&#37&#x36&#97&#x25&#x36&#51;m&#37&#x36&#99&#119&#x25&#x36;4&#x44&#37&#x33&#53&#x68;b&#71&#x25&#53&#x36&#121;d&#x43&#103&#x6e&#x63&#x32&#x25;4e&#x25;6&#56&#x62;m&#37;6&#x63&#37;7&#x61&#x62&#37&#52&#x37&#x25;4&#x36&#37&#51;2&#74&#x25&#55&#x39;%&#x36&#x62&#x25&#x33&#56;L&#51&#x25&#52&#x65&#106&#37;6&#51;m&#37&#54&#99&#37&#x37;7&#x25;6&#x34;D%&#51;4&#x3d"
    onerror=alert(atob(/,(.*)/.exec(unescape(id))[1]))
    >
    alert(atob(/,(.*)/.exec(unescape(id))[1])) - вот и вся деобфускация =)
     
  9. scanislav

    scanislav Elder - Старейшина

    Joined:
    25 Jun 2010
    Messages:
    87
    Likes Received:
    22
    Reputations:
    31
    Небольшое уточнение:
    Вобщем, цель победить ачат не ставилась, я просто подпись пытался настроить.