На сайте ionCube случайно заметил бесплатную плюшку – Free Obfuscating HTML Encoder. Захотелось посмотреть и раскодировать)
Закодированная страница в примере на сайте выглядит следующим образом:
<script language=javascript> c="e66x75...Y7dF7d"; // [1] first long string eval(unescape("%64%3d...%22%3b")); // [2] second long string x("C3Bomk...4ApQkS"); // [3] third long string </script>
В оригинале весь код располагается в одну строку. В строке #4 вызов неизвестной функции, по всей видимости, она находится в блоке с eval и ее нужно раскрыть. Логично предположить, что тело страницы (контент) находится непосредственно в строке, передаваемой этой функции.
1. Убираем eval и помещаем все в textarea или смотрим через alert:
document.write( "<textarea>" ); document.write( unescape("%64%3d...%22%3b") ); document.write( "</textarea>" );
2. Причесываем полученный код:
d=""; for (i = 0; i < c.length; i++) if (i % 3 == 0) d += "%"; else d += c.charAt(i); eval( unescape( d ) ); d="";
3. Снова убираем eval и последнюю строчку, очищающую переменную d:
document.write( "<textarea>" ); document.write( unescape( d ) ); document.write( "</textarea>" ); // d="";
4. Совмещаем строку [1] с кодом из 2-3 пунктов:
c="e66x75...Y7dF7d"; d=""; for (i = 0; i < c.length; i++) if (i % 3 == 0) d += "%"; else d += c.charAt(i); document.write( "<textarea>" ); document.write( unescape( d ) ); document.write( "</textarea>" );
5. Причесываем полученную функцию:
function x( x ) { var l = x.length, b = 1024, i, j, r, p = 0, s = 0, w = 0, t = Array(63,28,...,31,17); for (j = Math.ceil( l / b ); j > 0; j--) { r = ''; for (i = Math.min( l, b ); i > 0; i--, l--) { w |= (t[x.charCodeAt( p++ ) - 48]) << s; if (s) { r += String.fromCharCode( 165 ^ w & 255); w >>= 8; s -= 2; } else { s = 6 } } document.write( r ); } }
6. Заменяем в функции, полученной на 5 шаге, document.write на привычную конструкцию:
document.write( "<textarea>" ); document.write( r ); document.write( "</textarea>" );
7. Результирующий код для расшифровки:
function x( x ) { var l = x.length, b = 1024, i, j, r, p = 0, s = 0, w = 0, t = Array(63,28,...,31,17); for (j = Math.ceil( l / b ); j > 0; j--) { r = ''; for (i = Math.min( l, b ); i > 0; i--, l--) { w |= (t[x.charCodeAt(p++) - 48]) << s; if (s) { r += String.fromCharCode( 165 ^ w & 255); w >>= 8; s -= 2; } else { s = 6 } } document.write( "<textarea>" ); document.write( r ); document.write( "</textarea>" ); } } x("C3Bomk...4ApQkS"); // [3] third long string
Недостатки:
— если страница большая, код будет выводиться в нескольких блоках textarea (в цикле), т.к. строка разбита на куски по 1024 символа (переменная b). Можно объявить еще одну переменную и пихать куски из переменной r в нее путем конкатенации;
— textarea может нарваться на закрывающий тег, </textarea>, и не покажет код. Избежать этого можно предварительно заменив слово textarea, в строке r, на что-то другое (строка #16).