Как надежно защитить внешнюю обработку 1С от копирования и изменения?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Разработка уникальных внешних обработок в среде 1С часто сталкивается с проблемой защиты авторских прав. Внешний файл формата .epf легко скопировать, передать третьим лицам или открыть в конфигураторе для модификации. Стандартная защита платформы в виде установки пароля на модуль обходится специализированными декомпиляторами за считанные секунды. В этой статье мы подробно разберем, как комплексно защитить вашу «нетленку» от незаконного тиражирования и несанкционированного изменения кода.

В чем главная сложность защиты внешних обработок?

Прежде чем перейти к методам защиты, выясним причину, почему файлы .epf так уязвимы. Платформа 1С хранит тексты модулей внутри файлов обработок в зашифрованном, но легко восстановимом виде. Установка пароля на модуль скрывает только исходный текст для разработчика в конфигураторе. При этом скомпилированный байт-код (набор низкоуровневых инструкций для виртуальной машины 1С) остается внутри файла в исходном виде.

Современные декомпиляторы с легкостью восстанавливают структуру метаданных, переменные и алгоритмы из этого байт-кода, полностью игнорируя установленный пароль. Поэтому для реальной защиты нам придется использовать более глубокие методы контроля.

Решение 1: Удаление исходного кода через поставку конфигурации

Это самый надежный штатный способ защиты кода, предоставляемый самой платформой 1С. Мы можем полностью удалить исходный текст модуля объекта из файла обработки, оставив там только скомпилированный байт-код. Платформа сможет выполнять этот код, но человек (и большинство простых декомпиляторов) прочитать его не сможет.

Рассмотрим пошагово, как реализовать этот метод:

  1. Перенесите всю основную бизнес-логику из модулей форм в Модуль объекта обработки. Оформите алгоритмы в виде экспортных процедур и функций. В модуле формы должны остаться только интерфейсные вызовы этих процедур. Это важно, так как модуль формы полностью очистить от кода без потери работоспособности нельзя.
  2. Создайте новую пустую базу данных в режиме конфигуратора.
  3. Встройте вашу внешнюю обработку в состав метаданных этой конфигурации.
  4. Перейдите в меню Конфигурация — Поставка конфигурации — Настройка поставки.
  5. В открывшемся дереве объектов найдите вашу обработку, дважды кликните по ней и снимите флажок Включать в поставку исходный текст для модуля объекта.
  6. Создайте файлы поставки конфигурации (файл .cf).
  7. Откройте полученный файл конфигурации .cf в конфигураторе, найдите вашу обработку, нажмите по ней правой кнопкой мыши и выберите пункт Сохранить как внешнюю обработку или отчет.

В результате мы получим файл .epf, внутри которого физически отсутствует исходный код модуля объекта. При попытке открыть такой модуль в конфигураторе система выдаст сообщение: «Текст модуля отсутствует».

Решение 2: Обфускация байт-кода и исходного текста

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

При обфускации исходного текста специальное ПО заменяет имена всех переменных, процедур и функций на бессмысленные наборы символов (например, _l11ОO0o), удаляет комментарии и форматирование, а также шифрует строковые литералы. Разобраться в таком коде человеку становится практически невозможно.

Более продвинутый метод — обфускация байт-кода (низкоуровневая модификация скомпилированных инструкций). Рассмотрим, как это работает:

Решение 3: Логическая привязка к реквизитам организации (ИНН/КПП)

Чтобы ваша обработка не пошла «по рукам», можно сделать так, чтобы её ключевые функции работали только для конкретного клиента. Для этого мы привяжем логику выполнения к ИНН и КПП организации из информационной базы.

Посмотрим на пример реализации такой проверки в модуле объекта обработки:


Функция ПроверитьРазрешениеЗапуска() Экспорт
    
    // Получаем ИНН нашей организации из базы данных
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |	Организации.ИНН КАК ИНН,
        |	Организации.КПП КАК КПП
        |ИЗ
        |	Справочник.Организации КАК Организации
        |ГДЕ
        |	НЕ Организации.ПометкаУдаления";
    
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        ТекущийИНН = СокрЛП(Выборка.ИНН);
        ТекущийКПП = СокрЛП(Выборка.КПП);
    Иначе
        Возврат Ложь;
    КонецЕсли;
    
    // Проверяем соответствие зашифрованному ключу (хэшу)
    // Чтобы клиент не мог просто подменить строку ИНН в коде
    КлючКлиента = ТекущийИНН + "_" + ТекущийКПП;
    ХэшЛицензии = ПолучитьХэшСтроки(КлючКлиента); 
    
    // Пример хэша для ИНН 7701234567 и КПП 770101001
    ПравильныйХэш = "d5f812a39281a89c30198e82103f191a"; 
    
    Если ХэшЛицензии = ПравильныйХэш Тогда
        Возврат Истина;
    Иначе
        Возврат Ложь;
    КонецЕсли;
    
КонецФункции

Важный нюанс: никогда не храните ИНН/КПП в открытом виде для сравнения через обычное условие Если ТекущийИНН = "7701234567" Тогда. Внимательный взломщик легко найдет эту строку поиском. Всегда сравнивайте хэш-суммы строк (например, используя MD5 или SHA-256), чтобы скрыть реальные значения реквизитов.

Решение 4: Вынос логики во внешние компоненты (Native API)

Если защита внутри платформы 1С кажется вам недостаточной, можно перенести самые сложные и критичные алгоритмы во внешнюю библиотеку (DLL для Windows или SO для Linux), написанную на C++, C# или Rust.

Разберем, как выглядит схема взаимодействия в данном случае:

  1. Вы создаете внешнюю компоненту по технологии Native API, которая поддерживается платформой 1С на всех операционных системах.
  2. Внутри этой компоненты вы реализуете ключевой расчет (например, сложную формулу ценообразования, интеграционный обмен или алгоритм заполнения документа).
  3. Сама библиотека компилируется в машинный код. Распутать его обратно в исходный текст практически невозможно.
  4. Вы помещаете скомпилированный файл библиотеки в макет обработки как Двоичные данные.
  5. При запуске обработки код извлекает библиотеку из макета во временный каталог компьютера и подключает ее средствами платформы.

Посмотрим на пример кода подключения такой компоненты:


Процедура ПодключитьЗащищенныйМодуль()
    
    ИмяФайлаКомпоненты = ПолучитьИмяВременногоФайла("dll");
    МакетКомпоненты = ПолучитьМакет("ЗащищеннаяБиблиотека");
    МакетКомпоненты.Записать(ИмяФайлаКомпоненты);
    
    Попытка
        ПодключитьВнешнююКомпоненту(ИмяФайлаКомпоненты, "Защита", ТипВнешнейКомпоненты.Native);
        ОбъектЗащиты = Новый("AddIn.Защита.MainLogic");
        // Вызываем закрытую функцию из DLL
        Результат = ОбъектЗащиты.ВыполнитьРасчет(ПараметрыДанных);
    Исключение
        ВызватьИсключение "Не удалось запустить защищенный модуль системы!";
    КонецПопытки;
    
КонецПроцедуры

Этот метод гарантирует максимальную защиту алгоритмов, так как декомпиляция машинного кода требует колоссальных временных затрат и высочайшей квалификации реверс-инженера.

Решение 5: Облачная модель выполнения (SaaS)

Наиболее современный подход, который полностью решает проблему кражи интеллектуальной собственности. Если код физически не передается клиенту, то и украсть его невозможно. Вся бизнес-логика обработки переносится на ваш собственный удаленный веб-сервер, а внешняя обработка выступает лишь в роли интерфейса ввода-вывода.

Рассмотрим, как организовать эту схему:

Пример отправки данных на сервер защиты из модуля обработки:


Функция ОтправитьЗапросНаСерверЗащиты(ДанныеЗапроса)
    
    Сервер = "api.my-netlenka.ru";
    Порт = 443;
    
    // Используем защищенное соединение OpenSSL
    ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;
    HTTPСоединение = Новый HTTPСоединение(Сервер, Порт,,,,, ЗащищенноеСоединение);
    
    HTTPЗапрос = Новый HTTPЗапрос("/v1/process");
    HTTPЗапрос.УстановитьТелоИзСтроки(ДанныеЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    HTTPЗапрос.Заголовки.Вставить("Authorization", "Bearer " + КлючЛицензииКлиента);
    
    Попытка
        HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
        Если HTTPОтвет.КодСостояния = 200 Тогда
            Возврат HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
        Иначе
            ЗаписатьЛогОшибки(HTTPОтвет.КодСостояния);
            Возврат Неопределено;
        КонецЕсли;
    Исключение
        ВызватьИсключение "Ошибка связи с сервером авторизации!";
    КонецПопытки;
    
КонецФункции

Важное предупреждение: Безопасный режим и защита платформы 1С

Проанализируем ограничения, с которыми вы можете столкнуться при использовании сложных методов защиты (компонент Native API, COM-объектов или WMI-запросов для привязки к железу компьютера). Начиная с версии платформы 8.3.9, в 1С активно работает механизм «Защиты от опасных действий».

Если ваша внешняя обработка пытается загрузить внешнюю компоненту или выполнить команду операционной системы, платформа выдаст пользователю предупреждающее диалоговое окно безопасности. Если база работает в строгом безопасном режиме (например, во фреше или под жесткими политиками администрирования), запуск внешнего кода и вовсе будет заблокирован.

По этой причине мы рекомендуем отдавать предпочтение следующим методам защиты:

Комбинируя предложенные решения, вы сможете подобрать оптимальный баланс между стоимостью разработки защиты и сложностью её потенциального взлома, надежно защитив свои интеллектуальные права.

← На главную