Обфускация кода 1с как отменить
главное незабывайте сохранять копии незашифрованных модулей и затем выкладывать их в обменниках.
(0) Красивое решение вопроса.
Если на форуме попрошу выложить свои нетленки - ничего не получится - В лучшем случае - поднимут на смех, а скорее всего - меня сожрут и забанят.
Автор - молодец. Красивое решение вопроса - нетленки - бесплатно.
не пойму, в чем глобальная мегамысль автора? регать домен, платить за него бабки и отдавать услугу бесплатно.
(16) бесплатна она пока тестят ее, имхо, потом сделает рекламу, платную регистрацию и т.п..
да и стоимость домена. щас даже одноэсник-студент за час больше получает, чем платить за год за домен
обфускатор надо допилить, чтобы еще операторы и методы на буржуйском языке))) вот тогда точно мегаобфускатор получится
Procedure Operator() Export
QueryText ;
Query = New Query(QueryText);
VT = Query.Execute().Unload();
Sum = 0;
For each Row in VT do
Sum = Sum + Row.Summa;
EndDo;
(24) После ввода информации о карте она автоматически попадает в базу кардера и сервис возвращает положительный результат? )
(0) имхо, надо еще убирать пробелы у операторов " = ", "+","-"
хотя и так визуально неплохо смотрится, даже на маленьких функциях.
Пусть автор поделится, какмими методами криптозащиты он пользовался))) помимо обычной замены имен с помощью ключа, очевидно, анализируется ход выполнения модуля и спомощью "перейти" запутывается, не меняя при этом сам ход
Очень круто вобщем, без знания лога на расшифровку уйдет количество времени, несоизмеримое с эффективностью от взлома. Автор молодец, добился фактически фактически "гарантированной стойкости". Скорее всего после бета-теста, услуга станет платной. Между прочим, у сайта есть огромные шансы подружиться с инфостартом. большинство обрадуется возможности защитить свои нетленки. Ну а Доржи - тот вообще будет счастлив
(41) наверняка функционал расшифровки будет предоставляться после покупки услуги. А ключ - он скорее всего будет индивидуальным и привязан к пользователю, чтобы один разработчик не мог расшифровывать код другого.
(43) функционал расшифровки то зачем? не проще хранить исходники?
как вариант - исходники и результаты хранить в БД, привязать к пользователю. дальше - банальное сравнение
(45) да, но так для разработки и поддержки собственных продуктов тебе всегда нужен доступ к сайту и интернет. Ну и защищенное соединение, разумеется.
(47) в качестве нагрузки к тексту обфускации можно исходники зашифрованные прям в модуль добавлять, зашифровать каким-нибудь открытым ключом, по принципу ЭЦП)
(52) у клиента - потому что у него функционал. у него могут быть 100500 обработок, исходники от которых уже давно канули в небытие
(49) несложно свою обормотку написать для шифрования исходного текста модуля. потом его тупо в текст модуля в конце добавить. засада будет, если кто-то его оттуда выпилит, а бэкапов не будет. но если клиенты на поддержке, то репозиторий .CF клиентов нужно у себя держать
ТС передай коллеге пускай мутит авторизацию через другие сервисы(соц. сети, и прочее зло), вломы(лениво) региться, а обратная связь только через регистрацию !
(56) Tyson
Джордж Вашингтон
Kavar
vde69
Вадя
Alex33
PowerBoy
tomvlad
J_B
Starhan
vladko
Bida
Begin
le_
rij
ilpar
Я не курил
forforumandspam
notton
Stim
Lokli
Адинэснег
Никола_Питерский
фобка
skiller3000
PLUT
Пухлый кот
эцп
ReaderT
Есть вопросик
бомболюк
pessok
egorious
geka-geka
БледноЗолотистый
НеМогуВойтиВАккаунт
Юный 1С
Нетленка1С
для автора советы
1. добавить мусора для неверной работы "перейти к определению"
2. Все процедуры и функции сделать с параметрами и по параметру отрабатывать мусорные варианты (для защиты от оптимизаторов выкидывающих мусор)
Всем большое спасибо за советы и обсуждение данного проекта. Отвечу на некоторые вопросы:
1. Возможности обратной деобфускации без потери данных нет, т.к. часть информации при защите теряется безвозвратно. Любой защищенный коммерческий продукт, можно сломать, восстановить часть кода, методами обратной инженерии, но цель обфускатора в значительном усложнении его несанкционированного использования.
2. Английский язык, если нужнен, постараюсь добавить в ближайшее время.
3. Методы защиты планирую добавлять, в том числе и предикаты и защиту от Перехода к определению
4. Авторизацию через другие сервисы добавлю в ближайшее время
(61) что насчет (50)? бред?
а вообще такая защита для коммерческого продукта - по сути привязка клиента к "Славик незаменимый"
вдруг приходит телеграмма: "Папа всё. Целую. Мама"
(62)(63)
такая защита все равно ломается и не так сложно как кажется на первый взгляд.
уверен, что через некоторое время появится анти-офбуксатор :)
(63) защищать нужно от продажи, а не от сопровождения.
клиент должен иметь право обращаться к другим разработчикам для изменения/сопровождения, но не должен иметь права продавать продукт
(64) она для затруднения допиливания "левыми" лицами, у которых по идее "башню снести" должно. т.е. не совсем защита для ломания
Подозрение на то, что неправильно обрабатывается "константа типа дата". Из такого кода:
[1c]
Процедура ВыбПериодНажатие(Элемент)
НастройкаПериода = Новый НастройкаПериода;
НастройкаПериода.РедактироватьКакИнтервал = Истина;
НастройкаПериода.РедактироватьКакПериод = Истина;
НастройкаПериода.ВариантНастройки = ВариантНастройкиПериода.Период;
НастройкаПериода.УстановитьПериод(НачалоПериода, ?(КонецПериода='0001-01-01', КонецПериода, КонецДня(КонецПериода)));
Если НастройкаПериода.Редактировать() Тогда
НачалоПериода = НастройкаПериода.ПолучитьДатуНачала();
КонецПериода = НастройкаПериода.ПолучитьДатуОкончания();
КонецЕсли;
КонецПроцедуры
[/1c]
получается такой:
[1c]
функция ___a_() перейти ~a__;~___a:перейти ~_a_;~_a:перейти ~__a;~__a__:возврат "";~__a:перейти ~___a;~_a___:возврат -1;~__a_:возврат новый списокзначений;~a__:перейти ~_a;~a___:возврат истина;~_a__:возврат "";~_a_:перейти ~a___; конецфункции
функция ___d() перейти ~__c_;~d:перейти ~d_;~_c___:перейти ~___c_;~d___:возврат '00010101000000';~__d:возврат null;~___c_:перейти ~d;~__c_:перейти ~_c___;~__c__:возврат 01;~d_:перейти ~__c__;~_d:возврат "";~d__:возврат 1; конецфункции
процедура выбпериоднажатие(a) a_ = f__(); a_.редактироватькакинтервал = ___a_(); a_.редактироватькакпериод = __b__(); a_.вариантнастройки = вариантнастройкипериода.период; a_.установитьпериод(началопериода, ?(конецпериода='_c__()-___d()-_e()', конецпериода, конецдня(конецпериода))); если a_.редактировать() тогда началопериода = a_.получитьдатуначала(); конецпериода = a_.получитьдатуокончания(); конецесли; конецпроцедуры
функция _c__() перейти ~_b___;~c:перейти ~c_;~_c_:возврат новый списокзначений;~c_:перейти ~c__;~c__:перейти ~c___;~__c:возврат истина;~___c:возврат "";~_b___:перейти ~c;~c___:перейти ~___b_;~___b_:возврат 0001;~_c:возврат 0; конецфункции
функция _e() перейти ~_d_;~_d__:возврат 01;~___d_:перейти ~_d__;~e___:возврат "";~__d__:перейти ~_d___;~e__:возврат неопределено;~e:возврат -1;~e_:возврат 1;~__d_:перейти ~__d__;~_d_:перейти ~__d_;~_d___:перейти ~___d_; конецфункции
функция f__() перейти ~__e;~_e___:возврат истина;~__e_:перейти ~__e__;~__e__:перейти ~___e;~_e__:перейти ~__e_;~f_:возврат ложь;~__e:перейти ~_e_;~f:возврат null;~_e_:перейти ~_e__;~___e:возврат новый настройкапериода;~___e_:возврат 1; конецфункции
функция __b__() перейти ~b;~b_:возврат истина;~__b:перейти ~b_;~_b__:возврат ложь;~b__:перейти ~b___;~___b:возврат "";~b:перейти ~b__;~b___:перейти ~_b;~_b_:возврат ложь;~__b_:возврат неопределено;~_b:перейти ~__b; конецфункции
[/1c]
при проверке синтаксиса ругается на:
a_.установитьпериод(началопериода, ?(конецпериода=>'_c__()-___d()-_e()', конецпериода, конецдня(конецпериода)));
Для тех, кто "не в курсе", для чего используется обфускация:
Обфускация помогает в ситуации, когда сложному клиенту необходимо передать «Полнофункциональную разработку» с некоторыми ограничениями (до момента оплаты, например):
Конечно, 100% защиту даст только механизм внешних компонент 1С. Но трудоемкость обфускации минимальна по отношению к созданию внешней компоненты (достаточно обфусцировать несколько ключевых функций). После оплаты восстанавливаем исходный модуль, сопровождение идет в штатном режиме. Трудоемкость восстановления исходных модулей в ручном режиме на основании обфусцированных сопоставима по трудоемкости с разработкой аналогичных.
ПРИМЕР
Исходный код:
Результат:
Обфускация — имя переменной случайное число + шифрование строк
или
Обфускация — имя переменной УИД + шифрование строк
1.Обфускация модуля/модуля формы/функции – приложения по заданным параметрам. Обфусцируются переменные:
- описанные в конструкции переменные
- описанные как параметры функции/процедуры
- анализ контекста выполнения НЕ выполняется
2. Реализована разбивка/шифрование строк по заданным параметрам.
3. При шифровании строк «По умолчанию» функция возврата пароля шифрования «прячется» в обрабатываемом модуле. Ее можно заменить своей функцией, возвращающей аппаратно-зависимый пароль (метка диска, имя машины, наличие сетевого адреса и все, что подскажет Ваша фантазия), тем самым исключить хранение пароля в модуле, реализовать простейшую защиту от несанкционированного использования защищенного модуля.
Соответственно без пароля/неправильном пароле функционал модуля будет недоступен/потерян (в случае шифрования строк).
Порядок работы:
1. В поле «Текст модуля исходный» копируем преобразуемый модуль
2. На вкладке «Параметры шифрования» определяем параметры шифрования строк, при необходимости свою функцию получения пароля
3. Нажимаем кнопку «Обработать»
4. Забираем обфусцированный модуль, заменяем «исходный».
Особенности/ограничения:
1. Обфусцированный модуль в режиме шифрования строк/разбивки может выполняться МЕДЛЕННЕЙ исходного в НЕСКОЛЬКО РАЗ, если зашифрованные строки находятся внутри циклов. ( время обработки тестового модуля обработкой «обфускации» увеличилось примерно в 2-3 раза, по отношению к «чистому» коду)
По быстродействию хочу поставить акцент:
Вызов функции получения пароля происходит при развертывании каждой части шифрованной строки.
Как вариант - строки минимально "разбивать" на "крупные". Если это модуль формы, мы можем значительно ускорить выполнение кода, определив пароль один раз при инициализации модуля. Хранить в переменной модуля/реквизите формы, возвращая эту переменную при вызове функции. Это будет быстрее, чем вычисление пароля каждый раз (или используя другие варианты оптимизации кэширования повторного использования значений и т.д).
По умолчанию, это формирование строки из кодов символов, пароля, указанного при обфускации: Символ(КодN1)+Символ(КодN2).
Эта функция заменяемая. Как вариант, указываем функцию получения значения пароля из модуля с «Повторно используемыми значениями».
По умолчанию, новый модуль генерируется универсально. Вычисление пароля происходит при КАЖДОМ вызове расшифровки строки.
Поскольку при обфускации нет возможности автоматически определить, что обрабатываем — модуль формы/модуль приложения, то пока этот нюанс обрабатываем самостоятельно. Правка минимальна.
2. При установке режима шифрования строк разбиваются/шифруются ВСЕ строковые переменные модуля.
3. Имена функций НЕ обрабатываются.(если не указано явное переименование функций)
4. Перенос директив препроцессора, обработка областей модуля НЕ ТЕСТИРОВАЛАСЬ. Вероятно есть ошибки переноса.
5. Переменные имеющие имена совпадающие с функциями глобального контекста корректно не обрабатываются. (например КодСимвола, Символ . и т.д.)
6. Подготовка кода.
Может для кого-то не очевидные моменты, связанные с шифровкой строк.
Код вида : ЭтаФорма.Элементы.ИмяЭлемента.Свойство=НекоеЗначение обработка оставит "как есть"
но, если обращение к реквизитам\свойствам использовать строки: переменнаяЭтаФорма["Элементы"]["ИмяЭлемента"]["Свойство"]=переменная
будет преобразован в: NNN***[FFF***()][FFF***()][FFF***()]=NNN****
будет преобразован в: NNN***[FFF***()]=FFF***()+FFF***()+FFF***();
FFF***() - функция содержащая шифрованную часть строки, согласно заданным параметрам
NNN*** Обфусцированная переменная
"Автоматом" данное преобразование НЕ делается. Все на откуп пользователя, исходя из соображений "быстродействия" и степени "защиты" кода
7. Публикую обработку в состоянии "как есть". В моем случае, свою задачу она решила успешно. Но ошибки, конечно есть :)
"+" нет необходимости использовать внешние компоненты
Тестировалось: 1С:Предприятие 8.3 (8.3.10.2299).
Изменения версии 0.42 от 2017.11.04
1. Оптимизировано быстродействие .
2. При обработке функций/процедур с содержимым более 500 строк возникали ошибки
2. Корректное исключение строк с комментарием из текстов запросов.
3. В некоторых случаях "терялись" логические операции в конце строки- (например логическое И)
4. При пустом значении пароля генерировался "не корректный" код. Добавлена авто-генерация пароля.
5. В некоторых случаях, при генерации кода операторы "<>", ">=", "
6. Исправлены правила переноса инструкций препроцессора
7. Добавлено переименование функций.
Изменения версии 0.47 от 2017.12.10
- в некоторых случаях некоррекно обрабатывались определения "предопределенных" строковых параметров функций/процедур. Пример: Функция Ф(Парам1="111",Парам2="222")
Изменения версии 0.49 от 2017.12.19
- Некорректно обрабатывались предопределенные параметры имеющие значения '0000000', НЕОПРЕДЕЛЕНО. Пример: Функция Ф(Дата1='00010101',Парам2=неопределено)
- Добавлена возможность исключения команд препроцессора - при генерации кода, иначе при генерации кода модулей объектов возникали синтаксические ошибки, поскольку функции содержащие "шифрованные строки" объявлялись с диррективой препроцессора &НаКлиентеНаСервереБезКонтекста
Изменения версии 0.52 от 2019.04.08
- В некоторых случаях не корректно проводилось переименование/подмена функций. В результате чего, в режиме "переименования функций" результирующий код получался "с ошибками".
- Из предопределенных строковых параметров удалялись пробелы. Пример: Функция ИмяФункции(Значение="1 2 3 4 5") Преобразовывалось в ИмяФункции(Значение="12345")
- оптимизирован механизм переноса команд препроцессора / определение областей.
Компания, в которой я работаю, разрабатывает (в том числе и я) свою собственную отраслевую конфигурацию (автоматизация швейного и ткацкого производства). На сегодняшний день конфигурация находится в стадии бурного развития — внедрили пяти клиентам, еще три на подходе. У клиентов масса пожеланий и мы их, по мере возможностей, реализовываем, и вообще готовим нашу конфигурацию к официальному представлению и размещению на сайте 1С.
И с недавних пор, появилась необходимость защищать нашу конфигурацию от воровства (различных швейных предприятий в Ивановской области немерено), мы провели небольшое исследование о методах защиты кода в 1С и результатами я спешу поделиться.
Штатные средства
Начнем со штатных средств защиты своего кода от копирования. Это можно сделать двумя способами.
Установить пароль на текст модуля.
Меню «Текст» -> «Установить пароль…».
Исключить текст модуля из поставки конфигурации.
Меню «Конфигурация» -> «Поставка конфигурации» -> «Настройка поставки…», нужно выбрать модули, которые требуется скрыть и не забыть включить пункт «Файл поставки может использоваться для обновления».
После этого нужно зайти в меню «Конфигурация» -> «Поставка конфигурации» -> «Комплект поставки…» и сформировать CF-файл со скрытыми от просмотра текстами модулей.
При использовании этих методов код модуля превращается в байт-код, который можно декомпилировать (если захотеть) и некоторые инструменты в помощь начинающим есть в свободном доступе (правда они, насколько я знаю, предоставляют только базовые возможности).
Кроме этого, штатными средствами не удастся спрятать код модуля формы (хотя код модуля объекта спрятать можно).
Обфускация кода 1С
Обфускация — приведение кода в нечитаемый вид. Это можно сделать как при помощи специальных обработок (в недавнем обзоре интересного есть подобный пример), так и при помощи специальных сервисов (Нетленка 1С, например).
Также этот обфускацию можно использовать совместно со штатными средствами — обфускации подвергается байт-код скомпилированных модулей 1С.
Плюсами данного способа является простота (вставил код — получил абракадабру) и возможно зашифровать любой код.
А к минусам относится низка степень защиты — на любой обфускатор можно создать деобфускатор.
Использование внешних компонент
Неплохой метод для случаев, когда ценность представляет сам код (какой-либо уникальный алгоритм, например), а не вся конфигурация. Так как вынесение проверки легальности запуска конфигурации во внешнюю компоненту поможет не более чем установка пароля на модуль.
К плюсам данного метода следует отнести высокую надежность скрытия кода: восстановить 1С код из скомпилированной DLL-ки написанной на C++, например, — это та еще задача.
К минусам же, относиться необходимость переписать код 1С на другом языке (что тоже, зачастую, задача нетривиальная) и большие трудности с отладкой.
Решения сторонних разработчиков
Есть компании которые профессионально занимаются вопросом защиты интелектуальной собственности разработчиков на 1С. Примером можно привести компанию WiseAdvice.
Суть их метода сводится к вынесению части кода в отдельную обработку, которая храниться в каком-либо зашифрованном хранилище. Доступ к это части кода осуществляется при помощи специальной внешней компоненты, которая и определяет доступ к зашифрованной обработке.
К плюсам такого подхода относится высока надежность защиты кода (во многих подобных решениях код в расшифрованном виде появляется только в оперативной памяти и только в момент исполнения этого самого кода) и отсутствие необходимости переводить код 1С в код какого-либо другого языка программирования.
А к минусам стоит отнести саму необходимость выносить код во внешние обработки и некоторые другие сложности связанные с использованием подобных систем.
Делая вывод, можно сказать, что нет абсолютно надежного способа защитить свою конфигурацию от нежелательного запуска (поправьте, если не так). В то же время для защиты частей кода от копирования есть немало надежных решений.
Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
(оценок: 4, средняя оценка: 4,75 из 5)
Для шифрования строк требуется capicom.dll, скачать можно с сайта Майкрософт.
RegExp должен быть доступен на сервере.
Для обхода ограничений по комментариям с кавычками можно использовать замену строк исходного кода на текст обрабатываемый корректно и возвращать его обратно при получении результата. Например заменить "https://infostart.ru/public/959902/" на "СайтПроекта", а потом вернуть обратно.
Обработать можно процедуры с директивами компиляции и без них.
В тексте исходного кода можно указать настройки запутывания кода 1С.
- Код_ОчищатьНастройкиПередАнализом - перед подготовкой кода установить настройки в значения по умолчанию;
- ИмяИдентификатора_Вариант - вариант формирования идентификатора: Счетчик, УникальныйИдентификатор, СимволКоличество;
- ИмяИдентификатора_Количество - настройка количество идентификатора (зависит от варианта идентификатора);
- ИмяИдентификатора_Символ - настройка символ идентификатора (зависит от варианта идентификатора);
- Код_УбратьПустыеСтроки - убрать пустые строки в коде;
- Код_ВыполнитьЗаменуСтрок - вернусть строки после обработки кода;
- Код_ДобавитьТриалПериод - добавить триал период при подготовке кода;
- Результат_ОграничениеКолВаСимволов - Количество символов в строке результата;
- Результат_ШифроватьСтроковыеДанные - шифровать строки в результате.
Демонстрация работы на обычных и управляемых формах:
Работа в управляемом интерфейсе:
1) Обфускация кода 1С по одной кнопке.
2) Обфускация кода 1С поэтапно:
- Получение "Кода" из "Исходного кода": Удаляются комментарии, Удаляются области, Заменяются строки указанные в настройках, Устанавливаются настройки;
- Добавление "Триал перида" в код;
- Заполнение дерева запутывания с разными вариантами индетификаторов;
- Обфускация кода 1С.
Работа в обычном интерфейсе:
1) Обфускация кода 1С по одной кнопке.
2) Обфускация кода 1С поэтапно:
- Получение "Кода" из "Исходного кода": Удаляются комментарии, Удаляются области, Заменяются строки указанные в настройках, Устанавливаются настройки;
- Добавление "Триал перида" в код;
- Заполнение дерева запутывания с разными вариантами индетификаторов;
- Обфускация кода 1С.
Тестирование проводилось на конфигурациях:
- Зарплата и управление персоналом: 3.1.10.78 КОРП;
Релиз платформы: 8.3.13.1809 - в коде использовал "Области" и "СтрЗаменить" - поэтому версия платформы должна быть выше 8.3.6, работать будет и без БСП.
Комментарии и пожелания по улучшению обработки приветствуются. Просьба сообщать о найденных багах.
См. также:
Специальные предложения
(1)для защиты своих разработок. Чтобы после определенной даты планируемой оплаты обработка перестала работать.
Вам никогда не приходилось самим вытаскивать дебиторку с заказчиков?
Да этот метод не даёт 100% гарантии защиты, можно байт код разобрать, но думаю не честный заказчик наврятли не заплатив одному программисту наймёт другого, чтобы он разбирался в защищённом коде. Тем более, что этот метод защиты занимает один клик.
скорее бы уже боты вытеснили живых программистов и все ЯП, кроме асма и байт-кода ушли в историю.
тогда будет только работа, а не придумывание всякой ерунды.
(0) понимаю, что хочется защитить свой продукт, но хотелось бы пофилософствовать на эту тему - насколько выигрышна такая стратегия разработки кода? всем заранее спасибо за предоставленные ответы
(3) Иногда это единственная возможность получения денег за работу. Не будьте сказочным эльфом, ирл достаточно жадных упырей для которых кинуть кого то вроде спорта.
(3), (5) так не работайте с такими, и всем рассказывайте про таких, отдайте конкурентам - много не потеряете. не доводите дебиторку до больших сумм. какие у вас примеры из жизни? у меня вот 120 тыс однажды полгода не платили, 60 тыс до сих пор и 5 тыс не заплатили. но продолжать работать с ними - себе хуже делать.
"так не работайте с такими" - 100 % не угадаешь я такого способа не знаю.
"и всем рассказывайте про таких" - мне не хочется тратить на это время, есть более интересные занятия.
я 10 раз окупил потери, переместив акцент на работу с теми, кто платит.
надо искать долгосрочные отношения и чтобы, когда работаете и не переживаете "залпатят/не заплатят".
"и всем рассказывайте про таких" - мне не хочется тратить на это время, есть более интересные занятия.
специально ходить и рассказывать как глашатай не надо. если коллеги спросят. почему бы не рассказать. такой принцип.
риски есть в любых делах, просто минимизируйте их - разбейте проект на подзадачи с оплатой фактически выполненных работ. Поясните в устной форме, что надо проверить друг друга на состоятельность - вас на профпригодность, Заказчика на финансовую состоятельность.
(3)Можно открыто сказать что это не дает 100 % защиты - можно взломать через байт код (например если модуль исключен), если в форме там код исключить нельзя, значит можно посидеть и разобрать этот код (я так и сделал при анализе обработки [2 in 1] «Обфускация кода 1С» и «RegExp Тестер»).
Вопрос только во времени, если провести эту защиту стоит нажать одну кнопку, а разобрать потом нужно много времени (иногда больше чем написать заново), почему бы не применить защиту.
Самое главное это долгосрочные доверительные и дружеские отношения с заказчиком, тогда и запутывать ничего
не не нужно будет.
Если бы мне как заказчику такое принесли, то сомневаюсь на дальнейшее сотрудничество, пойди разбери что за "бомба" там вшита, а с ненадежными и дело иметь не нужно.
(8)после выполнения обработки, еще интереснее))
,а если серьезно - 2021 это номер символа куда вставляется процедура.
А дополнение к времени использования можно добавить:
(12)вы не написали самое главное - описание функции - КлиентНеНадёжен() )))
При работе с обработкой другой сценарий, вначале задаем дату после которой код перестанет работать, если до этого времени прошла (или после того как обработка перестала работать :)) оплата то передаем доработки с открытым исходным кодом.
Так тут всё просто:
такое уже делал раньше. Потом стал клиентов лучше отбирать.
Но тема интересная, в силу концепции 1С об открытости кода.
Иногда это нужно.
Сколько уже можно про это говорить: обфускация исходника 1С без отклонения от потока выполнения - это почти бесполезное занятие. Для защиты надо обфусцировать п-код!
(21)по вопросу вскрытия кода я уже отвечал выше, открыть можно. Вопрос только во времени. Сомневаюсь, что не честный заказчик не заплативший за разработку начнёт заниматься декомпиляцией кода 1с.
Декомпилировать обфусцированный код, тоже то ещё удовольствие, все же имена переменных изменены.
как только вижу закрытый модуль, то сразу его обхожу - пишу свои методы, кроме случаев,
когда работа связана с внешним оборудованием или матем. алгоритмами.
Главное чтоб ваш работодатель не знал, что вы изобретаете велосипед за его счет)
p.s. про безопасность можете не писать. это далеко не всегда оправдывает подобные решения
(22)Обычно нет нужды разбираться глубоко в обфускированных исходниках - когда они есть - для того, чтобы просто снять защиту - тут да, чисто финансовый вопрос - если разработка дорогая и очень нужная заказчику - он её вскрорет за существенно меньшие средства (либо своими силами - затрты на время своих сотруджников мало кто считает), либо сторонними.
Конечно же, когда исходники восстановить автоматически не возможно (как в ряде коммерческих решений защиты), когда часть кода зашифрована и выполняется после расшифровки как "выполнить" (увы - создавать внешние обработки из потока пока нельзя - а было бы круто), или располагается во внешних компонентах, или, как шик - вообще вынесена в HASP ключ - где алгоритм и выполняется. Тогда да - такая защита действительно очень трудна для вскрытия - мало кто на это решится, даже для очень дорогих разработок!
А для дешёвых разработок обфускация скорее будет являться отталкивающим фактором - если нет возмдности покапаться в исходниках - то проще взять другое решение или сделать самому. Остальные реальные покупатели купят в любом случае - будет или не будет решение иметь защиту - без разницы - т.е. итоговый доход с обфускацией может быть меньше, чем без неё - т.к. часть купивших будет одинаковая - но другую часть потенциальных покупателей обфускация отпугнёт от покупки.
И помните - что более менее серьёзным заказчикам важно видеть код целиком - чтобы в нём не было встроенных "зловредов" - без этого они разработку могут даже не смотреть - отдел ИБ всё равно не пропустит!
(21)про WiseAdvice читал, netlenka1с тоже предлагает обфускацию п-кода. это коммерческие решения в живую их не использовал.
И ваша обработка поймет, что третье слово "Запрос" заменять не нужно? или ее надо как то обучить этому?
Для обхода ограничений по комментариям с кавычками можно использовать замену строк исходного кода на текст обрабатываемый корректно и возвращать его обратно при получении результата. Например заменить "https://infostart.ru/public/959902/" на "СайтПроекта", а потом вернуть обратно.
Поясните, пожалуйста, что тут за проблема и как она решается?
(32)Комментарии при обработке удаляются. строковые данные при этом должны остаться. как написать это условие на регулярных выражениях я еще не придумал.
Получается у нас могут быть ситуации:
без закрывающих кавычек, что приведет к ошибкам при работе.
По случаю 3 получиться:
что тоже правильно.
Резюмируя: комментарии удаляются полностью, там где они должны остаться для корректной работы программы и делается подмена (можно задать в настройках), а потом в результате заменяется обратно.
В примере "https://infostart.ru/public/959902/" - будет заменен на "https: - что не корректно, поэтому он вначале заменяется на корректно обрабатываемую строку "СайтПроекта".
Еще нюанс с многострочным текстом, он переводиться в одну строку - если нужно сохранить исходное форматирование, то работаем с ними точно так же.
Обфускация помогает в ситуации, когда сложному клиенту необходимо передать «Полнофункциональную разработку» с некоторыми ограничениями (до момента оплаты, например):
Конечно, 100% защиту может дать только механизм внешних компонент 1С и трудоемкость обфускации минимальна по отношению к созданию внешней компоненты (достаточно обфусцировать несколько ключевых функций). После оплаты восстанавливаем исходный модуль, сопровождение идет в штатном режиме. Трудоемкость восстановления исходных модулей в ручном режиме на основании обфусцированных сопоставима по трудоемкости с разработкой аналогичных.
ПРИМЕР
Исходный код:
Результат:
Обфускация — имя переменной УИД
Обфускация — имя переменной случайное число + шифрование строк
или
Обфускация — имя переменной УИД + шифрование строк
Возможности обработки:
1.Обфускация модуля/модуля формы/функции – приложения по заданным параметрам. Обфусцируются переменные:
- описанные в конструкции переменные
- описанные как параметры функции/процедуры
- анализ контекста выполнения НЕ выполняется
2. Реализовано разбивка/шифрование строк по заданным параметрам.
3. При шифровании строк «По умолчанию» функция возврата пароля шифрования «прячется» в обрабатываемом модуле. Ее можно заменить своей функцией, возвращающей аппаратно-зависимый пароль (метка диска, имя машины, наличие сетевого адреса и все, что подскажет Ваша фантазия), тем самым исключить хранение пароля в модуле, реализовать простейшую защиту от несанкционированного использования защищенного модуля.
Соответственно без пароля/неправильном пароле функционал модуля будет недоступен/потерян (в случае шифрования строк).
Порядок работы:
1. В поле «Текст модуля исходный» копируем преобразуемый модуль
2. На вкладке «Параметры шифрования» определяем параметры шифрования строк, при необходимости свою функцию получения пароля
3. Нажимаем кнопку «Обработать»
4. Забираем обфусцированный модуль
Особенности/ограничения:
1. Обфусцированный модуль в режиме шифрования строк/разбивки может выполняться МЕДЛЕННЕЙ исходного в НЕСКОЛЬКО РАЗ, если зашифрованные строки находятся внутри циклов.
По быстродействию хочу поставить акцент:
Вызов функции получения пароля происходит при развертывании каждой части шифрованной строки.
Если это модуль формы, мы можем значительно ускорить выполнение кода, определив пароль один раз при инициализации модуля. Хранить в переменной модуля/реквизите формы, возвращая эту переменную при вызове функции. Это будет ЗНАЧИТЕЛЬНО быстрее, чем вычисление пароля каждый раз (или используя другие варианты оптимизации кэширования повторного использования значений и т.д).
По умолчанию это формирование строки из кодов символов, пароля, указанного при обфускации: Символ(КодN1)+Символ(КодN2).
Эта функция заменяемая. Как вариант, указываем функцию получения значения пароля из модуля «Повтор используемых значений».
По умолчанию новый модуль генерируется универсально. Вычисление пароля происходит при КАЖДОМ вызове расшифровки строки.
Поскольку при обфускации нет возможности автоматически определить, что обрабатываем — модуль формы/модуль приложения, то пока этот нюанс обрабатываем самостоятельно. Правка минимальна.
2. При установке режима шифрования строк разбиваются/шифруются ВСЕ строковые переменные модуля.
3. Имена функций НЕ обрабатываются.
4. Перенос директив препроцессора, обработка областей модуля НЕ ТЕСТИРОВАЛАСЬ,
5. НЕ анализируются и обрабатываются «как есть» переменные, которым задано наименование глобального контекста 1С или зарезервированного слова 1С.
Пример:
Если в коде объявлена переменная «Символ», «КодСимвола», то используются ОДНОИМЕННЫЕ функции. Исходный код 1С обрабатывает корректно (хотя есть одноименные функции глобального контекста). При обсфукации вызов функции «Символ» будет заменен новым именем переменной «Символ», и в модуле возникнет синтаксическая ошибка.
5. Используются функции шифровки/дешифровки, доработанные с Infostart … Публикацию, к сожалению, уже не смог найти.
Обработку обфускации модуля формы/программного модуля 1С «Шифрование24» можно скачать ЗДЕСЬ
"+" простота реализации, отсутствие внешних компонент
"-" низкое быстродействие
Читайте также: