На сайте 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).