При разработке тиражных решений и уникальных авторских конфигураций на платформе 1С:Предприятие 7.7 разработчики сталкиваются с проблемой защиты интеллектуальной собственности. Внутренняя архитектура файла конфигурации 1Cv7.MD представляет собой структурированное хранилище (OLE Compound Document), в котором весь программный код хранится в незашифрованном текстовом виде. Разберем по шагам, какие существуют ограничения платформы, почему стандартные средства защиты не работают и как надежно защитить конфигурацию техническими и организационными методами.
Штатная установка пароля на конфигурацию через пункт меню Конфигуратора лишь блокирует открытие структуры дерева метаданных в режиме разработки. Однако исходные тексты программных модулей остаются в теле файла 1Cv7.MD в открытом виде. Любой текстовый редактор или специализированные утилиты распаковки compound-файлов позволяют извлечь и прочитать весь программный код без ввода пароля и без запуска среды 1С.
Простая проверка аппаратного окружения с помощью штатной функции ИмяКомпьютера() в процедуре ПриНачалеРаботыСистемы() глобального модуля также легко обходится:
Процедура ПриНачалеРаботыСистемы()
Если ВРег(ИмяКомпьютера()) <> "SRV-MAIN" Тогда
Предупреждение("Запуск программы на данном компьютере запрещен!");
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецПроцедуры
Такой механизм ненадежен: сетевое имя любого компьютера можно переименовать в операционной системе за несколько секунд, а при наличии прямого доступа к файлу конфигурации данный блок кода может быть просто удален.
Наиболее популярный и проверенный способ защиты решений на платформе 1С 7.7 — применение специализированных систем защиты исходного кода (например, КЗК — Комплекс Защиты Конфигураций). Принцип работы таких средств заключается в следующем:
1Cv7.MD заменяется на защищенные бинарные блоки.Если требуется гарантировать максимальную надежность, ключевые алгоритмы программы выносятся за пределы конфигурации 1С в скомпилированные бинарные библиотеки:
IInitDone и ILanguageExtender) или стандартных COM-объектов.ЗагрузитьВнешнююКомпоненту() или СоздатьОбъект().
Если ЗагрузитьВнешнююКомпоненту("MyProtectExt.dll") = 0 Тогда
Предупреждение("Не удалось загрузить модуль лицензирования!");
СтатусВозврата(0);
Возврат;
КонецЕсли;
Защита = СоздатьОбъект("AddIn.MyProtectClass");
Если Защита.ПроверитьЛицензию() = 0 Тогда
Предупреждение("Лицензия не найдена или привязана к другому оборудованию!");
СтатусВозврата(0);
Возврат;
КонецЕсли;
Для создания собственной системы лицензирования без покупки сторонних программных комплексов можно использовать получение уникальных аппаратных идентификаторов компьютера средствами Windows Management Instrumentation (WMI):
Функция ПолучитьСерийныйНомерПлаты()
Попытка
Локатор = СоздатьОбъект("WbemScripting.SWbemLocator");
Служба = Локатор.ConnectServer(".", "root\cimv2");
Коллекция = Служба.ExecQuery("SELECT SerialNumber FROM Win32_BaseBoard");
Для Каждого Элемент Из Коллекция Цикл
Возврат СокрЛП(Элемент.SerialNumber);
КонецЦикла;
Исключение
Возврат "";
КонецПопытки;
Возврат "";
КонецФункции
Проанализируем этот подход: полученный серийный номер материнской платы или процессора (Win32_Processor) хешируется вместе с секретной солью и сравнивается со значением в зашифрованном файле лицензии. Однако помните, что сам модуль 1С, выполняющий эту проверку, обязательно должен быть защищен от чтения (вынесен в DLL или зашифрован), иначе злоумышленник сможет закомментировать вызов функции.
При наличии постоянного подключения к интернету проверка лицензии может производиться через обращение к вашему веб-серверу авторизации с использованием системных HTTP-клиентов:
Функция ПроверитьЛицензиюОнлайн(ИДКлиента, КлючПродукта)
Попытка
HTTP = СоздатьОбъект("MSXML2.ServerXMLHTTP");
URL = "https://lic.myserver.com/check?client=" + ИДКлиента + "&key=" + КлючПродукта;
HTTP.Open("GET", URL, 0);
HTTP.Send();
Если HTTP.Status = 200 Тогда
Ответ = HTTP.ResponseText;
Если Ответ = "VALID_OK" Тогда
Возврат 1;
КонецЕсли;
КонецЕсли;
Исключение
Возврат 0;
КонецПопытки;
Возврат 0;
КонецФункции
Если разработка выполняется под заказ для конкретного предприятия, наиболее надежным решением является предоставление удаленного доступа к программе без передачи самого файла базы данных:
1Cv7.MD.