3 заметок с тегомХак

Копаем вечный триал стандартной комплектации, часть 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 дней триала и никаких модификаций ядра:)

Хак

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

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

Опустим лирику. Совершенно не важно, как так случилось, что на моём антресольном сервере завелась система «номер один» российского сайтостроения. У нас есть тридцать дней на то, чтобы пощупать продукт, надеть тапки и занести деньги в контору - факт. Конечно, мы так и сделаем, но тридцать дней - мало. Поэтому, лезем в ядро бороться с системой.

С чего начать?.. Естественно, с месседжа в админке: «До истечения пробного периода осталось XX дней.»

И так, разбираемся, откуда растут ноги. Погнали!

Поиском по содержимому файлов добираемся до

..modules/main/interface/prolog_main_admin.php

Часть кода, которая выводит предупреждение:

...
// @global string $SiteExpireDate
...
$delta = $SiteExpireDate-time();
$daysToExpire = ($delta < 0? 0 : ceil($delta/86400));
...
<span class="required"><?echo GetMessage("TRIAL_ATTENTION") ?></span>
<?echo GetMessage("TRIAL_ATTENTION_TEXT1_".$vendor) ?>
<?if ($daysToExpire >= 0):?>
<?echo GetMessage("TRIAL_ATTENTION_TEXT2") ?> <span class="required"><b><?echo $daysToExpire?></b></span> <?echo GetMessage("TRIAL_ATTENTION_TEXT3") ?>.
<?else:?>
<?echo GetMessage("TRIAL_ATTENTION_TEXT4_".$vendor) ?>
<?endif;?>
<?echo GetMessage("TRIAL_ATTENTION_TEXT5_".$vendor) ?>

Упираемся в переменную $SiteExpireDate. Она задаётся где-то не здесь. Ищем, где...

Чёрт его знает где:) Но, встречается в файле ...modules/main/include/prolog_after.php, в котором есть интересная для нас логика:

if(defined("OLDSITEEXPIREDATE") && defined("SITEEXPIREDATE") && OLDSITEEXPIREDATE != SITEEXPIREDATE)
        die(GetMessage("expire_mess2"));

Две жизненно важные константы OLDSITEEXPIREDATE и SITEEXPIREDATE. Поиск по ним приводит к хитрому файлу ...modules/main/include.php Отлично! Но, придётся повозиться. Файл содержит ахрененно длинную строку с раздестроенным, PHP кодом. В конторе работают знатные извращенцы:))))) Типа, зашифровали:)

Ок. Приведём в порядок... Полтора часа возни, и получаем читаемый, упрощённый код.

Щаз будет длинно:)))))

<?php
require_once(substr(__FILE__, 0, strlen(__FILE__) - strlen("/include.php")) . "/bx_root.php");
require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/start.php");
require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/classes/general/virtual_io.php");
require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/classes/general/virtual_file.php");

$_488120950 = \Bitrix\Main\Application::getInstance();
$_488120950->initializeExtendedKernel(array(
    "get" => $_GET,
    "post" => $_POST,
    "files" => $_FILES,
    "cookie" => $_COOKIE,
    "server" => $_SERVER,
    "env" => $_ENV
));

$GLOBALS["APPLICATION"] = new CMain;

if (defined("SITE_ID"))
    define("LANG", SITE_ID);

if (defined("LANG")) {
    if (defined("ADMIN_SECTION") && ADMIN_SECTION === true)
        $_1015422197 = CLangAdmin::GetByID(LANG);
    else
        $_1015422197 = CLang::GetByID(LANG);
    $_711298694 = $_1015422197->Fetch();
} else {
    $_711298694 = $GLOBALS["APPLICATION"]->GetLang();
    define("LANG", $_711298694["LID"]);
}

$_1946907838 = $_711298694["LID"];

if (!defined("SITE_ID"))
    define("SITE_ID", $_711298694["LID"]);

define("SITE_DIR", $_711298694["DIR"]);
define("SITE_SERVER_NAME", $_711298694["SERVER_NAME"]);
define("SITE_CHARSET", $_711298694["CHARSET"]);
define("FORMAT_DATE", $_711298694["FORMAT_DATE"]);
define("FORMAT_DATETIME", $_711298694["FORMAT_DATETIME"]);
define("LANG_DIR", $_711298694["DIR"]);
define("LANG_CHARSET", $_711298694["CHARSET"]);
define("LANG_ADMIN_LID", $_711298694["LANGUAGE_ID"]);
define("LANGUAGE_ID", $_711298694["LANGUAGE_ID"]);

$_919381780 = $_488120950->getContext();
$_919381780->setLanguage(LANGUAGE_ID);
$_919381780->setCulture(new \Bitrix\Main\Context\Culture($_711298694));
$_415566121 = $_919381780->getRequest();

if (!$_415566121->isAdminSection()) {
    $_919381780->setSite(SITE_ID);
}

$_488120950->start();

$GLOBALS["APPLICATION"]->reinitPath();

if (!defined("POST_FORM_ACTION_URI")) {
    define("POST_FORM_ACTION_URI", htmlspecialcharsbx(GetRequestUri()));
}

$GLOBALS["MESS"] = array();
$GLOBALS["ALL_LANG_FILES"] = array();

IncludeModuleLangFile($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/tools.php");
IncludeModuleLangFile($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/classes/general/database.php");
IncludeModuleLangFile($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/classes/general/main.php");
IncludeModuleLangFile(__FILE__);

error_reporting(COption::GetOptionInt("main", "error_reporting", E_COMPILE_ERROR | E_ERROR | E_CORE_ERROR | E_PARSE) & ~E_STRICT);

if (!defined("BX_COMP_MANAGED_CACHE") && COption::GetOptionString("main", "component_managed_cache_on", "Y") <> "N") {
    define("BX_COMP_MANAGED_CACHE", true);
}

require_once($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/filter_tools.php");
require_once($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/ajax_tools.php");

class CBXFeatures
{
    public static function IsFeatureEnabled($_2128331551)
    {
        return true;
    }
    public static function IsFeatureEditable($_2128331551)
    {
        return true;
    }
    public static function SetFeatureEnabled($_2128331551, $_807891038 = true)
    {
    }
    public static function SaveFeaturesSettings($_1802077022, $_1385896842)
    {
    }
    public static function GetFeaturesList()
    {
        return array();
    }
    public static function InitiateEditionsSettings($_2138200839)
    {
    }
    public static function ModifyFeaturesSettings($_2138200839, $_495981549)
    {
    }
    public static function IsFeatureInstalled($_2128331551)
    {
        return true;
    }
}

$_276020476  = GetMessage("expire_mess2");
$_1069399946 = 14;

define("DEMO", "Y");

$_912457331 = 1;

unset($_1986987364);

$_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;
}

$_116706979 = "http://bitrixsoft.com/bitrix/bs.php";

@include($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/admin/define.php");

$_1749264640 = 2;

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;
}

// Вечный цикл:))) Нууу, красиво, чё:)
while (!defined("DEMO")) {
    function __2139868484($_642293569)
    {
        return $_642293569 + __2139868484($_642293569);
    }
    __2139868484(1);
}


if (file_exists($_SERVER["DOCUMENT_ROOT"] . "/bitrix/.config.php")) {
    $bxProductConfig = array();

    include($_SERVER["DOCUMENT_ROOT"] . "/bitrix/.config.php");

    if (isset($bxProductConfig["saas"]["days_after_trial"])) {
        $_1329209264 = intval($bxProductConfig["saas"]["days_after_trial"]);
        if ($_1329209264 >= 0 && $_1329209264 < 14)
            $_1069399946 = $_1329209264;
    }

    if ($bxProductConfig["saas"]["trial_stopped"] <> "")
        $_276020476 = $bxProductConfig["saas"]["trial_stopped"];
}

for ($_307887909 = 0, $_1299663923 = (time() < mktime(0, 0, 0, 5, 1, 2010) || $_912457331 <= 10), $_1158761997 = ($_912457331 < mktime(0, 0, 0, Date("m"), date("d") - $_1069399946, date("Y"))); $_307887909 < 10, $_1299663923 || $_1158761997 || $_912457331 != $_1749264640; $_307887909++, WriteFinalMessage($_276020476));

define("OLDSITEEXPIREDATE", $_912457331);
define("SITEEXPIREDATE", $_1749264640);

$GLOBALS["SiteExpireDate"] = OLDSITEEXPIREDATE; // это мы искали в самом начале... глобальная переменная $SiteExpireDate
$GLOBALS["arCustomTemplateEngines"] = array();

require_once($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/classes/general/urlrewriter.php");

\Bitrix\Main\Loader::registerAutoLoadClasses("main", array(
    "CSiteTemplate" => "classes/general/site_template.php",
    "CBitrixComponent" => "classes/general/component.php",
    "CComponentEngine" => "classes/general/component_engine.php",
    "CComponentAjax" => "classes/general/component_ajax.php",
    "CBitrixComponentTemplate" => "classes/general/component_template.php",
    "CComponentUtil" => "classes/general/component_util.php",
    "CControllerClient" => "classes/general/controller_member.php",
    "PHPParser" => "classes/general/php_parser.php",
    "CDiskQuota" => "classes/" . $DBType . "/quota.php",
    "CEventLog" => "classes/general/event_log.php",
    "CEventMain" => "classes/general/event_log.php",
    "CAdminFileDialog" => "classes/general/file_dialog.php",
    "WLL_User" => "classes/general/liveid.php",
    "WLL_ConsentToken" => "classes/general/liveid.php",
    "WindowsLiveLogin" => "classes/general/liveid.php",
    "CAllFile" => "classes/general/file.php",
    "CFile" => "classes/" . $DBType . "/file.php",
    "CTempFile" => "classes/general/file_temp.php",
    "CFavorites" => "classes/" . $DBType . "/favorites.php",
    "CUserOptions" => "classes/general/user_options.php",
    "CGridOptions" => "classes/general/grids.php",
    "CUndo" => "/classes/general/undo.php",
    "CAutoSave" => "/classes/general/undo.php",
    "CRatings" => "classes/" . $DBType . "/ratings.php",
    "CRatingsComponentsMain" => "classes/" . $DBType . "/ratings_components.php",
    "CRatingRule" => "classes/general/rating_rule.php",
    "CRatingRulesMain" => "classes/" . $DBType . "/rating_rules.php",
    "CTopPanel" => "public/top_panel.php",
    "CEditArea" => "public/edit_area.php",
    "CComponentPanel" => "public/edit_area.php",
    "CTextParser" => "classes/general/textparser.php",
    "CPHPCacheFiles" => "classes/general/cache_files.php",
    "CDataXML" => "classes/general/xml.php",
    "CXMLFileStream" => "classes/general/xml.php",
    "CRsaProvider" => "classes/general/rsasecurity.php",
    "CRsaSecurity" => "classes/general/rsasecurity.php",
    "CRsaBcmathProvider" => "classes/general/rsabcmath.php",
    "CRsaOpensslProvider" => "classes/general/rsaopenssl.php",
    "CASNReader" => "classes/general/asn.php",
    "CBXShortUri" => "classes/" . $DBType . "/short_uri.php",
    "CFinder" => "classes/general/finder.php",
    "CAccess" => "classes/general/access.php",
    "CAuthProvider" => "classes/general/authproviders.php",
    "IProviderInterface" => "classes/general/authproviders.php",
    "CGroupAuthProvider" => "classes/general/authproviders.php",
    "CUserAuthProvider" => "classes/general/authproviders.php",
    "CTableSchema" => "classes/general/table_schema.php",
    "CCSVData" => "classes/general/csv_data.php",
    "CSmile" => "classes/general/smile.php",
    "CSmileSet" => "classes/general/smile.php",
    "CUserCounter" => "classes/" . $DBType . "/user_counter.php",
    "CHotKeys" => "classes/general/hot_keys.php",
    "CHotKeysCode" => "classes/general/hot_keys.php",
    "CBXSanitizer" => "classes/general/sanitizer.php",
    "CBXArchive" => "classes/general/archive.php",
    "CAdminNotify" => "classes/general/admin_notify.php",
    "CBXFavAdmMenu" => "classes/general/favorites.php",
    "CAdminInformer" => "classes/general/admin_informer.php",
    "CSiteCheckerTest" => "classes/general/site_checker.php",
    "CSqlUtil" => "classes/general/sql_util.php",
    "CHTMLPagesCache" => "classes/general/cache_html.php",
    "CFileUploader" => "classes/general/uploader.php",
    "LPA" => "classes/general/lpa.php"
));

require_once($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/classes/" . $DBType . "/agent.php");
require_once($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/classes/" . $DBType . "/user.php");
require_once($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/classes/" . $DBType . "/event.php");
require_once($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/classes/general/menu.php");

AddEventHandler("main", "OnAfterEpilog", array(
    "\Bitrix\Main\Data\ManagedCache",
    "finalize"
));

require_once($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/classes/" . $DBType . "/usertype.php");

if (file_exists(($_602759598 = $_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/classes/general/update_db_updater.php"))) {
    $US_HOST_PROCESS_MAIN = False;
    include($_602759598);
}

$GLOBALS["APPLICATION"]->AddJSKernelInfo("main", array(
    "/bitrix/js/main/core/core.js",
    "/bitrix/js/main/core/core_ajax.js",
    "/bitrix/js/main/json/json2.min.js",
    "/bitrix/js/main/core/core_ls.js",
    "/bitrix/js/main/core/core_popup.js",
    "/bitrix/js/main/core/core_tooltip.js",
    "/bitrix/js/main/core/core_date.js",
    "/bitrix/js/main/core/core_timer.js",
    "/bitrix/js/main/core/core_fx.js",
    "/bitrix/js/main/core/core_window.js",
    "/bitrix/js/main/core/core_autosave.js",
    "/bitrix/js/main/rating_like.js",
    "/bitrix/js/main/session.js",
    "/bitrix/js/main/dd.js",
    "/bitrix/js/main/utils.js",
    "/bitrix/js/main/core/core_dd.js",
    "/bitrix/js/main/core/core_webrtc.js"
));

$GLOBALS["APPLICATION"]->AddCSSKernelInfo("main", array(
    "/bitrix/js/main/core/css/core.css",
    "/bitrix/js/main/core/css/core_popup.css",
    "/bitrix/js/main/core/css/core_tooltip.css",
    "/bitrix/js/main/core/css/core_date.css"
));

$GLOBALS["APPLICATION"]->AddJSKernelInfo("coreuploader", array(
    "/bitrix/js/main/core/core_uploader/common.js",
    "/bitrix/js/main/core/core_uploader/uploader.js",
    "/bitrix/js/main/core/core_uploader/file.js",
    "/bitrix/js/main/core/core_uploader/queue.js"
));

if (file_exists(($_602759598 = $_SERVER["DOCUMENT_ROOT"] . "/bitrix/init.php")))
    include_once($_602759598);

if (($_602759598 = getLocalPath("php_interface/init.php", BX_PERSONAL_ROOT)) !== false)
    include_once($_SERVER["DOCUMENT_ROOT"] . $_602759598);

if (($_602759598 = getLocalPath("php_interface/" . SITE_ID . "/init.php", BX_PERSONAL_ROOT)) !== false)
    include_once($_SERVER["DOCUMENT_ROOT"] . $_602759598);

if (!defined("BX_FILE_PERMISSIONS"))
    define("BX_FILE_PERMISSIONS", "420");

if (!defined("BX_DIR_PERMISSIONS"))
    define("BX_DIR_PERMISSIONS", 493);

$GLOBALS["sDocPath"] = $GLOBALS["APPLICATION"]->GetCurPage();

if ((!(defined("STATISTIC_ONLY") && STATISTIC_ONLY && substr($GLOBALS["APPLICATION"]->GetCurPage(), 0, strlen(BX_ROOT . "/admin/")) != BX_ROOT . "/admin/")) && COption::GetOptionString("main", "include_charset", "Y") == "Y" && strlen(LANG_CHARSET) > 0)
    header("Content-Type: text/html; charset=" . LANG_CHARSET);

if (COption::GetOptionString("main", "set_p3p_header", "Y") == "Y")
    header('P3P: policyref="/bitrix/p3p.xml", CP="NON DSP COR CUR ADM DEV PSA PSD OUR UNR BUS UNI COM NAV INT DEM STA"');
$LICENSE_KEY = "";

if (file_exists(($_602759598 = $_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/license_key.php")))
    include($_602759598);

if ($LICENSE_KEY == "" || strtoupper($LICENSE_KEY) == "DEMO")
    define("LICENSE_KEY", "DEMO");
else
    define("LICENSE_KEY", $LICENSE_KEY);

header("X-Powered-CMS: Bitrix Site Manager (" . (LICENSE_KEY == "DEMO" ? "DEMO" : md5("BITRIX" . LICENSE_KEY . "LICENCE")) . ")");

define("BX_CRONTAB_SUPPORT", defined("BX_CRONTAB"));

if (COption::GetOptionString("main", "check_agents", "Y") == "Y") {
    define("START_EXEC_AGENTS_1", microtime());
    $GLOBALS["BX_STATE"] = "AG";
    $GLOBALS["DB"]->StartUsingMasterOnly();
    CAgent::CheckAgents();
    $GLOBALS["DB"]->StopUsingMasterOnly();
    define("START_EXEC_AGENTS_2", microtime());
    $GLOBALS["BX_STATE"] = "PB";
}

ini_set("session.cookie_httponly", "1");

if ($_355529301 = $GLOBALS["APPLICATION"]->GetCookieDomain())
    ini_set("session.cookie_domain", $_355529301);

if (COption::GetOptionString("security", "session", "N") === "Y" && CModule::IncludeModule("security"))
    CSecuritySession::Init();

session_start();

foreach (GetModuleEvents("main", "OnPageStart", true) as $_1535583714)
    ExecuteModuleEventEx($_1535583714);

$GLOBALS["USER"] = new CUser;
$_1450308129 = $GLOBALS["USER"]->GetSecurityPolicy();
$_895714013 = time();

if (($_SESSION["SESS_IP"] && strlen($_1450308129["SESSION_IP_MASK"]) > 0 && ((ip2long($_1450308129["SESSION_IP_MASK"]) & ip2long($_SESSION["SESS_IP"])) != (ip2long($_1450308129["SESSION_IP_MASK"]) & ip2long($_SERVER["REMOTE_ADDR"])))) || ($_1450308129["SESSION_TIMEOUT"] > 0 && $_SESSION["SESS_TIME"] > 0 && $_895714013 - $_1450308129["SESSION_TIMEOUT"] * 60 > $_SESSION["SESS_TIME"]) || (isset($_SESSION["BX_SESSION_TERMINATE_TIME"]) && $_SESSION["BX_SESSION_TERMINATE_TIME"] > 0 && $_895714013 > $_SESSION["BX_SESSION_TERMINATE_TIME"]) || (isset($_SESSION["BX_SESSION_SIGN"]) && $_SESSION["BX_SESSION_SIGN"] <> bitrix_sess_sign()) || (isSessionExpired())) {
    $_SESSION = array();
    @session_destroy();
    if (COption::GetOptionString("security", "session", "N") === "Y" && CModule::IncludeModule("security"))
        CSecuritySession::Init();
    session_id(md5(uniqid(rand(), true)));
    session_start();
    $GLOBALS["USER"] = new CUser;
}

$_SESSION["SESS_IP"] = $_SERVER["REMOTE_ADDR"];
$_SESSION["SESS_TIME"] = time();

if (!isset($_SESSION["BX_SESSION_SIGN"]))
    $_SESSION["BX_SESSION_SIGN"] = bitrix_sess_sign();

if ((COption::GetOptionString("main", "use_session_id_ttl", "N") == "Y") && (COption::GetOptionInt("main", "session_id_ttl", 0) > 0) && !defined("BX_SESSION_ID_CHANGE")) {
    if (!array_key_exists("SESS_ID_TIME", $_SESSION)) {
        $_SESSION["SESS_ID_TIME"] = $_SESSION["SESS_TIME"];
    } elseif (($_SESSION["SESS_ID_TIME"] + COption::GetOptionInt("main", "session_id_ttl")) < $_SESSION["SESS_TIME"]) {
        if (COption::GetOptionString("security", "session", "N") === "Y" && CModule::IncludeModule("security")) {
            CSecuritySession::UpdateSessID();
        } else {
            session_regenerate_id();
        }
        $_SESSION["SESS_ID_TIME"] = $_SESSION["SESS_TIME"];
    }
}

define("BX_STARTED", true);

if (isset($_SESSION["BX_ADMIN_LOAD_AUTH"])) {
    define("ADMIN_SECTION_LOAD_AUTH", "1");
    unset($_SESSION["BX_ADMIN_LOAD_AUTH"]);
}

if (!defined("NOT_CHECK_PERMISSIONS") || NOT_CHECK_PERMISSIONS !== true) {

    $_1616618786 = isset($_REQUEST["logout"]) && (strtolower($_REQUEST["logout"]) == "yes");

    if ($_1616618786 && $GLOBALS["USER"]->IsAuthorized()) {
        $GLOBALS["USER"]->Logout();
        LocalRedirect($GLOBALS["APPLICATION"]->GetCurPageParam("", array(
            "logout"
        )));
    }

    if (!$GLOBALS["USER"]->IsAuthorized()) {
        $GLOBALS["USER"]->LoginByCookies();
    }

    $_1742455712 = false;

    if (($_797899070 = $GLOBALS["USER"]->LoginByHttpAuth()) !== null) {
        $_1742455712 = $_797899070;
        $GLOBALS["APPLICATION"]->SetAuthResult($_1742455712);
    }

    if (isset($_REQUEST["AUTH_FORM"]) && $_REQUEST["AUTH_FORM"] <> "") {
        $_1553056040 = false;
        if (COption::GetOptionString("main", "use_encrypted_auth", "N") == "Y") {
            $_1224269520 = new CRsaSecurity();
            if (($_1956826092 = $_1224269520->LoadKeys())) {
                $_1224269520->SetKeys($_1956826092);
                $_2078095736 = $_1224269520->AcceptFromForm(array(
                    "USER_PASSWORD",
                    "USER_CONFIRM_PASSWORD"
                ));
                if ($_2078095736 == CRsaSecurity::ERROR_SESS_CHECK)
                    $_1742455712 = array(
                        "MESSAGE" => GetMessage("main_include_decode_pass_sess"),
                        "TYPE" => "ERROR"
                    );
                elseif ($_2078095736 < 0)
                    $_1742455712 = array(
                        "MESSAGE" => GetMessage("main_include_decode_pass_err", array(
                            "#ERRCODE#" => $_2078095736
                        )),
                        "TYPE" => "ERROR"
                    );
                if ($_2078095736 < 0)
                    $_1553056040 = true;
            }
        }

        if ($_1553056040 == false) {
            if (!defined("ADMIN_SECTION") || ADMIN_SECTION !== true)
                $_413428552 = LANG;
            else
                $_413428552 = false;

            if ($_REQUEST["TYPE"] == "AUTH") {
                $_1742455712 = $GLOBALS["USER"]->Login($_REQUEST["USER_LOGIN"], $_REQUEST["USER_PASSWORD"], $_REQUEST["USER_REMEMBER"]);
            } elseif ($_REQUEST["TYPE"] == "OTP") {
                $_1742455712 = $GLOBALS["USER"]->LoginByOtp($_REQUEST["USER_OTP"], $_REQUEST["OTP_REMEMBER"], $_REQUEST["captcha_word"], $_REQUEST["captcha_sid"]);
            } elseif ($_REQUEST["TYPE"] == "SEND_PWD") {
                $_1742455712 = $GLOBALS["USER"]->SendPassword($_REQUEST["USER_LOGIN"], $_REQUEST["USER_EMAIL"], $_413428552);
            } elseif ($_SERVER["REQUEST_METHOD"] == "POST" && $_REQUEST["TYPE"] == "CHANGE_PWD") {
                $_1742455712 = $GLOBALS["USER"]->ChangePassword($_REQUEST["USER_LOGIN"], $_REQUEST["USER_CHECKWORD"], $_REQUEST["USER_PASSWORD"], $_REQUEST["USER_CONFIRM_PASSWORD"], $_413428552);
            } elseif (COption::GetOptionString("main", "new_user_registration", "N") == "Y" && $_SERVER["REQUEST_METHOD"] == "POST" && $_REQUEST["TYPE"] == "REGISTRATION" && (!defined("ADMIN_SECTION") || ADMIN_SECTION !== true)) {
                $_1742455712 = $GLOBALS["USER"]->Register($_REQUEST["USER_LOGIN"], $_REQUEST["USER_NAME"], $_REQUEST["USER_LAST_NAME"], $_REQUEST["USER_PASSWORD"], $_REQUEST["USER_CONFIRM_PASSWORD"], $_REQUEST["USER_EMAIL"], $_413428552, $_REQUEST["captcha_word"], $_REQUEST["captcha_sid"]);
            }

            if ($_REQUEST["TYPE"] == "AUTH" || $_REQUEST["TYPE"] == "OTP") {
                if ($_1742455712 === true && defined("ADMIN_SECTION") && ADMIN_SECTION === true) {
                    $GLOBALS["APPLICATION"]->StoreCookies();
                    $_SESSION["BX_ADMIN_LOAD_AUTH"] = true;
                    echo '<script type="text/javascript">window.onload=function(){top.BX.AUTHAGENT.setAuthResult(false);};</script>';
                    die();
                }
            }
        }

        $GLOBALS["APPLICATION"]->SetAuthResult($_1742455712);

    } elseif (!$GLOBALS["USER"]->IsAuthorized()) {
        $GLOBALS["USER"]->LoginHitByHash();
    }
}

if (($_969573532 = $GLOBALS["USER"]->GetParam("APPLICATION_ID")) !== null) {
    $_1589093256 = \Bitrix\Main\Authentication\ApplicationManager::getInstance();
    if ($_1589093256->checkScope($_969573532) !== true) {
        CHTTP::SetStatus("403 Forbidden");
        die();
    }
}

if (!defined("ADMIN_SECTION") || ADMIN_SECTION !== true) {
    $_201612664 = "";
    if (isset($_REQUEST["bitrix_preview_site_template"]) && $_REQUEST["bitrix_preview_site_template"] <> "" && $GLOBALS["USER"]->CanDoOperation("view_other_settings")) {
        $_1731543672 = CSiteTemplate::GetByID($_REQUEST["bitrix_preview_site_template"]);
        if ($_1702734568 = $_1731543672->Fetch()) {
            $_201612664 = $_1702734568["ID"];
        }
    }
    if ($_201612664 == "") {
        $_201612664 = CSite::GetCurTemplate();
    }
    define("SITE_TEMPLATE_ID", $_201612664);
    define("SITE_TEMPLATE_PATH", getLocalPath("templates/" . SITE_TEMPLATE_ID, BX_PERSONAL_ROOT));
}

if (isset($_GET["show_page_exec_time"])) {
    if ($_GET["show_page_exec_time"] == "Y" || $_GET["show_page_exec_time"] == "N")
        $_SESSION["SESS_SHOW_TIME_EXEC"] = $_GET["show_page_exec_time"];
}

if (isset($_GET["show_include_exec_time"])) {
    if ($_GET["show_include_exec_time"] == "Y" || $_GET["show_include_exec_time"] == "N")
        $_SESSION["SESS_SHOW_INCLUDE_TIME_EXEC"] = $_GET["show_include_exec_time"];
}

if (isset($_GET["bitrix_include_areas"]) && $_GET["bitrix_include_areas"] <> "")
    $GLOBALS["APPLICATION"]->SetShowIncludeAreas($_GET["bitrix_include_areas"] == "Y");

if ($GLOBALS["USER"]->IsAuthorized()) {
    $_1606313708 = COption::GetOptionString("main", "cookie_name", "BITRIX_SM");
    if (!isset($_COOKIE[$_1606313708 . "_SOUND_LOGIN_PLAYED"]))
        $GLOBALS["APPLICATION"]->set_cookie("SOUND_LOGIN_PLAYED", "Y", 0);
}

\Bitrix\Main\Page\Frame::shouldBeEnabled();

if (defined("BX_CHECK_SHORT_URI") && BX_CHECK_SHORT_URI && CBXShortUri::CheckUri()) {
    die();
}

foreach (GetModuleEvents("main", "OnBeforeProlog", true) as $_1535583714)
    ExecuteModuleEventEx($_1535583714);

if ((!defined("NOT_CHECK_PERMISSIONS") || NOT_CHECK_PERMISSIONS !== true) && (!defined("NOT_CHECK_FILE_PERMISSIONS") || NOT_CHECK_FILE_PERMISSIONS !== true)) {
    $_1948094785 = $_415566121->getScriptFile();
    if (!$GLOBALS["USER"]->CanDoFileOperation("fm_view_file", array(
        SITE_ID,
        $_1948094785
    )) || (defined("NEED_AUTH") && NEED_AUTH && !$GLOBALS["USER"]->IsAuthorized())) {
        if ($GLOBALS["USER"]->IsAuthorized() && $_1742455712["MESSAGE"] == "")
            $_1742455712 = array(
                "MESSAGE" => GetMessage("ACCESS_DENIED") . " " . GetMessage("ACCESS_DENIED_FILE", array(
                    "#FILE#" => $_1948094785
                )),
                "TYPE" => "ERROR"
            );
        if (defined("ADMIN_SECTION") && ADMIN_SECTION == true) {
            if ($_REQUEST["mode"] == "list" || $_REQUEST["mode"] == "settings") {
                echo "<script>top.location='" . $GLOBALS["APPLICATION"]->GetCurPage() . "?" . DeleteParam(array(
                    "mode"
                )) . "';</script>";
                die();
            } elseif ($_REQUEST["mode"] == "frame") {
                echo "<script type=\"text/javascript\">
                    var w = (opener? opener.window:parent.window);
                    w.location.href='" . $GLOBALS["APPLICATION"]->GetCurPage() . "?" . DeleteParam(array(
                    "mode"
                )) . "';
                </script>";
                die();
            } elseif (defined("MOBILE_APP_ADMIN") && MOBILE_APP_ADMIN == true) {
                echo json_encode(Array(
                    "status" => "failed"
                ));
                die();
            }
        }
        $GLOBALS["APPLICATION"]->AuthForm($_1742455712);
    }
}

while (!defined("OLDSITEEXPIREDATE") || strlen(OLDSITEEXPIREDATE) <= 0 || OLDSITEEXPIREDATE != SITEEXPIREDATE)
    die(GetMessage("expire_mess2"));

if (isset($_1584229364) && $_1584229364 == 404) {
    if (COption::GetOptionString("main", "header_200", "N") == "Y")
        CHTTP::SetStatus("200 OK");
}
?>

Из всей этой лабуды видно, что система хранит дату (с момента установки плюс тридцать дней) в двух местах. Первое место - файл ...modules/main/admin/define.php, в котором задаётся константа TEMPORARY_CACHE. Второе место - база данных (admin_passwordh в таблице b_option). Осталось поменять значения на свои и посмотреть на результат. Проблема только в том, что дата вида m0m1d0d1y0y1y2y3 разбросана по строке ETd1y3ISm0y1Xd0IRy0Ty2Im1B (прим. для OLDSITEEXPIREDATE), а строка зашифрована методом XOR с разными ключами для каждого случая и обёрнута в base64.

Ничего сложного. Процессы обратимы.

Перекур:)

Хак

Rest in peace bro

RIP 1 RIP 2 RIP 3

Рок из Подворотен... или как стать звездой за пять минут.

Дано: детище Кнабенгофа http://pilot.spb.ru/rip
Задача: спасти утопающих

И так. Погнали.

Ищем утопленника - Дельфы, 495 голосов.

Смотрим код, вникаем в суть. Среди прочей ереси находим кусок, который отвечает за голосовалку:

$(document).ready( function(){
    var _data='act=time';
    $.ajax({
        type: 'POST',
        url: '/modules/vote_request.php',
        data: _data,
        async: false,
        success: function(data){
            $(".vote_check").html(data);
        },
    });
});//end ready
function refresh_captcha() {
    var span_captcha = document.getElementById('span_captcha');   
    span_captcha.removeChild(span_captcha.getElementsByTagName('img')[0]);
    var captcha_img = document.createElement('img');
    captcha_img.src = '/kcaptcha?'+Math.random();
    span_captcha.appendChild(captcha_img);
}
function vote(ahref){
    $("span .hidd").remove();
    var container = $(ahref).parent();      
    container.css({position: 'relative', display: 'block'});
    var win = $('#hiddenwin');      
    $(container).append(win.html());
    var el = $(container).find(".hidd").show();
    var form = el.find('form')[0];
    $('.vote_check').click(function() {
        var id = $(this).attr('id');
        $(form['votenew']).val(id);
    });
    $(form['keystring']).focus();
    el.find('.cancel').click(function(){el.parent().css({position: ''});el.remove();})
    el.find('.ОК').click(function() {
        var keystring = $(form['keystring']).val();
        var id_vote = $(form['votenew']).val();
        var _data='act=vote&id_vote='+id_vote+'&capt='+keystring;
        $.ajax({
            type: 'POST',
            url: '/modules/vote_request.php',
            data: _data,
            async: false,
            success: function(data){
                //alert(data);
            },
        });
    })
}

Смешно? Смешно:) Всё тлен.

Ок. Кликаем на ссылку Голосовать. Вводим капчу. Дальше... если нажмём OK, отработает обработчик события click, который заботливо весит функция vote... уйдёт post запрос к скрипту vote_request.php ... после чего произойдёт стандартный сабмит формы с get запросом к http://pilot.spb.ru/rip/ - глупость...

Рефреш нам не интересен; иначе, будет больше лишних телодвижений. Мы ленивы.

Ищем кнопку OK, добавляем return false в событие onclick...

<input type="submit" value="ОК" class="ОК" onclick="return false;">

Отлично! Теперь можно втыкать в кнопарь. Пока палец не отсохнет.

Но, ещё раз, мы ленивы - на этом всё строится. Не хреново было бы, если бы... оно само в себя тыкало с определённой периодичностью.

Да без проблем! В стиле тру хацкер:)

<input type="submit" value="ОК" id="def" class="ОК" onclick="setTimeout(function(){document.getElementById('def').click();}, 5); return false;">

Идём курить... Задача выполнена. Дельфы - 6294.

А, да, и не забываем передать привет создателю сайта с пятнадцатилетним стажем:)

З.Ы. Когда-нить Дима покажет, как нагнать коней на весна.фм... Там замес интересней:)

Хак