Найти тему

Декомпилированный декомпилятор от AWA

Новая версия: https://dzen.ru/a/Z8cNFCzCRSMHSOiA.

Кратко: деобфусцированный и декомпилированный хорошо знакомый всем одинэсникам декомпилятор от AWA. Старая версия. Пока.

ДекомпиляторAWA Старая версия.epf
Декомпилятор
Декомпилятор

Статья предназначена для популяризации изучении байт-кода и внутреннего устройства платформы 1С в продолжении 1С:Ассемблер. Немного летнего веселья! и для улучшения качества обфусцирования байт-кода.

Недавно понадобилось декомпилировать модуль моей собственной конфигурации. Пароль я благополучно забыл много лет назад. Применение всем очень давно известного декомпилятора от Валерия Агеева (AWA) успехом не увенчалось – код был обфусцирован. Как я его обфусцировал я тоже уже не помнил. Пришлось писать собственный декомпилятор на C. Разобравшись с байт-кодом от 1С я не смог побороть своего любопытства  узнать, что внутри у декомпилятора от AWA.

Итак… Декомпилятор написан на 1С. Библиотека v8cf  на C++ используется только для работы с контейнером 1С. Казалось бы, что могло пойти не так? Увы, байт-код обработки декомпилятора был обфусцирован. Даже не так: он был ОБФУСЦИРОВАН. Приключение на пару вечеров в стиле «вошли и вышли» растянулось на... Надолго.

В результате декомпилятор от AWA был деобфусцирован и декомпилирован. Как и оригинальная обработка от AWA предназначена для версии платформы 8.2 Толстый клиент.

При обфускации байт-кода декомпилятора AWA применял два уровня: код 1С и байт-код. На уровне кода 1С применялись методы:

  1. Произвольные имена переменных и методов. Бесполезно.
  2. Замена констант на переменные. Сильно затрудняет понимание деобфусцированного и декомпилированного кода. Вместо RegExp.Pattern = "^-?[0-9]+\.?[0-9]*$" в коде - ъxх.Pattern = шeрp.
  3. Помещение всех констант в закодированную строку. В ходе выполнения байт-кода строка декодируется и полученный код 1С выполняется. Строка содержит код 1С с инициализацией переменных значениями. Крайне спорное решение. По сути, эти строки (их было 3) указывают на ключи для обфускации. Сильно упрощает деобфускацию.

На уровне байт-кода применялись методы:

  1. Произвольное расположение подпрограмм в блоке команд. Бесполезно.
  2. Использование не имеющей соответствие в языке 1С операции 32. Полезно.
  3. Удаление команды с кодом 1 – указателя на номер строки текста 1С. Полезно.
  4. Изменение шаблона компиляции 1С – байт-код. Например, для оператора Если вместо команд 40-39 использовать 41-42. Полезно.
  5. «Разрезание» команд блока на куски произвольного размера от 1 до 7 команд. Каждый такой кусок должен заканчиваться командой перехода, условного (40, 41) или безусловного (39, 42). Использование команды перехода также случайно. Для условного перехода использовались специальные переменные, содержащие значения Ложь или Истина. Крайне полезный метод. Минус – переменные для условных переходов нельзя «светить» в п. 3. кода 1С.
  6. Использование стека для накопления команд. Команды (с кодами 2,3,4 и т.д.), накопленные в стеке и их использование командами с кодами 16, 20, 40, 41 и т.д. разделяются произвольным количеством других команд. Крайне полезно. Особенно это касается переменных, используемых в командах условного перехода из п. 5.
  7. Повторное использование кода - использование одинаковых наборов команд с условным переходом, как до перехода, так и после. Например: {2,0}; {4,0}; и {2,1}; {4,0}; разделены условием. После условия идёт команда присваивания {16,0}. В зависимости от условия получаем A = 1 или B = 1. Для стековой машины это естественный ход вещей. При деобфускации приходится эмулировать работу стековой машины и рассчитывать точку схождения или расхождения, поскольку 1С не позволяет разбивать оператор на куски. Крайне полезный метод, сильно затрудняющий деобфускацию.
  8. Передача управления на команду внутри оператора. Передавать управление по ссылке внутрь оператора в 1С нельзя, в байт-коде такого ограничения нет. Сильно затрудняет деобфускацию.

Уровень обфускации от AWA в статье Обфускатор байт-кода 1C оценивается как высокий. Я бы оценил его как средний. Использование всех вышеперечисленных методов не приводит к надежной защите кода. Хотя, тот факт, что код от AWA не был декомпилирован как минимум лет 15, говорит о том, что задача довольно сложная. Но решаемая.

Анализируя код декомпилятора от AWA можно прийти к выводу, что от него надёжно защищает удаление из байт-кода команд с кодом 1 – указатель на номер строки с текстом 1С. Эта команда активно используется в алгоритме для разметки операторов.

Любую защиту можно обойти. Но далеко не всегда овчинка будет стоить выделки. Если повысить уровень обфускации, примененный уважаемым AWA, добавить больше случайности в применяемые методы, можно добиться надёжной защиты продуктов на платформе 1С от взлома.

Обработка тестировалась на платформе 1С:Предприятие 8.2 (8.2.19.76), под OC Win 10. Поскольку обработка почти полностью соответствует оригиналу, она должна работать под 8.3 (до 8.3.5 включительно), 8.2, 8.1 любых версий, и под Win от WinXP до Win 10.