Июл 24, 2015
Копаем вечный триал стандартной комплектации, часть 2
В первой части мы разобрались, как работает пробный период системы. Ok, продолжим тянуть одеяло на себя.
Задача: изменить дату окончания пробного периода.
Погнали!
Смотрим, как дешифруются даты в файле ...modules/main/include.php:
$_1986987364 = COption::GetOptionString("main", "admin_passwordh");
while ($_1986987364) {
$_461848715 = base64_decode($_1986987364);
$_658498780 = "";
$_2139208883 = "thRH4u67fhw87V7Hyr12Hwy0rFr";
$_1215634966 = strlen($_2139208883);
$_278722441 = 0;
for ($_307887909 = 0; $_307887909 < strlen($_461848715); $_307887909++) {
$_658498780 .= chr(ord($_461848715[$_307887909]) ^ ord($_2139208883[$_278722441]));
if ($_278722441 == $_1215634966 - 1)
$_278722441 = 0;
else
$_278722441 = $_278722441 + 1;
}
//SITEEXPIREDATE
$_912457331 = mktime(0, 0, 0, intval($_658498780[6] . $_658498780[3]), intval($_658498780[1] . $_658498780[14]), intval($_658498780[10] . $_658498780[18] . $_658498780[7] . $_658498780[12]));
unset($_2139208883);
break;
}
@include($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/admin/define.php");
while (defined("TEMPORARY_CACHE")) {
$_1494959871 = base64_decode(constant("TEMPORARY_CACHE"));
$_464054490 = "";
$_527681262 = "DO_NOT_STEAL_OUR_BUS";
$_278722441 = 0;
for ($_307887909 = 0; $_307887909 < strlen($_1494959871); $_307887909++) {
$_464054490 .= chr(ord($_1494959871[$_307887909]) ^ ord($_527681262[$_278722441]));
if ($_278722441 == 19)
$_278722441 = 0;
else
$_278722441 = $_278722441 + 1;
}
//OLDSITEEXPIREDATE
$_1749264640 = mktime(0, 0, 0, intval($_464054490[6] . $_464054490[16]), intval($_464054490[9] . $_464054490[2]), intval($_464054490[12] . $_464054490[7] . $_464054490[14] . $_464054490[3]));
unset($_527681262);
break;
}
Берётся значение, декодируется из base64, прогоняется через XOR, из результата выдираются отдельные символы и формируется юникс тайм... Вся прелесть XOR шифрования в том, что для получения исходника достаточно прогнать зашифрованные данные через тот же цикл с тем же ключом.
Отлично.
Напишем универсальную функцию и скормим ей +30 дней от текущей даты.
<?php
function BitrixExpireDate($date, $key){
$outCode = '';
$x = 0;
for ($i = 0; $i < strlen($date); $i++) {
$outCode .= chr(ord($date[$i]) ^ ord($key[$x]));
if ($x == strlen($key) - 1)
$x = 0;
else
$x = $x + 1;
}
return $outCode;
}
$key1 = 'DO_NOT_STEAL_OUR_BUS+'; // OLDSITEEXPIREDATE
$key2 = 'thRH4u67fhw87V7Hyr12Hwy0rFr+'; // SITEEXPIREDATE
$nowDate = date('mdY', time() + 60*60*24*30); // сегодня 07242015
$codeDate1 = 'XX'.$nowDate[3].$nowDate[7].'XX'.$nowDate[0].$nowDate[5].'X'.$nowDate[2].'XX'.$nowDate[4].'X'.$nowDate[6].'X'.$nowDate[1].'X'; // OLDSITEEXPIREDATE
$codeDate2 = 'X'.$nowDate[2].'X'.$nowDate[1].'XX'.$nowDate[0].$nowDate[6].'XX'.$nowDate[4].'X'.$nowDate[7].'X'.$nowDate[3].'XXX'.$nowDate[5]; // SITEEXPIREDATE
echo $outCode1 = base64_encode(BitrixExpireDate($codeDate1, $key1)); // OLDSITEEXPIREDATE
echo '<br>';
echo $outCode2 = base64_encode(BitrixExpireDate($codeDate2, $key2)); // SITEEXPIREDATE
?>
Запускаем, получаем результат.
HBdsexcMb2MMdxkUbRdkCmca
LFoKcGwtBgY+MEVgAg4EECEqAQ==
Шикарно!:) Меняем значения в файле ...modules/main/admin/define.php и в строке admin_passwordh (таблица b_option), чистим ...managed_cache/, смотрим, что получилось.
Работает!
Дальше, думаю, понятно. Допиливаем скрипт, ложим на сервер, дёргаем кроном раз в сутки - вечные 30 дней триала и никаких модификаций ядра:)