Копаем вечный триал стандартной комплектации, часть 2

Битрикс 15.5

В первой части мы разобрались, как работает пробный период системы. 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/, смотрим, что получилось.

Битрикс, Было 27 дней Битрикс, стало 30 дней

Работает!

Дальше, думаю, понятно. Допиливаем скрипт, ложим на сервер, дёргаем кроном раз в сутки - вечные 30 дней триала и никаких модификаций ядра:)

Хак

0 комментариев

Только авторизованные пользователи могут оставлять комментарии.

Пожалуйста, Авторизуйтесь или Зарегистрируйтесь