Танцы с бубном! Создаём демонстрационную базу

Программирование - Защита и шифрование

67
В статье кратко расскажу Вам о моём опыте создания демонстрационной версии базы данных 1С и способах защиты кода.

Пусть, Вы написали свой собственный программный продукт и появилось желание его продать. Для успешной продажи Вашего продукта конечно же нужна демонстрация, а лучше всего демонстрационная база данных. Как правило при создании демонстрационной базы данных разработчик каким либо способом ограничивает действие продукта - по времени использования или до определённой даты. К примеру, продукт перестанет работать через 30 запусков или после какой нибудь даты, к примеру 01.06.2018 года.

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

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

Способы защиты демонстрационной конфигурации:

1. Код основной конфигурации можно сделать открытым, код демоверсии всегда делайте закрытым. При закрытом исходном коде отсеются "ленивые" программисты и те, кто не смогут его декомпилировать.

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

 
 Минусы подхода 

3. а) Не храните в явном виде дату окончания действия демоверсии или количество записей.

Пример, создали периодический регистр сведений Служебный с Измерением Дата и Ресурсом Количество запусков.

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

Дата

Количество запусков

WоиоЫмGдШf17fД2135135ГПд

Sdfvhuyj35135465jhjguyu

То есть функция будет выглядеть примерно так:

Функция Преобразование ()
                Запрос = Новый Запрос;
                Запрос.Текст = "ВЫБРАТЬ
                               |                Служебный.Дата КАК Дата,
                               |                Служебный. КоличествоЗапусков КАК КоличествоЗапусков,
                               |ИЗ
                               |                РегистрСведений. Служебный КАК Служебный";

ТЗ = Запрос.Выполнить().Выгрузить();
Для Каждого Строка из ТЗ Цикл
// здесь будет Ваш код, он будет уникальным, в зависимости от того какой алгоритм придумаете.
// Далее получаем дату и количество запусков программы из строки преобразуем её
КонецЦикла;
Возврат ТЗ;  //Возвращает в ТЗ уже значения 01.06.2018 и 30.        
КонецФункции

 

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

Есть ещё небольшая хитрость. Вы можете сделать проверку на неверное время, в случае если пользователь переводит системные часы. Проверка может сверять, например, текущий год и значение 2018 год. Если сейчас база запущена и текущая системная дата выставлена 30.09.2017 г, а демоверсия создана в 2018 году, то после проверки вы получите неверное значение.

Ниже пример:

Функция ПроверкаТекущегоГода() //возвращает Ложь если год не 2018
Если Год(ТекущаяДата()) <> Год(Дата("20180601")) Тогда
   Возврат Ложь;
Иначе
   Возврат Истина;
КонецЕсли;
КонецФункции

в) Храните дату окончания работы и количество запусков в виде бинарного файла, а сам файл поместите в Хранилище значения.

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

К этому же способу предлагаю отнести хранение в бинарном виде обработок, если они хранятся в объекте Хранилище значения.

4. Можно хранить любые функции, данные по количеству запусков и дате окончания не в метаданных конфигурации, а в виде DLL, внешнего бинарного файла или параметрами в реестре Windows. Для этого Вам придется работать с компонентами или чтением бинарных файлов. Также можно использовать Flash память или токен в виде лицензионного ключа. Этот пункт не является обязательным.

5. Усложнение кода демонстрационной конфигурации.

а) Будьте трудолюбивы. Не вызывайте одну и ту же функцию из одного места. Разнесите эту функцию, с небольшими изменениями в названии и коде в разные объекты. К примеру, указанную выше функцию Преобразование()  вы используете при старте системы вызывая её из общего модуля, затем растиражируйте её в модули различных документов и справочников с названиеми Преобразовыватель(), ПолучениеХэша(), ПросмотрДанных() и т.д. И эти функции вызывайте из модулей форм документов, справочников, регистров.

 

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

Например,

 

// Функция ПолучитьЗначение() находится в модуле документа Реализация

Функция ПолучитьЗначение()
Значение  =  МодульПроверкиСервер.ПолучитьЗначение();
Возврат Значение;
КонецФункции
// Функция ПолучитьЗначениеДляРеализации() находится в общем модуле МодульПроверкиСервер

Функция ПолучитьЗначениеДляРеализации ()
Значение  = МодульДополнительнойПроверки.НайтиЗначение();
Возврат Значение;
КонецФункции

 

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

 

в) Используйте функции с генератором случайных чисел, вызывая другие "куски" кода в случайном порядке.

Функция ПолучитьЗначениеДляПоступления ()

ГСЧ = Новый ГенераторСлучайныхЧисел();
СлучайноеЧисло = ГСЧ.СлучайноеЧисло(0, 2); 

Если  СлучайноеЧисло  =  0 Тогда
Значение  =  МодульПроверкиСервер.ПолучитьЗначение();
Возврат Значение;

Иначе Если  СлучайноеЧисло  =  1 Тогда
Значение  = МодульДополнительнойПроверки.НайтиЗначение();
Возврат Значение;

Иначе Если  СлучайноеЧисло  =  2 Тогда
Значение  =  МодульВызоваПроверки.ПолучитьЗначениеКонстанты();
Возврат Значение;

Иначе

КонецФункции

 

6. Использование "служебных" справочников и регистров.

а) Для хранения значений наименований реквизитов форм.

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

Для примера, возьму документ Реализация товаров и услуг. Пусть у этого документа имеются реквизиты Покупатель, Продавец, Табличная часть с полями - номенклатура, цена, количество. Свойства Заголовок реквизитов формы можно оставить пустым или заполнить символами ХХХХХХХ.

Создадим регистр, в котором будем хранить данные формы - ДанныеПолейФорм, в качестве измерений регистра создадим строковый реквизит ИмяФормы, ресурсы - Наименование, Принадлежность.

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

 

ИмяФормы

Принадлежность

Наименование

ОсновнаяФормаРеализации

Основной

Продавец

ФормаСпискаРеализации

Основной

Покупатель

ОсновнаяФормаРеализации

Основной

Покупатель

ОсновнаяФормаРеализации

ТабличнаяЧасть

Номенклатура

 

Далее ПриОткрытии формы ОсновнаяФормаРеализации запросом обращаемся к регистру, получаем необходимые текстовые поля и подставляем в наименование реквизитов формы. Если же в регистре пусто (как раз пользователь самостоятельно развернул cf в чистую базу) тогда вместо полей на форме пользователь увидит ХХХХХХХ.

В регистре данные можно хранить в виде хэша, так же как и в пункте 3а.

б) Для хранения текстов запросов в справочниках конфигурации.

Создайте служебный справочник с названием ТекстыЗапросов, с строковым реквизитом Текст. Создайте новый элемент справочника и поместите в реквизит Текст текст вашего запроса. Теперь посмотрим, как изменится одна и та же функция, на примере получения наименования номенклатуры.

Функция до изменения:

Функция ПолучитьНаименованиеНоменклатуры()

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
                |               Номенклатура.Наименование КАК Наименование
                |ИЗ
                |               Справочник.Номенклатура КАК Номенклатура";
Возврат Запрос.Выполнить().Выгрузить();

КонецФункции

 

Функция после изменения:

Функция ПолучитьНаименованиеНоменклатуры()
Запрос = Новый Запрос;
Запрос.Текст  =  Справочники. ТекстыЗапросов.НайтиПоКоду("00000001");
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции

 

После вышеуказанных действий все тексты запросов будут находиться в метаданных конфигурации.

После заполнения "служебных" справочников или регистров не ленитесь, создайте формы документов и списка в процедуру ПриОткрытии() добавьте строку Отказ = Истина; это для того, чтобы пользователи самостоятельно не заглядывали в эти объекты.

 

7. Замена переменных и названий функций на не читаемые. Обсфукация кода. Из всех способов замены, больше всего мне нравится делать одинаковые названия процедур и переменных. Посмотрите на слова асAOpHхоВaX и aсAOpHхоВaX - внешне выглядят они совершенно одинаково, но на самом деле это набор из русских и английских букв. В текстовом файле асAOpHхоВaX создал 1024 вариации этого "слова". Далее в коде демонстрационной базы делаем глобальную замену для названий функций и процедур, а внутри каждого модуля можем сделать обычную замену переменных. Продемонстрирую как будет выглядеть код.

Функция до изменения:

Функция ПолучитьЗначениеДляПоступления ()

ГСЧ = Новый ГенераторСлучайныхЧисел();
СлучайноеЧисло = ГСЧ.СлучайноеЧисло(0, 2); 

Если  СлучайноеЧисло  =  0 Тогда
Значение  =  МодульПроверкиСервер.ПолучитьЗначение();
Возврат Значение;

ИначеЕсли  СлучайноеЧисло  =  1 Тогда
Значение  = МодульДополнительнойПроверки.НайтиЗначение();
Возврат Значение;

ИначеЕсли  СлучайноеЧисло  =  2 Тогда
Значение  =  МодульВызоваПроверки.ПолучитьЗначениеКонстанты();
Возврат Значение;

Иначе

КонецФункции

Функция после изменения:

Функция  аcАОрНxоВaX()

acАОрНxоВaX = Новый ГенераторСлучайныхЧисел();
асAOpHхoВaX = aсAOpHхoВaX.СлучайноеЧисло(0, 2); 
Если  асAOpHхoВaX =  0 Тогда
аcAOpHхoВaX  =  МодульПроверкиСервер. acAOpHхoВaX ();
Возврат аcAOpHхoВaX;

ИначеЕсли  асAOpHхoВaX  =  1 Тогда
аcAOpHхoВaX = МодульДополнительнойПроверки. асАOpHхoВaX ();
Возврат аcAOpHхoВaX;

ИначеЕсли  асAOpHхoВaX =  2 Тогда
аcAOpHхoВaX =  МодульВызоваПроверки. aсАOpHхoВaX ();
Возврат аcAOpHхoВaX;

Иначе

КонецФункции

Для того, чтобы "споткнулся" декомпилятор кода, можем убрать символы переноса и лишние пробелы в коде функции, получим такой вот результат:

Функция  аcАОрНxоВaX() acАОрНxоВaX = Новый ГенераторСлучайныхЧисел(); асAOpHхoВaX = aсAOpHхoВaX.СлучайноеЧисло(0, 2);  Если сAOpHхoВaX =  0 Тогда аcAOpHхoВaX  =  МодульПроверкиСервер.acAOpHхoВaX (); Возврат аcAOpHхoВaX; ИначеЕсли  асAOpHхoВaX  =  1 Тогда аcAOpHхoВaX = МодульДополнительнойПроверки. асАOpHхoВaX (); Возврат аcAOpHхoВaX; ИначеЕсли  асAOpHхoВaX =  2 Тогда аcAOpHхoВaX =  МодульВызоваПроверки. aсАOpHхoВaX (); Возврат аcAOpHхoВaX; Иначе КонецФункции

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

Если уже и это не поможет, то поищите обработку, непосредственно смешивающую байт код.

8. Защита компьютеров предприятия на физическом уровне, без возможности копирования базы данных и документов пользователями базы.

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

Следующий, 9 пункт не заслуженно пропущенный мной и активно обсуждаемый в комментариях, считаю необходимым добавить. Это, пожалуй, самый надежный из всех способов защиты используемый при наличии у пользователя стабильного доступа в сеть. Добавляю именно из-за того, что этот пункт активно обсуждается участниками сообщества Инфостарт. Это заслуга не моя, а именно тех людей, которые прокомментировали эту статью. Огромное Вам Всем СПАСИБО!

9. Использование демонстрационной версии без возможности использования конфигуратора на стороннем сервере:

а) Использование непосредственно на сервере вашего предприятия, доступ через локальную сеть.

б) Использование облачного сервиса. База полностью или частично (имеется ввиду, частичный вынос кода) хранится в облаке.

 

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

На этом все. Если статья Вам понравилась и пригодилась, не забудьте оценить, нажимайте на звёздочку.

67

См. также

Лучшие комментарии
13. SerVer1C 150 09.02.18 10:21 Сейчас в теме
Самый безопасный способ - предоставить клиентам удаленный доступ к вашему серверу с демо конфигурацией. Только не забудьте защитить доступ от пересылки файлов в обоих направлениях )))
Lazio; корум; evgefremov; dunpil; rutony; Borodatyi; artfa; 7OH; BigBoss; dance000; Alien_job; Nigelist; Marik; birkenau; JohnyDeath; maksa2005; kadild; Brawler; jONES1979; uri1978; AerinSwift; itriot11; Dmitri93; insurgut; ifilll; +25 Ответить
Остальные комментарии
Сортировка: Древо
1. grumagargler 425 08.02.18 22:26 Сейчас в теме
Спасибо, что называете вещи своими именами: "собственный программный продукт и решили его продать", а не самописки, нетленки и т.д. Очень жаль, что в сообществе 1С, почти на всё, что пишется не в офисе 1С, сразу вешается подобный ярлык...(хотя порой и заслуженно).
Касательно методов защиты, всё-таки лучше инвестировать время в разработку внешней компоненты на с++, и вызывать её из обфусцированных после компиляции модулей 1С (т.е. не только скомпилированных, но и переколбашенных после этого).
Делать компоненту на management-языке типа c#, я не рекомендую, взломается легко, даже если обфусцировать (есть печальный опыт).
Serega-artem; evgefremov; Tavalik; Borodatyi; chebser; maxopik2; rpgshnik; user748289; +8 Ответить
2. user748289 123 09.02.18 00:05 Сейчас в теме
(1)
Спасибо за инфу и за отзыв. Как раз думал о внешних dll. Слова самописка и нетленка мне тоже не особо нравятся, хочется побольше уважения к созданным конфигурациям, ведь это реально нелегкий труд.
7. ArchLord42 62 09.02.18 07:40 Сейчас в теме
(1) согласен, managed dll, декомплятся прям как закрытые модули 1с, очень легко, тем же дот пиком. Но и тупо обращение к длл, хоть на c ++ тоже не сильно снижает вероятность взлома, если честно, хотя и декомпиляция уже гораздо сложнее даётся.
Есть вариант это вынос логики в компоненту, с платформой спокойно можно общаться через AppDispatch, но у этого способа другие минусы)
user748289; +1 Ответить
8. grumagargler 425 09.02.18 07:50 Сейчас в теме
(7) так в этом и суть, не просто в компоненте писать проверку текущей даты и ветку реестра, а размещать там часть бизнес-логики (я не говорю, что это легко). В native обмен делать через json. Взломать в этом случае уже сложнее. Да, положим отвязать от ключа или вырезать код проверки и получится, а получить исходной код - будет существенно сложней (эта часть взлома очень неприятна).
user748289; +1 Ответить
9. ArchLord42 62 09.02.18 09:23 Сейчас в теме
(8) только вот если лицензионному потребителю нужно будет модернизировать этот функционал...ему не очень понравится, что он скрыт в DLLке)

Вспомнил один ооочень хорошой способ, реализовать компоненту, но логика будет во внешней обработке, а обработка будет только подключать внешнюю обработку через ВнешниеОбработки.Подключить(), в пути можно указать путь ко временному хранилищу, а закинуть обработку в теории можно в DLL через тот же AppDistpatch, Потом такую обработку ни как не сохранить и код просмотреть не будет представляться возможности.

Собственно это я увидел разбирая недавно случай, в конфигурации CRM 3.0 от Раруса которая, у нас был косяк с защитой (они ее обновили не давно), новая защита там работает как раз через ВнешниеОбработки.Подключить, из внешней компоненты получается только двоичные данные обработки, которая отвественна за проверку лицензии, потом они помещаются во временное хранилище и потом уже подключается все это дело, так вот, можно подумать, что защита то ломатеся очень просто, достаточно сохранить эти двоичные данные и посмотреть код обработки, но фича в том, что при поптыке сохраните эти ДД вылетает "ошибка формата потока", видимо есть какой то хак от 1С, которые вешает защиту от сохранения ДД. НО! Мы нашли способ сохранить эти ДД, но это не на публику :)
artfa; user748289; +2 Ответить
37. dnkon 23 26.04.18 17:15 Сейчас в теме
(9)
Способ сохранения защищённой обработки озвучивался на ИС и неоднократно - дамп памяти работающего приложения и сохранение участков начинающихся с сигнатуры файла внешней обработки. Никакого секрета в этом давно нет.
3. oldcopy 64 09.02.18 00:36 Сейчас в теме
Спасибо, тема интересная и актуальная. Способ 7 понравился.

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

От себя могу предложить иной способ, просто урезать демо по функционалу или сделать данные неохраняемыми. Например, реквизиты объекта превращаем в реквизиты формы. Упрощаем отчеты, убираем или упрощаем обработки. Убираем проводки, вместе с регистрами.

В общем и целом - оставляем от конфигурации необходимый минимум, который позволит познакомиться с ее основными функциями, но не позволит полноценно работать в ней.
user748289; +1 Ответить
4. user748289 123 09.02.18 00:46 Сейчас в теме
(3)
Андрей большое Вам Спасибо за комментарий. Мне важно мнение программистов в целом к этой статье. Эту статью без файлов для скачивания написал впервые, она носит чисто информационный характер. Я как и многие учился исключительно сам, а здесь на Инфостарте благодаря отзывам узнаешь много нового, главное это самое новое можно применить. В общем Ваша точка зрения, опыт и замечания надеюсь помогут и мне. Ещё раз благодарю!
5. Art1387 3 09.02.18 07:27 Сейчас в теме
Насчет проверки даты на ум сразу приходят две вещи:
1) проверки даты в обработчиках ожидания форм;
2) повреждение конфигурации запущенной демо-базы в случае несовпадения дат (по крайней мере осложнит взлом путем отладки).
user748289; +1 Ответить
6. Marik 58 09.02.18 07:35 Сейчас в теме
Нормально. Мне понравилось. Подойдет как защита от дурака. Постоянно сталкиваюсь с ситуацией, когда аудиторы или другие черти-проверяющие-консультирующие уносят конфигурации (в большинстве своем самоделки или сильно допиленные типовые) потом ставят как свое. Для профессиональных целей, имхо, лучше через внешнюю компоненту с физическим usb ключом.
user748289; +1 Ответить
10. oldcopy 64 09.02.18 09:35 Сейчас в теме
(6) Это тоже проблема и, к сожалению, я не знаю как ее решить малой кровью, не прикручивая "взрослых" систем защиты. Если у человека есть доступ к рабочей базе, то никто не помешает ему слить оттуда конфигурацию. Проверяющим, конечно, можно порезать права, но в общем и целом вопрос актуален.

Проблема (и достоинство) 1С в том, что на уровне конфигурации это открытая система, а следовательно любая защита реализованная в самом коде по сути таковой не является. При желании всегда можно разобраться как она работает.
11. SerVer1C 150 09.02.18 10:05 Сейчас в теме
Ничто из предложенного не защитит вашу демо конфигурацию. Любой одинэсник отладкой порешит все ваши обходы. Обфускация исходного кода внесет только больше запутанности. Написанные методы в 1 строку декомпилятор пережует очень легко, т. к. п-код (байт-код эски) не изменится от подобных действий. Поможет только внешняя компонента с обфускацией п-кода или специализированные инструменты защиты, типа СЛК.
12. Totoro 538 09.02.18 10:09 Сейчас в теме
Не совсем согласен с п 2. - часто после просмотра демо и внесения в неё каких-либо данных клиент хочет обновить её на нормальную. С измененными метаданными могут быть проблемы. Обычно обрезают функционал.

Встречал случай, когда не выдавалось сообщение об окончании срока действия, но при этом после окончания демо-периода менялся выполняемый код. И ошибки не выдаются чтобы искать где отключается защита и результат не понятный чтобы сесть и разобраться где код работает не правильно.
13. SerVer1C 150 09.02.18 10:21 Сейчас в теме
Самый безопасный способ - предоставить клиентам удаленный доступ к вашему серверу с демо конфигурацией. Только не забудьте защитить доступ от пересылки файлов в обоих направлениях )))
Lazio; корум; evgefremov; dunpil; rutony; Borodatyi; artfa; 7OH; BigBoss; dance000; Alien_job; Nigelist; Marik; birkenau; JohnyDeath; maksa2005; kadild; Brawler; jONES1979; uri1978; AerinSwift; itriot11; Dmitri93; insurgut; ifilll; +25 Ответить
35. AgroTehnik 14.02.18 10:20 Сейчас в теме
(13)Как вариант web клиент)
new_user; +1 Ответить
14. Бэнни 09.02.18 10:39 Сейчас в теме
Чтобы не воровали демки, единственный оптимальный способ - делать их действительно демо. С кодом демо-продукта. Чтобы не было смысла. Но тогда украдут и распространят после покупки и всего делов. Сначала ворованная будет стоить денег, чтобы отбить стоимость или бесплатной, из спортивного интереса. Обратите внимание на мировой опыт защиты по. Все взламывают. Нужно давать преимущества лицензии кроме полного функционала, чтобы был нужда именно купить. Поддержка, эксклюзивные материалы, эксклюзивный сервис. И можно тогда уже цену не заламывать, как это сейчас происходит. Не покупают не только потому что мудаки, а ещё и потому что порой очень дорого. А ещё внедрение и поддержка. Совокупная стоимость владения может оказаться неподъёмной.
user748289; +1 Ответить
15. Redokov 76 09.02.18 11:13 Сейчас в теме
Дежавю. Помню, году в 98 читал в Компьютерре статьи Каталова о том, как защищать шароварки. Вот примерно те же самые рекомендации :)
корум; sasha777666; +2 Ответить
16. gradi 09.02.18 11:49 Сейчас в теме
Хорошая статья и интересные варианты защиты.
Я использую другой вариант - размещаю демо-версию в облаке. Клиент посмотрел, поигрался - меняю пароль и все.
Marik; itriot11; user748289; +3 Ответить
17. user748289 123 09.02.18 12:28 Сейчас в теме
(16)
Спасибо за комментарий. Думаю Вы правы, в облаке или на стороннем сервере по удаленке без доступа к конфигуратору - самое безопасное размещение демо версии. Так же видел решения, когда часть функционала "переезджает" в облако и демо база работать может только с включенным интернетом. Эти варианты не догадался включить в статью.
18. tailer2 09.02.18 12:36 Сейчас в теме
поддержка, вот что есть кусок с маслом
продать несколько раз - это брюлики продавать надо

а поддержку прокормит тираж

кто-нибудь помнит Соболя?

1С взлетел как минимум вполовину благодаря ему

сначала люди за тарелку супа "хакеру" ставили ломаную
а потом - па-бам! - надо обновлять
а "хакер" давно уже забил на ваши тарелки
shard; Бэнни; +2 Ответить
19. A1ice1990 109 09.02.18 12:39 Сейчас в теме
> Дата окончания и количество запусков
Можно же http сервис поднять и к нему обращаться с вопросом, сколько там еще осталось.

Да и с приходом клиент-серверной архитектуры действительно гораздо проще пускать клиента играться на демобазе с тонкого клиента или через браузер, VPN опционален.
Team leader; user748289; +2 Ответить
20. oyti 14 09.02.18 15:34 Сейчас в теме
Все рекомендации напомнили "Вредные советы" Г. Остера.
21. 1108 215 09.02.18 17:15 Сейчас в теме
Встречал вариант защиты, когда формы помещали в обработку, а эту обработку помещали в макет в виде двоичных данных.
user748289; +1 Ответить
25. the1 323 10.02.18 13:56 Сейчас в теме
(21) а эта обработка ещё дополнительно была запароленной и обфусцирована
27. Marik 58 12.02.18 06:37 Сейчас в теме
(21) Так часто на семерьке ныкали код, помню было такое. Типа файлы 1c*.* меняли букву c латинскую на c русскую. На восьмерьке давно не видел двоичный код, спрятанный в макеты.
22. Brawler 388 09.02.18 18:11 Сейчас в теме
Обфускации, запутывание кода... ничего хорошего не приносят, только производительность падает.
Защищай не защищай программный продукт, а обходной путь найдут все равно и выкинут все лишнее связанное с проверкой лицензионности из конфы и будет без нее все работать прекрасно.
23. Steelvan 09.02.18 22:15 Сейчас в теме
На этом все, если статья пригодилась, не забудьте оценить, нажимайте на звёздочку.


Ога, нажал, только рука немного дернулась :)
24. ekaruk 4047 10.02.18 11:40 Сейчас в теме
Каждый год наблюдаю волну обсуждений различных способов защиты.
Когда-то сама сильно увлеклась этой темой.
Сейчас пришла к мнению, что для частных разработчиков все эти извращения с защитой не имеют смысла.
Можно и имена поменять в демке и заморочиться с проверкой времени по внешнему серверу и длл-ками. Но все эти телодвижения очень сильно потом мешают самому и замедляют доработку продукта.
Гораздо полезнее вложить это же время в доработку функционала и постоянное развитие продукта.
Когда вникнешь в эту тему, то понимаешь, насколько просто открыть исходники. Но для большинства это темный лес и заморачиваться с ним никто не будет. Если Ваша разработка стоит не сотню тысяч (а я таких почти не знаю), то вникать в тему декомпиляции слишком дорого в плане времени.
Для 95% процентов 1С-программистов достаточной защитой является поставка без исходного кода.
1% сломает любую защиту, в том числе и длл.
Морочиться ради оставшихся 4% не вижу смысла.
Тут еще есть психологический нюанс. Если человек готов ломать защиту, то он изначально не готов купить. Даже если закрыть так, что он не взломает, то он все равно не купит, а найдет аналог или напишет сам. Фактически никакой пользы (денег от продаж) защита от него все равно не принисёт.
А вот для нормальных покупателей закрытость в ДЛЛ это большое неудобство, которое может оттолкнуть от покупки.

Для себя пришла к выводу, что более чем достаточно "поставка без исходного кода"+"обфускация байткода". Большинство 1С-программистов этого не откроют. И добавить такую защиту можно автоматизировано без лишней мороки. Более сложные варианты это потеря времени разработчика.
yuri.krylov; user748289; Артано; arsvlg; dunpil; mvgfirst; Tavalik; Nigelist; artfa; shard; 7OH; altu71; Tarlich; Goblin26; Team leader; Бэнни; SerVer1C; the1; +18 Ответить
26. grumagargler 425 11.02.18 01:50 Сейчас в теме
(24) Зависит от рынка, на которым вы работаете и опыта. Стоимость разработки 100k+ это всего лишь зарплата двух хороших программистов, года на два разработки, и это не считая продвижения, консультантов и прочего. Если есть что защищать – нужно защищать. Ходить потом по судам, даже если вы запатентуете решение – ничего не даст (нам не дало). Есть опыт, когда создавались компании на основе украденных решений с последующим оттоком клиентов. И хочется потом порассуждать о том, что надо хорошо обслуживать, в этом фишка, или открытый исходный код – это модно и т.д. Но всё это в случае, когда на рынке за вас уже всё написали 1С, или ровно до того момента, пока из своего кармана не выложишь за решение стоимость квартиры в большом городе.
user748289; +1 Ответить
30. ekaruk 4047 12.02.18 09:47 Сейчас в теме
(26) В данном случае защита вопрос не технического характера.
Защита технического характера это от нелицензионного использования отдльными клиентами.
Защита от продажи левым разработчиком вашего же продукта другим клиентам это юридическая защита.
33. grumagargler 425 12.02.18 17:41 Сейчас в теме
(30) Речь не взломанных коробках и их нелегальной продаже, это меньшее зло. Большее, это когда достаются ваши исходные коды, полученные взломом и/или декомпиляцией. Потом, в суде доказывать что-либо будет сложно (если у вас другой практический опыт – поделитесь).
И в случае с технологическими особенностями платформы, защитить исходный код и не потерять привлекательность решения – сложная задача. Но если в решение вкладываются деньги, оно не пишется на энтузиазме, и не является центром модели продаж высокопрофессиональных и узконаправленных услуг, и это не побочный продукт жизнедеятельности компании, то вопрос с защитой встанет ребром.
28. Marik 58 12.02.18 06:47 Сейчас в теме
(24) Интересно, а если вы работаете в команде программистов, и кто-то или группа программистов откололась от основной команды - тогда че? Без сомнения, эти некто откроют новую контору или вольются в другую, и уже скоро на рынке появится ваш брат-близнец-конфигурация с аналогичными предложениями поддержки и прочее, но с более низкой стартовой ценой и тут ваш вариант не прокатит. Речь как раз о том и идет как надежно защитить свой труд или труд своей компании и тут лучше "заморочиться" на этапе проектирования, чем потом с изумлением смотреть как твоя же конфигурация выигрывает тендеры.
40. Serega-artem 10 01.05.18 13:54 Сейчас в теме
Автору спасибо за статью, почитал с интересном (т.к. вопрос очень актуальный для меня), но большинство советов ничего не даст (из опыта).

(24) Правильно написали, кто настроен на взлом - тот взломает. Или просто найдет другое решение. По методам защиты от себя могу добавить еще одно решение - замена печатных форм на образцы. К примеру, есть документ Реализация, в нем формируется печатная форма ТОРГ 12. В демо макет ТОРГ 12 заменяется на готовую (сформированную форму) и вместо большой процедуры формирования формы пишется пару строк вызова макета-примера. Если конфигурация предназначается во основном для формирования документов (печатных форм) - это неплохой способ защиты, особенно если конфига стоит 10-20 тысяч. Переписывать процедуры заново будет дороже.
29. Nigelist 12.02.18 07:32 Сейчас в теме
+ за картинку! =)

Вот коллекция
36. gaglo 14.02.18 11:30 Сейчас в теме
(29) Тоже поставил, потому как люблю издавна картинки Андрея Кузнецова (проект "Чебурген", да и мультики!) Однако на данную статью более всего намекает картинка про чукчу, который (только что вырубил себе сайт изо льда) - "Хехе! Чохча сам пылгэ!...", а сбоку тихо плачет вполне узнаваемый (исключая то, что одет в кухлянку) известный веб-дизайнер....
По вопросу защиты я присоединяюсь к ekaruk.
для частных разработчиков все эти извращения с защитой не имеют смысла
31. FesenkoA 24 12.02.18 13:40 Сейчас в теме
обфускация кода? Да легко, если вы пишете код на английском, а переменные называете "spravachnikPolzavatili" "noviyWtrihkod" итд.. в таком случае тот кто его декомпилирует из закрытого доступа - пожалеет 10 раз. Сталкивался с таким, правда не закрытый код. В итоге пришлось половину переписать..
32. Team leader 8 12.02.18 16:14 Сейчас в теме
+1, комментарии не менее интересней статьи
user748289; dance000; +2 Ответить
34. BigBoss 3 13.02.18 06:05 Сейчас в теме
Только есть использовать DLL в конфигурации, ей не присвоят 1с совместимо. Вроде так, если не путаю ничего.
41. Mortum 04.05.18 15:27 Сейчас в теме
Пункт 5б часто используется в типовых.
42. amd1986 04.05.18 15:59 Сейчас в теме
Если в продаваемых решениях(не демо) такой изврат, то сжигать на костре таких 1Снеков надо.
И да, через веб клиент наиболее оптимально демку показывать.
43. user748289 123 04.05.18 17:44 Сейчас в теме
(42)По поводу продаваемых решений полностью с Вами согласен. Вообще хочется всегда писать код чисто, красиво и чтобы было легко понять что из чего следует. Жаль, что нельзя защитить такой красивый код штатными средствами от 1С.
Оставьте свое сообщение