Иногда становится очень грустно...
Обфускация - смешивание кода с говном до получения говнокода.
© Валерий Агеев (awa)
Обфускатор является внешней обработкой. Запускается только в режиме управляемых форм, для чтения/записи файлов *.epf, *.erf, *.cf, *.cfe и *.cfu использует обработку "Распаковщик / запаковщик файлов". Обфускатор может обрабатывать файлы любых версий 1cv8. Работает с версии платформы 8.3.18 из-за асинхронных конструкций Асинх и Ждать.
Расшифровка аббревиатуры:
- Байт-код (byte-code, bytecode, байткод) и p-код (p-code, p-код , пи-код, п-код) - синонимы, как скомпилированная во внутреннее представление виртуальной машины программа.
- Опкод (opcode, операционный код, код операции, оператор, операнд, аргумент) - это код одиночной команды, т.е. компилируя программу получаем байт-код, состоящий из опкодов.
Предисловие:
1С не является интерпретатором в чистом виде. Это означает, что 1С не исполняет исходные тексты модулей непосредственно. Для исполнения модулей 1С сначала производит компиляцию модуля в промежуточное представление, обычно называемое байт-кодом, а уже затем виртуальная машина 1С исполняет этот байт-код.
1С может хранить модули тремя четырьмя способами:
- Исходный текст модуля открыт. Это обычный вид хранения модуля. Компиляция модуля происходит во время выполнения при первом обращении к модулю. Внутри контейнера модуль хранится как текстовый файл text, содержащий исходный код модуля.
- На модуль поставлен пароль. Компиляция происходит в момент сохранения модуля при редактировании. Внутри контейнера модуль хранится в виде двух файлов – text, содержащий исходный текст модуля, зашифрованный ключом, полученным из пароля, и image, содержащий скомпилированный образ модуля (байт-код). Ни пароль, ни ключ шифрования 1С не хранит, поэтому, не зная пароль, расшифровать исходный текст нельзя. Для выполнения 1С использует заранее скомпилированный байт-код из файла image.
- Поставка без исходных текстов. В этом случае исходный текст модуля отсутствует. В контейнере хранится только скомпилированный образ модуля image, который 1С использует при выполнении модуля. Открыть такой модуль на редактирование нельзя никак.
- Поставка без исходных текстов. В этом случае исходный текст модуля отсутствует. В контейнере хранится только скомпилированный образ модуля image, который 1С использует при выполнении модуля. Открыть такой модуль на редактирование можно. Не стоит забывать, что такое использование стандартной поставки с доступом к редактированию модуля является недокументированным.
Назначение флажков (переключателей):
Обфускатор может делать несколько действий, за каждое из которых отвечает свой флажок/переключатель.
Флажок "Удалить номера строк" - удаляются оп-коды номеров строк.
Флажок "Добавить переходы" - добавляются условные (истинные и ложные) и безусловные переходы.
Флажок "Сгенерировать число блоков" - генерирует число блоков.
Переключатель "Кодировка констант":
- без изменения - константы не кодируются.
- кодировка Base64 - кодировка констант формата base64.
- кодировка Hex - кодировка констант формата base16 (hex).
Переключатель "Порядок вложенных блоков":
- без изменения - оставить порядок вложенных блоков без изменения.
- случайный - случайный порядок вложенных блоков (индексируются номера в случайном порядке).
Переключатель "Порядок констант":
- без изменения - оставить порядок констант без изменения.
- случайный - случайный порядок констант (индексируются номера в случайном порядке).
Переключатель "Порядок переменных модуля":
- без изменения - оставить порядок переменных модуля без изменения.
- случайный - случайный порядок переменных модуля (индексируются номера в случайном порядке).
Переключатель "Порядок процедур":
- без изменения - оставить порядок процедур без изменения.
- случайный - случайный порядок процедур (индексируются номера в случайном порядке).
Переключатель "Порядок разделов":
- без изменения - оставить порядок разделов без изменения.
- случайный - случайный порядок разделов (рассортирует разделы в случайном порядке).
- повторяющийся - повторяющийся порядок разделов (рассортирует разделы в повторном порядке).
обратный - обратный порядок разделов (рассортирует разделы в обратном порядке).
Переключатель "Кодировка файла image":
- без изменения - файлы image не кодируются.
- кодировка SCSU - кодировка файла image формата SCSU.
Переключатель "Запись файла image":
- без изменения - файлы image не модифицируются.
- без разделителя строк - записывает файл image без разделителя строк.
с разделителем разделов - записывает файл image с разделителем разделов.- с разделителем строк - записывает файл image с разделителем строк.
Переключатель "Поставка модулей":
- без изменения - поставка как в исходном файле.
Если был установлен пароль на тексты модулей, то оставляет возможность установки пароля на тексты модулей после обфускации байт-кода. При вводе корректного пароля приведет к расшифровке исходных текстов, но 1С при закрытии модуля заново скомпилирует модуль и перезапишет обфусцированный скомпилированный образ, т.е. обфускация слетит.
Если исходный текст модуля отсутствовал, то в контейнере будет хранится только скомпилированный образ модуля после обфускации байт-кода. - исходный текст модуля отсутствует - возможность исключать исходные тексты модулей из поставки.
Появляется окно с надписью "Исходный текст модуля отсутствует". Открыть такой модуль на редактирование нельзя. - постоянный неверный пароль - при вводе корректного пароля не приведет к расшифровке исходных текстов.
- пароль на модуль "0" - устанавливается пароль на модуль "0" с заранее подготовленным текстом.
- модуль без исходного текста - возможность исключать исходные тексты модулей из поставки. Открыть такой модуль на редактирование можно.
Обрабатываемые файлы
Обфускатор может обрабатывать файлы *.epf, *.erf, *.cf, *.cfe и *.cfu. Обработка происходит безопасным способом – создается копия обрабатываемого файла с добавкой «_obf» в имени файла, и вся работа идет уже с этой копией. Таким образом, при любом исходе работы обфускатора, исходный файл остается целым. Если нужно обрабатывать непосредственно исходный файл, то рекомендуется создавать резервную копию файла и поставить флажок "Не создавать копию". Обрабатываемый файл должен быть предварительно закрыт паролем прежде чем обрабатывать. Если модуль закрытой обработки будет изменен разработчиком, то ее нужно будет обрабатывать еще раз.
Цель: затруднить просмотр, декомпиляцию и деобфускацию байт-кода.
При попытке прочитать / разобрать результирующий файл будут выданы ошибки.
Список публикаций, использованных при разработке:
Сравнение обфускаторов:
Публикация | Версия файла | ОФ | УФ | Код открыт | Автор | Цена sm~руб | Обрабаты-ваемый файл | Работа с контейне-рами 1С |
Запуск с установ-ленной защитой |
Системы лицензи-рования |
Защита обработок 1С от декомпиляции | 1.0.0 | - | + | - | Administrator1c | 1500 р | *.epf, *.erf | V8Unpack | работает | - |
Защита от декомпиляции модулей | 1.70 | + | + | - | dimannazarov | 1500 р | *.epf, *.erf, *.cf | V8Unpack | ошибка формата потока | - |
Антидекомпилятор | 1.0.0.3 | - | + | + | скрыт | 5 sm |
*.bin, image |
- | работает | - |
Обфускатор операционного кода 1с |
- | + | + | MoiseevSN | 3 sm | *.epf | вылет программы | - | ||
Обфускатор байт-кода 1С | 1.4.3.1 | - | + | + | zhokhovm | 10 sm | *.epf, *.erf, *.cf, *.cfe, *.cfu | Распаковщик / запаковщик файлов | работает | - |
Обфускатор | 1.0.0 | + | - | - | awa | 7000 р | *.epf, *.erf, *.cf | v8cf | работает | - |
Нетленка: защита конфигураций 1С | 2 | - | m.bolsun | 27500 р | *.epf, *.erf, *.cf, *.cfe | V8Unpack | работает | - | ||
Защита конфигураций | 3 | - | ValeriVP | 17500 р | *.cf, *.cfe | конфигуратор | работает | HASP, Guardant, Codemeter |
Работа с контейнерами 1С:
- Распаковщик / запаковщик файлов - работа с двоичными данными, буферами и потоками без использования внешних файлов, библиотек и компонент.
- v8unpack - внешняя компонента для работы с контейнерами 1С (epf, erf, cf). Компонента нужна для распаковки файлов из контейнера и запаковки их обратно.
- v8cf (список методов компоненты) - внешняя компонента для работы с контейнерами 1С (epf, erf, cf). Сделана из плагина к TotalCommander'у. Компонента нужна для распаковки файлов из контейнера и запаковки их обратно. В отличие от v8unpack, работа идет не через файлы на диске, а напрямую.
Планы по развитию функционала:
- Чтение/
записьданных; Кодировка;- Углубленная обфускация байт-кода 1с;
Приоритет записи;- Работа в клиентском/серверном контексте;
- Обычные формы.
01.06.2023 - Версия 1.4.3.1:
- Добавлен вывод дерева данных контейнера в файл Image.
- Доработан парсер файла Image в дерево данных контейнера.
- Доработан переключатель "Порядок разделов".
- Упразднен пункт "обратный" в переключателе "Порядок разделов".
- Упразднен пункт "с разделителем разделов" в переключателе "Запись файла image".
25.05.2023 - Версия 1.4.2.1:
- Добавлена возможность изменить порядок вложенных блоков(циклы, условия и т.д.).
- Добавлена справка (клавиша F1).
- Доработана генерация чисел блоков.
- Доработано отображение дерева операторов байт-кода 1с.
- Переход на использование асинхронных методов.
- Изменен подготовленный текст в переключателе "Поставка модулей" в пункте "пароль на модуль "0"".
10.05.2023 - Версия 1.4.1.1:
- Добавлен парсер файла Image в дерево данных контейнера.
- Добавлен флажок "Сгенерировать число блоков" в закладке "Основное".
- Улучшено отображение дерева операторов байт-кода 1с.
- Скорректирован порядок записи меток процедуры.
- Упразднен парсер файла Image в массив данных контейнера.
Причина:
- Ошибка при разборе огромного файла image.
02.05.2023 - Версия 1.3.9.1:
- Добавлено отображение дерева операторов байт-кода 1с.
17.04.2023 - Версия 1.3.8.1:
- Добавлена возможность изменить порядок переменных модуля.
- Поддержаны асинхронные методы "Асинх/Ждать".
25.03.2023 - Версия 1.3.7.1:
- Добавлена возможность кодировать файл image.
- Добавлена кодировка констант "Hex".
23.03.2023 - Версия 1.3.6.1:
- Добавлена возможность кодировать константы.
21.03.2023 - Версия 1.3.5.1:
- Добавлена возможность изменить порядок процедур.
- Добавлены флажки "Удалить номера строк" и "Добавить переходы" в закладке "Основное".
- Упразднен флажок "Обфусцировать".
18.03.2023 - Версия 1.3.4.1:
- Добавлена новая поставка модулей "модуль без исходного текста" с доступом к редактированию модуля.
- Поставка модулей "пустой модуль" переименована в "пароль на модуль "0"" и переделана.
10.03.2023 - Версия 1.3.1.1:
- Экзотическая кодировка файла image.
10.01.2023 - Версия 1.2.5.6:
- Добавлена возможность изменить порядок констант.
- Добавлена возможность разложить результирующий файл image на составляющие.
- Добавлен флажок "Отключить вывод информации" в закладке "Настройки".
10.12.2022 - Версия 1.2.4.5:
- Добавлен новый пункт "Повторяющийся" в поле "Порядок разделов".
23.11.2022 - Версия 1.2.2.3:
- Добавлена возможность изменить порядок записи разделов.
16.11.2022 - Версия 1.2.1.2:
- Добавлена возможность разложить файл image на составляющие в форме "Выбрать модули".
08.11.2022 - Версия 1.2.0.1:
- Добавлена возможность разложить файл image на составляющие.
24.10.2022 - Версия 1.1.0.7:
- Добавлена возможность изменить запись файла image.
- Добавлен вывод времени (дни, часы, минуты, секунды).
21.10.2022 - Версия 1.1.0.6:
- Добавлена обфускация команды BeginTry.
- Добавлены кнопки "Распаковать" и "Открыть" у поля "Файл".
- Исправлена проблема с долгой обработкой файла без флага "Обфусцировать".
- Исправлена ошибка при запаковке файла *.cfe:
В процессе работы с объектом 'ЗаписьДанных' произошло изменение позиции нижележащего потока извне.
12.10.2022 - Версия 1.1.0.4:
- Добавлена возможность удалять тексты запароленных модулей, открывать окно ввода пароля и создать пустой модуль.
02.10.2022 - Версия 1.1.0.3:
- Добавлена обфускация команды Goto.
- Добавлена возможность открыть непосредственно файл *.epf (внешняя обработка) после обфускации байт-кода.
20.09.2022 - Версия 1.1.0.2:
- Исправлена ошибка при формировании отчета.
16.09.2022 - Версия 1.1.0.1:
- Добавлен новый распаковщик/запаковщик файлов *.epf, *.erf, *.cf, *.cfe, *.cfu. Написан полностью на 1с.
- Упразднены все предыдущие распаковщики/запаковщики файлов.
Причина:
- в v8unpack нет запаковки файла cfu, ошибка хеша после запаковки файла cfe и т.д.;
- в 1с (выгрузка/загрузка обработки/отчета в/из XML без добавления в командную строку "/F <base> /N <user> /P <password>") после запаковки файлов все ссылочные реквизиты становятся текстовыми.
05.07.2022 - Версия 1.0.9.5:
- Добавлен распаковщик/упаковщик файлов V8Unpack viewer.
- Добавлена возможность выбора файла cfu в формате файлов v8unpack.
- Добавлен ключ -inflate в формате файлов v8unpack.
04.07.2022 - Версия 1.0.8.5:
- Добавлены ключи -unpack, -undeflate, -deflate и -pack в формате файлов v8unpack.
03.07.2022 - Версия 1.0.7.5:
- Добавлены параметры /DisableStartupMessages и /DisableStartupDialogs в формате 1С.
- Исправлена ошибка:
При переоткрытии формы не сохраняются данные каталога распаковки в настройках.
01.07.2022 - Версия 1.0.6.4:
- Добавлена возможность выбора формата 1С (bin, выгрузка/загрузка обработки/отчета в/из XML) / v8unpack (image, epf, erf, cf, cfe).
30.06.2022 - Версия 1.0.5.4:
- Добавлен флажок "Не создавать копию".
29.06.2022 - Версия 1.0.4.4:
- Добавлено автоматическое закрытие формы выбора запароленных модулей.
- Скорректирована обфускация команды Unused.
25.06.2022 - Версия 1.0.3.3:
- Добавлена возможность выбора файла cfe.
- Добавлен распаковщик/упаковщик файлов v8unpack 3.0.43.28.
24.06.2022 - Версия 1.0.2.3:
- Добавлена возможность выбора файла cf.
- Добавлена возможность выбора модулей.
21.06.2022 - Версия 1.0.1.3:
- Исправлена ошибка:
При обфускации файла, в константах и параметрах с типом "Число", заменяются знаки с "." на ",".НДФЛ = Окр(ОблагаемаяБаза * 0.13);
20.06.2022 - Версия 1.0.1.2:
- Добавлена возможность обфускации модуля для расширения конфигурации.
- Исправлены ошибки при обфускации обработанного файла.
17.06.2022 - Версия 1.0.0.1:
- Исправлена обратная сборка файлов из файла bin.
16.06.2022 - Версия 1.0.0.0:
- Добавлена возможность выбора версии v8unpack.
- Добавлена возможность выбора файла epf, erf, bin и image.
- Добавлена возможность обфускации файлов.
- Добавлена возможность изменять тексты запароленных модулей.
Протестировано на платформе 8.3.22.1851.
См. также: