cs cart самостоятельное nullение

nuller555

Постоялец
Регистрация
24 Мар 2016
Сообщения
38
Реакции
7
Товарищи, а что из себя представляет версия cs cart которая якобы демо и которую даёт скачать разраб с сайта cs-cart.com/download-multivendor.html
То есть вопрос в том, не покупают же те кто делают нулл платную версию, а откуда тогда нулл, получается они демку эту нулят и в чем тогда отличие от не демо?
Разраб получается даёт скачать полную версию, а демо её называет по тому что там скрипты всякие вписаны ограничители по времени и т.п? а когда их убираешь то считай полная версия?
Или эта демо которую дают качать на офф сайте совсем другое не то что нуллят, а нуллят полную версию которую откуда то берут?
 
Что бы достичь нужного нам результата, скорее всего берется демка, которая изначально имеет весь нужный функционал и из нее выпиливаются все стучалки, проверка лицензии и прочая лобуда. Так как любой скрипт это набор функций написанных на PHP(например), зная технологию, мы можем найти нужный нам контекст кода и изменить его под себя, оставив функционал, но убрав из него всю лицензионную историю.
По факту любую cms можно реструктурировать и просто забрать оттуда нужный нам функционал, если даже сама она отказывается работать без соответствующей лицензии, либо наоборот мы все оставляем но убираем эту самую проверку.
Сложный момент заключается в том, что более продвинутые разрабы могут загнать код и стучалки под разные шифробальщики типа ioncube и тогда файл с кодом будет представлять их себя шифр, который невозможно будет изменить до момента декодирования, что требует более продвинутых знаний, чем просто знание PHP, а именно там может быть закодирована та необходимая часть, которая обеспечивает лицензионный функционал и требуется к удалению.

Ps. Это общее представление о нулении. О самом ca cart сказать не могу, так как не использовал.
 
сейчас нуллы на карт сродни битриксу, делятся платно и в узких кругах)
 
я скачал версию демо multivendor_v4.18.2.zip с офф сайта и multivendor_v4.18.1 нуленную с соседней темы
сравнил файлы которые отличаются, делаем скидку на то что некоторые файлы изменились при переходе с 4.18.1 на 4.18.2, и отличаются не по тому, что нуллевшему пришлось их править, в любом случаи там пара сотен php файлов которые нужно посмотреть, что бы сделать отвязку, правда я ещё не смотрел и не знаю есть ли среди них зашифрованные или все с открытым кодом
в любом случаи учитывая цену скрипта, пару сотен php файлов разобрать вполне оправдано
зато у вас будет личный нулл, где вы будете знать, что нет стучалок, бекдоров и т.д. по тому что не многие кто выкладывают нуллы в паблики не делают там бекдоры, что бы потом, что то с этого поиметь
Второй путь это качать чей то нулл, где будет сложнее определить нет ли там бекдора или умышленной уязвимости для доступа к данным, поскольку он может быть уже в и js файлах а не только php
отличающиеся файлы в 1.txt
 

Вложения

  • 1.txt
    26,8 KB · Просмотры: 3
Вот подробная инструкция нулла, кто хочет сам занулить ручками:

Найти и удалить:
PHP:
foreach ($core_hashes as $hash => $file) {

        if ($hash != sha1_file($dir_root . strrev(str_rot13($file['file'])))) {
            if (filemtime($dir_root . strrev(str_rot13($file['file']))) < TIME - SECONDS_IN_DAY * 2) { // 2-days cache
                Tygh::$app['cache']->regenerate($hash, $file['file']);
            }

            fn_process_cache_notifications($file['notice']);

            break;
        }
    }
1) Найти:
PHP:
if (empty($license_number)) {
            $uc_settings = Settings::instance()->getValues('Upgrade_center');
            $license_number = $uc_settings['license_number'];
        }

        $store_mode = fn_get_storage_data('store_mode');

        if (empty($license_number) && !in_array($store_mode, ['trial', 'free'])) {
            return 'LICENSE_IS_INVALID';
        }

        $store_ip = fn_get_ip();
        $store_ip = $store_ip['host'];

        $request = [
            'license_number'   => $license_number,
            'ver'              => PRODUCT_VERSION,
            'product_status'   => PRODUCT_STATUS,
            'product_build'    => strtoupper(PRODUCT_BUILD),
            'edition'          => isset($extra_fields['edition'])
                ? $extra_fields['edition']
                : PRODUCT_EDITION,
            'lang'             => strtoupper(CART_LANGUAGE),
            'store_uri'        => fn_url('', 'C', 'http'),
            'secure_store_uri' => fn_url('', 'C', 'https'),
            'https_enabled'    => (Registry::get('settings.Security.secure_storefront') === YesNo::YES || Registry::get('settings.Security.secure_admin') === YesNo::YES)
                ? 'Y'
                : 'N',
            'admin_uri'        => str_replace(fn_get_index_script('A'), '', fn_url('', 'A', 'http')),
            'store_ip'         => $store_ip,
            'store_mode'       => strtoupper(isset($extra_fields['store_mode'])
                ? $extra_fields['store_mode']
                : $store_mode
            ),
        ];

        $request = array(
            'Request@action=check_license@api=3' => array_merge($extra_fields, $request),
        );

        $request = '<?xml version="1.0" encoding="UTF-8"?>' . fn_array_to_xml($request);

        Registry::set('log_cut', Registry::ifGet('config.demo_mode', false));

        $data = Http::get(Registry::get('config.resources.updates_server') . '/index.php?dispatch=product_updates.check_available', array('request' => $request), array(
            'timeout' => 10
        ));

        if (empty($data)) {
            $data = fn_get_contents(Registry::get('config.resources.updates_server') . '/index.php?dispatch=product_updates.check_available&request=' . urlencode($request));
        }

        $_SESSION['license_information'] = $data;

        if (empty($license_number) && !fn_allowed_for('ULTIMATE:FREE')) {
            return 'LICENSE_IS_INVALID';
        }

        return $data;
Заменить:
PHP:
Registry::set('log_cut', false);
        return 'ACTIVE';

2) Найти:
PHP:
$updates = $messages = $license = '';
        $params = $restrictions = [];

        if (!empty($data)) {
            // Check if we can parse server response
            if (strpos($data, '<?xml') !== false) {
                $xml = simplexml_load_string($data);
                $updates = (string) $xml->Updates;
                $messages = $xml->Messages;
                $license = (string) $xml->License;

                if (isset($xml->TrialExpiryTime)) {
                    $params['trial_expiry_time'] = (int) $xml->TrialExpiryTime;
                }

                if (isset($xml->TrialLeftTime)) {
                    $params['trial_left_time'] = (int) $xml->TrialLeftTime;
                }

                if (isset($xml->AllowedNumberOfStores)) {
                    fn_set_storage_data('allowed_number_of_stores', (int) $xml->AllowedNumberOfStores);
                } else {
                    fn_set_storage_data('allowed_number_of_stores', null);
                }

                if (isset($xml->Restrictions)) {
                    $json_restrictions = json_encode($xml->Restrictions);
                    $restrictions = json_decode($json_restrictions, true);

                    fn_set_storage_data('restrictions', serialize($restrictions));
                } else {
                    fn_set_storage_data('restrictions', '');
                }

                if (isset($xml->LicenseKey)) {
                    Settings::instance()->updateValue('license_number', (string) $xml->LicenseKey, '', false, null, false);
                }

                if (isset($xml->FreeMode) && fn_allowed_for('ULTIMATE:FREE') && YesNo::isFalse(fn_get_storage_data('free_mode', false))) {
                    fn_set_storage_data('free_mode', YesNo::YES);
                }

                if (isset($xml->LatestAvailableVersion)) {
                    fn_set_storage_data('latest_available_version', (string) $xml->LatestAvailableVersion->Version);
                    fn_set_storage_data('latest_available_version_timestamp', (string) $xml->LatestAvailableVersion->Timestamp);
                }
            } else {
                $license = $data;
            }
        }

        if (!empty($auth)) {
            if (Registry::get('settings.General.auto_check_updates') === YesNo::YES &&
                fn_check_user_access($auth['user_id'], 'upgrade_store') &&
                $updates == 'AVAILABLE'
            ) {
                /** @var \Tygh\NotificationsCenter\NotificationsCenter $notifications_center */
                $notifications_center = Tygh::$app['notifications_center'];
                $notifications_center->add([
                    'user_id'    => $auth['user_id'],
                    'title'      => __('notification.upgrade_available.title'),
                    'message'    => __('notification.upgrade_available.message', [
                        '[product]' => PRODUCT_NAME,
                    ]),
                    'area'       => 'A',
                    'section'    => NotificationsCenter::SECTION_ADMINISTRATION,
                    'tag'        => NotificationsCenter::TAG_UPDATE,
                    'action_url' => fn_url('upgrade_center.manage'),
                    'language_code' => Registry::get('settings.Appearance.backend_default_language'),
                ]);
            }

            if (!empty($data)) {
                $_SESSION['last_status'] = $license;
            }
        }

        $messages = self::processMessages($messages, $process_messages, $license);

        return [$license, $updates, $messages, $params, $restrictions];
Заменить:
PHP:
$_SESSION['last_status'] = 'ACTIVE';
        return array('ACTIVE', 'NO UPDATES', '', []);

3) Найти:
PHP:
$request = array(
            'Request@action=registerLicense@api=2' => array(
                'product_type' => PRODUCT_EDITION,
                'domain' => Registry::get('config.http_host'),
                'first_name' => $license_data['first_name'],
                'last_name' => $license_data['last_name'],
                'email' => $license_data['email'],
            ),
        );

        $request = '<?xml version="1.0" encoding="UTF-8"?>' . fn_array_to_xml($request);

        $data = Http::get(Registry::get('config.resources.updates_server') . '/index.php?dispatch=licenses_remote.add', array('request' => $request), array(
            'timeout' => 10
        ));

        if (empty($data)) {
            $data = fn_get_contents(Registry::get('config.resources.updates_server') . '/index.php?dispatch=licenses_remote.create&request=' . urlencode($request));
        }

        $result = $messages = $license = '';

        if (!empty($data)) {
            // Check if we can parse server response
            if (strpos($data, '<?xml') !== false) {
                $xml = simplexml_load_string($data);
                $result = (string) $xml->Result;
                $messages = $xml->Messages;
                $license = (array) $xml->License;
            }
        }

        self::processMessages($messages, true, $license);

        return array($result, $license, $messages);
Заменить:
PHP:
return array('', 'ACTIVE', '');

4) Найти:
PHP:
$request = array(
            'dispatch' => 'product_updates.check_storeimport_available',
            'license_key' => $license_number,
            'ver' => $version,
            'edition' => $edition,
        );

        $data = Http::get(Registry::get('config.resources.updates_server'), $request, array(
            'timeout' => 10
        ));

        if (empty($data)) {
            $data = fn_get_contents(Registry::get('config.resources.updates_server') . '/index.php?' . http_build_query($request));
        }

        $result = false;

        if (!empty($data)) {
            // Check if we can parse server response
            if (strpos($data, '<?xml') !== false) {
                $xml = simplexml_load_string($data);
                $result = ((string) $xml == 'Y') ? true : false;
            }
        }

        return $result;
Заменить:
PHP:
return true;

5) Найти:
PHP:
$license_status = 'LICENSE_IS_INVALID';
        $store_mode = '';
        $messages = [];

        if (fn_allowed_for('MULTIVENDOR')) {
            $store_modes_list = ['', 'plus', 'ultimate', 'enterprise'];
        } else {
            $store_modes_list = ['free', '', 'ultimate', 'enterprise'];
        }

        foreach ($store_modes_list as $store_mode) {
            $extra['store_mode'] = $store_mode;
            $data = Helpdesk::getLicenseInformation($license_number, $extra);
            list($license_status, , $messages, , $restrictions) = Helpdesk::parseLicenseInformation($data, $auth, false);
            if ($license_status == 'ACTIVE') {
                break;
            }
        }

        return [$license_status, $messages, $store_mode, $restrictions];
Заменить:
PHP:
$extra['store_mode'] = 'multivendor';
        return [ 'ACTIVE', '', 'multivendor' ];

6) Найти и удалить:
PHP:
if ($storefronts_limit = fn_get_storage_data('allowed_number_of_stores')) {
            /** @var \Tygh\Storefront\Repository $repository */
            $repository = Tygh::$app['storefront.repository'];
            $storefronts_count = $repository->getCount();

            return $storefronts_count >= $storefronts_limit;
        }

7) Найти и удалить:
PHP:
$uc_settings = Settings::instance()->getValues('Upgrade_center');
        $license_number = $uc_settings['license_number'];

        if ($license_number) {
            $metrics = fn_get_schema('reporting', 'metrics');

            foreach ($metrics as &$value) {
                if (is_callable($value)) {
                    $value = call_user_func($value);
                }
            }
            unset($value);

            $logging = Http::$logging;
            Http::$logging = false;

            Http::post(
                Registry::get('config.resources.updates_server') . '/index.php?dispatch=license_tracking.report',
                array(
                    'metrics' => $metrics,
                    'license_number' => $license_number
                ),
                array(
                    'timeout' => 10
                )
            );

            Http::$logging = $logging;
        }

8) Найти:
PHP:
if (!isset($request['token'])) {
            return false;
        }

        $validation_params = array_merge([
            'dispatch' => 'validators.validate_request',
            'token'    => $request['token'],
        ], $additional_validation_params);

        $validator_url = Registry::get('config.resources.updates_server') . '/index.php';

        $log_cut = Registry::ifGet('log_cut', false);

        Registry::set('log_cut', true);
        $validator_response = Http::get($validator_url, $validation_params);
        Registry::set('log_cut', $log_cut);

        $validator_response = strtolower(trim($validator_response));

        return $validator_response === 'valid';
Заменить:
PHP:
return 'valid';

9) Найти и удалить:
PHP:
/** @var \Tygh\SoftwareProductEnvironment $software */
        $software = Tygh::$app['product.env'];

        if ($format === 'json') {
            $version = [
                'product_name'   => $software->getProductName(),
                'version'        => $software->getProductVersion(),
                'product_status' => $software->getProductStatus(),
                'product_build'  => $software->getProductBuild(),
                'store_mode'     => $software->getStoreMode(),
            ];

            if (YesNo::toBool($get_last_action)) {
                $version['last_action'] = self::getLastAction();
            }

            $version_string = json_encode($version);
        } else {
            $version_string = $software->getProductName() . ' <b>' . $software->getProductVersion() . ' ';
            if ($software->getProductStatus() !== '') {
                $version_string .= ' (' . $software->getProductStatus() . ')';
            }
            if ($software->getProductBuild()) {
                $version_string .= ' ' . $software->getProductBuild();
            }
            $version_string .= '</b>';
        }

        if ($stop_execution) {
            echo $version_string;
            exit(0);
        }

        return $version_string;
1) Найти:
PHP:
define('PRODUCT_STATUS', '');
Заменить:
PHP:
define('PRODUCT_STATUS', 'ACTIVE');
 
Назад
Сверху