Как расшифровать защищенные строки в модулях 1С

Программист 1С v8.3 (Обычные формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При работе с устаревшими или отраслевыми конфигурациями программисты 1С часто сталкиваются с проблемой «закрытых» модулей. Даже если удается получить доступ к байт-коду скомпилированного модуля, камнем преткновения становятся зашифрованные строки. Такие строки выглядят как бессмысленный набор символов, например: gR0zR0sR03S03S0+R0HS0vB0. В этой статье мы проанализируем структуру таких данных и разберем алгоритм их расшифровки на примере защиты, используемой компанией «ВВЕРХ» (VVERH) в конфигурации «Управление картриджами».

Анализ проблемы: почему декомпилятор не справляется

Когда мы открываем скомпилированный модуль, мы видим структуру объектов, где строковые литералы представлены в формате {"S","содержимое_строки"}. В обычных модулях там находится читаемый текст. Однако в защищенных конфигурациях вместо текста мы видим длинные последовательности символов. Разберем типичный пример такой структуры из реальной практики:


{"S","Оформление"}, 
{"S","УстановитьЗначениеПараметра"}, 
{"S","ЦветФона"}, 
{"S", "qP07Q00Q0DQ0DQ08Q0RQ0j904A0lQ0zQ0+P0NP0aQ0hQ0iQ0QQ0/Q0jQ0wQ0iQ..."}

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

Разбор структуры зашифрованной строки (метод триплетов)

Давайте внимательно посмотрим на пример зашифрованной последовательности: gR0zR0sR03S03S0+R0HS0vB0.... Проанализируем ситуацию и заметим важную закономерность, которую часто упускают при первом взгляде.

Если разбить строку на блоки по три символа, мы увидим следующее:

Здесь каждый третий символ (в данном случае 0, S, T, U и т.д.) выполняет роль технического разделителя или «смещающего индекса». Обратите внимание, что по мере увеличения длины строки этот третий символ меняется в алфавитном порядке. Это явный признак использования скользящего ключа или динамической таблицы подстановок.

Первые два символа в каждом блоке (например, gR, zR) представляют собой полезную нагрузку, закодированную методом, похожим на Base64, но с применением XOR-маски или аддитивного шифра, зависящего от того самого третьего символа. Для изучения принципов таких преобразований можно использовать материал по XOR-кодированию строк и побитовым операциям в 1С.

Алгоритм работы системы защиты

Рассмотрим подробнее, как именно происходит дешифровка таких строк внутри платформы 1С. В большинстве случаев подобные решения от сторонних разработчиков (таких как «ВВЕРХ») опираются на внешнюю компоненту (DLL). Процесс выглядит так:

  1. В коде конфигурации (обычно в модуле обычного приложения или в общем модуле инициализации защиты) происходит загрузка внешней компоненты.
  2. При выполнении защищенного участка кода программа передает зашифрованную строку методу этой компоненты.
  3. Компонента на низком уровне выполняет математические преобразования:
    • Извлекает первые два символа триплета.
    • Преобразует их в числовой код.
    • Применяет смещение (offset), определяемое третьим символом.
    • Собирает итоговый байтовый поток в кодировке Unicode (UTF-16).
  4. Возвращает расшифрованную строку (например, «ЦветФона» или текст SQL-запроса) обратно в 1С.

Практические шаги по расшифровке

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

Если у вас есть доступ к работающей конфигурации (пусть и с закрытыми модулями), вы можете воспользоваться следующей методикой:

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

2. Использование отладчика. Если вы нашли точку вызова, вы можете поставить точку останова в месте, где зашифрованная строка передается в функцию. Например:


// Предположительный вид вызова в коде
Результат = ОбъектЗащиты.Расшифровать(ЗашифрованнаяСтрока);

В табло отладчика вы можете вычислить это выражение и увидеть результат в открытом виде.

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


&НаКлиенте
Процедура РасшифроватьСтроку()
    // Путь к компоненте обычно в макете или в папке с базой
    ПутьККомпоненте = "C:\Bins\vverh_prot.dll"; 
    ПодключитьВнешнююКомпоненту(ПутьККомпоненте, "Vverh", ТипВнешнейКомпоненты.Native);
    ОбъектЗащиты = Новый ("AddIn.Vverh.Protection");
    
    ЗашифрованныйТекст = "qP07Q00Q0DQ0DQ08Q0RQ0j904A0lQ0zQ0...";
    Результат = ОбъектЗащиты.Расшифровать(ЗашифрованныйТекст);
    Сообщить(Результат); // Здесь появится открытый текст
КонецПроцедуры

Что скрывается в этих строках?

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

Резюме

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

← На главную