Обфускация кода 1С

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

Обфускация кода 1С как вариант защиты кода.

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

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

- у клиента не должно быть возможности править модуль;
- затруднено сопровождение/изменение/тиражирование;
- легко спрятать в модуле любые функции ограничения по сроку, среде исполнения, осуществить простую привязку к «железу»;
-  должен оставаться стимул оплатить работу.
 

Конечно, 100% защиту даст только механизм внешних компонент 1С. Но трудоемкость обфускации минимальна по отношению к созданию внешней компоненты (достаточно обфусцировать несколько ключевых функций). После оплаты восстанавливаем исходный модуль, сопровождение идет в штатном режиме.  Трудоемкость восстановления исходных модулей в ручном режиме на основании обфусцированных сопоставима по трудоемкости с разработкой аналогичных.

Форма обработки:




ПРИМЕР 
Исходный код:



 Результат:
Обфускация — имя переменной случайное число + шифрование строк



  или
Обфускация — имя переменной УИД + шифрование строк



Возможности обработки:

1.Обфускация модуля/модуля формы/функции – приложения по заданным параметрам. Обфусцируются переменные:
- описанные в конструкции переменные
- описанные как параметры функции/процедуры
- анализ контекста выполнения НЕ выполняется
2. Реализована разбивка/шифрование строк по заданным параметрам.
3. При шифровании строк «По умолчанию» функция возврата пароля шифрования «прячется» в обрабатываемом модуле. Ее можно заменить своей функцией, возвращающей аппаратно-зависимый пароль (метка диска, имя машины, наличие сетевого адреса и все, что подскажет Ваша фантазия), тем самым исключить хранение пароля в модуле, реализовать простейшую защиту от несанкционированного использования защищенного модуля.
Соответственно без пароля/неправильном пароле функционал модуля будет недоступен/потерян (в случае шифрования строк).
 

Порядок работы:
1. В поле «Текст модуля исходный» копируем преобразуемый модуль
2. На вкладке «Параметры шифрования» определяем параметры шифрования строк, при необходимости свою функцию получения пароля
3. Нажимаем кнопку «Обработать»
4. Забираем обфусцированный модуль, заменяем «исходный». 


Особенности/ограничения:

1. Обфусцированный модуль в режиме шифрования строк/разбивки может выполняться МЕДЛЕННЕЙ исходного в НЕСКОЛЬКО РАЗ, если зашифрованные строки находятся внутри циклов. ( время обработки тестового модуля обработкой «обфускации» увеличилось примерно в 10 раз, по отношению к «чистому» коду)


По быстродействию хочу поставить акцент:
Вызов функции получения пароля происходит при развертывании каждой части шифрованной строки.
Как вариант - строки  минимально  "разбивать" на "крупные". Если это модуль формы, мы можем значительно ускорить выполнение кода, определив пароль один раз при инициализации модуля. Хранить в переменной модуля/реквизите формы, возвращая эту переменную при вызове функции. Это будет  быстрее, чем вычисление пароля каждый раз (или используя другие варианты  оптимизации кэширования повторного использования значений и т.д).
По умолчанию, это формирование строки из кодов символов, пароля, указанного при обфускации:  Символ(КодN1)+Символ(КодN2).
Эта функция заменяемая. Как вариант, указываем функцию получения значения пароля из модуля  с «Повторно используемыми значениями».

По умолчанию, новый модуль генерируется универсально. Вычисление пароля происходит при КАЖДОМ вызове расшифровки строки. 
Поскольку при обфускации нет возможности автоматически определить, что обрабатываем — модуль формы/модуль приложения, то пока этот нюанс обрабатываем самостоятельно. Правка минимальна.

2. При установке режима шифрования строк разбиваются/шифруются ВСЕ строковые переменные модуля.
3. Имена функций НЕ обрабатываются.
4. Перенос директив препроцессора, обработка областей модуля НЕ ТЕСТИРОВАЛАСЬ. Вероятно есть ошибки переноса.

5. Переменные имеющие имена совпадающие с функциями глобального контекста корректно не обрабатываются. (например КодСимвола, Символ ...и т.д.)

6. Подготовка кода.

Может для кого-то не очевидные моменты, связанные с шифровкой строк.

 Код вида : ЭтаФорма.Элементы.ИмяЭлемента.Свойство=НекоеЗначение  обработка оставит "как есть"

но, если обращение к реквизитам\свойствам использовать строки: переменнаяЭтаФорма["Элементы"]["ИмяЭлемента"]["Свойство"]=переменная

будет преобразован в: NNN***[FFF***()][FFF***()][FFF***()]=NNN****

Аналогично,

код: ПеременнаяЗапроса["Текст"]="ТекстЗапроса"

будет преобразован в: NNN***[FFF***()]=FFF***()+FFF***()+FFF***();

где:

FFF***() - функция содержащая шифрованную часть строки, согласно заданным параметрам

NNN***  Обфусцированная переменная

"Автоматом" данное преобразование НЕ делается. Все на откуп пользователя, исходя из соображений "быстродействия" и степени "защиты" кода

7. Публикую обработку в состоянии "как есть". В моем случае, свою задачу она решила успешно. Но ошибки, конечно есть :)

 

Функцию шифровки строки, с некоторыми изменениями использовал из публикации: //1c-soft.it-terminal.ru/public/95662/

"-" быстродействие

"+" нет необходимости использовать внешние компоненты

 

Тестировалось: 1С:Предприятие 8.3 (8.3.10.2299).

 

Скачать файлы

Наименование Файл Версия Размер
ОБФ7_тест
.erf 1,22Mb
09.10.17
4
.erf 1,22Mb 4 Скачать

См. также

Автор запретил комментарии