Скрытие кода, метод 6: ionCube HTML obfuscator

Автор: | 20 февраля 2012

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

Добавить комментарий