v8: Защита исходного кода конфигураций в 1С 8.0 Ключевые слова: исходный код,защита,шифрование
В 1С можно защитить исходный код общих модулей и модулей объектов.
Код формы защитить нельзя.
Защитить можно только те модули, которые не содержат
Пароль на код модуля
Исходный код шифруется с помощью данного пароля, взломать без знания пароля невозможно.
Откройте любой код модуля.
Выберите пункт меню Текст - Установить Пароль. Введите пароль и подтверждение.
Исключение кода модуля
С помощью поставки конфигурации можно вообще исключить исходный код модуля из конфигурации - он будет храниться в скомпилированном виде. Причем делается это все очень просто.
Открываете конфигурацию.
Через пункт Конфигурация - Поставка конфигурации - Настройка поставки заходите в форму настройки поставки, выбираете текст каких модулей нужно исключить из поставки (можно выбрать сразу все для каждого уровня иерархии). Выберите также галочку "Файл поставки может использоваться для обновления".
Далее через пункт Конфигурация - Поставка конфигурации - Комплект поставки создаете CF-файл.
Теперь этот CF файл можно загружать у клиента - в этом CF файле нужные модули исключены (защищены от просмотра).
Настройки поставки хранятся в CF-файле, но к сожалению их нельзя изменить через сравнение конфигураций, только путем полной загрузки CF-файла. Поэтому лучше сделать один общий модуль "КлиентСервер", где хранить функции, которые используют директивы препроцессора, а все остальные модули закрыть.
-----------------------------------------------------
Но к сожалению это слабая защита. Простенький пример подтверждает это.
Вот маленький кусок программы:
к=3;
строка="йцукен";
к_симв_строки=Лев(строка,к);
имеющий вот такой байт-код:
(он получается когда ставится пароль на модуль и когда делается поставка без текстов)
{1,
{"Cmd",15,0,
{1,2},
{2,0},
{4,0},
{16,0},
{1,3},
{2,1},
{4,1},
{16,0},
{1,4},
{2,2},
{2,1},
{2,0},
{57,0},
{16,0},
{22,0}
},
{"Const",2,
{"N",3},
{"S","йцукен"}
},
{"Var",3,
{"к",0,-1},
{"строка",0,-1},
{"к_симв_строки",0,-1}
}
}
А вот программа декомпилирования этого примера, написать которую может каждый второй 1С-ник:
Функция ПолучитьЗначениеПозиции(ном,стр,УбратьКавычки=Ложь)
рез="";
к2=ном-1;
Для к=2 По СтрДлина(стр)-1 Цикл
а=Сред(стр,к,1);
Если к=СтрДлина(стр)-1 и а="}" Тогда
Прервать;
ИначеЕсли а="," Тогда
Если рез<>"" Тогда
Прервать;
КонецЕсли;
к2=к2-1;
ИначеЕсли к2=0 Тогда
рез=рез+а;
КонецЕсли;
КонецЦикла;
Если УбратьКавычки Тогда
Если Лев(рез,1)="""" Тогда
рез=Сред(рез,2);
КонецЕсли;
Если Прав(рез,1)="""" Тогда
рез=Лев(рез,СтрДлина(рез)-1);
КонецЕсли;
КонецЕсли;
Возврат рез;
КонецФункции // ПолучитьЗначениеПозиции
Процедура ВыполнитьДекомпиляцию()
Перем МасКонст; //"Const"
Перем МасПерем; //"Var"
Текст=ЭлементыФормы.ПолеТекстовогоДокумента1; //исходный текст байт-кода
КоличествоСтрок=Текст.КоличествоСтрок();
сч=1; //поиск первой строки
стр0=Текст.ПолучитьСтроку(сч);
Пока Лев(стр0,1)<>"}" и сч<КоличествоСтрок Цикл
сч=сч+1;
стр0=Текст.ПолучитьСтроку(сч);
КонецЦикла;
сч=сч+1;
стр0=Текст.ПолучитьСтроку(сч);
МасКонст=Новый Массив;
Если Лев(стр0,8)="{""Const""" Тогда
сч=сч+1;
стр0=Текст.ПолучитьСтроку(сч);
Пока Лев(стр0,1)<>"}" и сч<КоличествоСтрок Цикл
МасКонст.Добавить(ПолучитьЗначениеПозиции(2,стр0));
сч=сч+1;
стр0=Текст.ПолучитьСтроку(сч);
КонецЦикла;
сч=сч+1;
стр0=Текст.ПолучитьСтроку(сч);
КонецЕсли;
МасПерем=Новый Массив;
Если Лев(стр0,6)="{""Var""" Тогда
сч=сч+1;
стр0=Текст.ПолучитьСтроку(сч);
Пока Лев(стр0,1)<>"}" и сч<КоличествоСтрок Цикл
МасПерем.Добавить(ПолучитьЗначениеПозиции(1,стр0,Истина));
сч=сч+1;
стр0=Текст.ПолучитьСтроку(сч);
КонецЦикла;
КонецЕсли;
мас=Новый Массив;
Результат="";
сч=3;
стр0=Текст.ПолучитьСтроку(сч);
Пока Лев(стр0,1)<>"}" и сч<КоличествоСтрок Цикл
зн1=Число(ПолучитьЗначениеПозиции(1,стр0));
зн2=Число(ПолучитьЗначениеПозиции(2,стр0));
Если зн1=1 Тогда
//Результат=Результат+"// номер строки "+зн1+","+зн2+Символы.ПС;
Результат=Результат+Символы.ПС;
ИначеЕсли зн1=2 Тогда
мас.Добавить(МасПерем[зн2]);
ИначеЕсли зн1=4 Тогда
Результат=Результат+мас[0]+"="+МасКонст[зн2];
мас.Очистить();
ИначеЕсли зн1=16 Тогда
Если мас.Количество()>1 Тогда
Результат=Результат+мас[0]+"="+мас[1];
КонецЕсли;
мас.Очистить();
Результат=Результат+";";
ИначеЕсли зн1=22 Тогда
ИначеЕсли зн1=57 Тогда
мас[1]="Лев("+мас[1]+","+мас[2]+")";
мас.Удалить(2);
Иначе
Результат=Результат+"// неизв. код "+зн1+","+зн2+Символы.ПС;
КонецЕсли;
сч=сч+1;
стр0=Текст.ПолучитьСтроку(сч);
КонецЦикла;
сообщить(Результат);
КонецПроцедуры
Описание байт-кода имеет разделы:
- описание алгоритма
- описание констант
- описание переменных
- описание процедур
{"Proc",95,
{"Инициализировать",16,0,0,
{"Var",3,
{"спрЖурналы",1,-1},
{"обЖурнал",1,-1},
{"обНастройка",1,-1}
}
},
Разбор байт-кода показывает, что движок 1С это простая стековая машина с "польской" системой вычислений.
Данная система исчисления хорошо знакома большинству программистов по калькуляторам БЗ-34 и другим этой серии.
Основываясь на этом можно, сказать об упрощенном понимании заложенном в приведенный алгоритм.
На самом деле, так называемый спусковой крючок для калькулятора не сам оператор как в приведенном алгоритме, а завершающий оператор "{16 , 0}".
Не разбираемый в приведенном коде набор "{22 , 0}", на самом деле возврат управления из выполняемого фрагмента на выше стоящий уровень.
Естественно, мы не приводим полный набор команд этого макро языка, составить список сможет, каждый второй 1С-ник, готовый потратить на это какое то время.
Приведу, только фрагмент:
№ п/п | Оператор | Количество данных подним в стеке | Наименование |
1 | 56 | 1 | СокрЛП | 2 | 57 | 2 | Лев |
3 | 58 | 2 | Прав | 4 | 59 | 3 | Сред |
5 | 60 | 2 | Найти |
Не забывайте о том, что декомпилируя код вы можете нарушить право собственности на интелектуальный продукт.
|