Профессиональные решения

для защиты Windows приложений

и восстановления исходного кода
Автор: Сергей Чубченко. Дата публикации: 08.03.2026

Продвинутый оптимизатор C#-кода, просмотрщик FRX-изображений и улучшенная доступность в VB Decompiler v26.1


Рад сообщить о выпуске VB Decompiler версии 26.1. Это крупное обновление включает глубоко переработанный оптимизатор C#-кода, совершенно новый встроенный плагин, полную совместимость со скринридером NVDA, а также множество улучшений стабильности и удобства использования.

Оптимизатор C# процедур нового поколения


Наиболее значимым техническим достижением версии 26.1 является абсолютно новый анализатор и оптимизатор процедур для C#-кода. Он работает с декомпилированным кодом любых .NET-языков - C#, VB.NET, F# и других, преобразуя низкоуровневые IL команды, сгенерированные компилятором, в чистый и читаемый исходный код на C#.

Восстановление циклов


Исходный декомпилированный .NET-код изобилует инструкциями goto и метками, которые в оригинальном исходном коде представляли собой структурированные циклы. Теперь оптимизатор в значительном мере восстанавливает эти конструкции:
  • Циклы while - обнаруживаются и восстанавливаются из конструкций goto/метка.
  • Циклы do-while - корректно идентифицируются, даже если переменная условия объявлена внутри тела цикла.
  • Циклы foreach - восстанавливаются из полного каркаса GetEnumerator / MoveNext / Dispose, включая обертки try/finally, сгенерированные компилятором.
  • Вложенные циклы - комбинации while-внутри-while, while-внутри-foreach, while-внутри-if корректно генерируются в виде вложенных структур.
  • Инлайнинг условий цикла - промежуточные временные переменные, которым присваивается значение непосредственно перед проверкой условия цикла, встраиваются прямо в заголовок while, устраняя лишний код.

Сравнение: исходный цикл на базе goto и восстановленные циклы while и foreach

Восстановление конструкций If/Else


Условные переходы, представленные цепочками инструкций goto, теперь преобразуются в полноценные структуры if/else:
  • Стандартные цепочки if/else восстанавливаются из паттернов условных goto.
  • Нормализация инвертированных условий - вызовы методов операторов, таких как op_Equality и op_Inequality, заменяются на их читаемые эквиваленты (==, !=).
  • Фильтрация цепочек goto - множественные связанные последовательности if + goto, указывающие на одну и ту же метку, корректно сохраняются в случаях, когда результирующее тело условия оказалось бы пустым, всегда отдавая приоритет семантической корректности перед визуальной чистотой.

Восстановление If ... Else

Оптимизация выражений


Теперь оптимизатор обрабатывает широкий спектр паттернов на уровне выражений, которые ранее оставались в коде, сгенерированном компилятором, в избыточном виде:
  • Инлайнинг методов арифметических операторов и операторов сравнения (op_Addition+, op_GreaterThan> и т.д.).
  • Восстановление оператора остатка от деления (modulo) из последовательностей инструкций div/mul/sub.
  • Распознавание и упрощение паттернов логического короткого замыкания (short-circuit).
  • Нормализация скобок для вызовов методов без аргументов (.Trim.Trim()).
  • Обработчики интерполированных строк (DefaultInterpolatedStringHandler) сворачиваются в читаемые выражения конкатенации строк.

Декомпилированный C#-код до и после оптимизации выражений, демонстрирующий инлайнинг операторов и сворачивание обработчиков строк

Очистка переменных и оптимизация структур


Помимо отдельных выражений, оптимизатор теперь очищает общую структуру декомпилированных процедур:
  • Удаление лишних переменных возврата - простые временные, используемые только для хранения возвращаемого значения, удаляются; при этом доступ к полям, массивам и результаты вызова методов всегда сохраняются.
  • Удаление избыточных копий переменных условий из тел циклов.
  • Блоки try/finally/catch сохраняются и имеют правильные отступы.
  • Удаление каркаса foreach - вызовы GetEnumerator, Current, MoveNext и Dispose убираются после восстановления цикла.
  • Строки, содержащие только метки, и комментарии с мертвыми ссылками удаляются из итогового кода.
  • Исправление недостижимых инструкций goto в случаях, когда целью является следующая по порядку инструкция.

Новый плагин: Просмотрщик FRX-изображений


Приложения на VB6 хранят встроенные ресурсы (изображения, иконки и курсоры) в бинарных .FRX файлах рядом с каждой формой. До сих пор для извлечения и сохранения этих ресурсов требовались внешние инструменты или ручной анализ в hex-редакторе. В версии 26.1 добавлен новый плагин FRX Image Viewer, который делает этот процесс максимально простым.

Плагин доступен прямо из меню Плагины и предоставляет следующие возможности:
  • Предпросмотр в виде миниатюр для всех встроенных изображений, иконок и курсоров, найденных в целевом приложении.
  • Автоматическое определение форматов для ресурсов BMP, PNG, JPEG, GIF, ICO и CUR - без необходимости ручной настройки.
  • Парсинг иконок с несколькими разрешениями: каждый вариант размера, хранящийся внутри файла .ICO, доступен по отдельности.
  • Экспорт в один клик для сохранения любого ресурса на диск в его исходном формате.
  • Полная поддержка тёмной темы, соответствующая остальному интерфейсу VB Decompiler.

Исходный код плагина доступен бесплатно на GitHub:
https://github.com/DotFixSoft/frxviewer

Плагин FRX Image Viewer, отображающий сетку миниатюр встроенных в VB6 изображений и иконок

Доступность и навигация с клавиатуры


Версия 26.1 привносит комплексную переработку специальных возможностей, делая VB Decompiler полностью пригодным для использования с NVDA и другими программами экранного доступа (скринридерами), а также значительно повышает эффективность работы только с клавиатурой.

  • Поддержка клавиши Enter в дереве проекта: нажатие Enter на выделенном узле в дереве проекта теперь открывает соответствующую форму, модуль или процедуру в активном окне просмотра (аналогично двойному клику).
  • Новая горячая клавиша Alt+1: мгновенно переключает фокус между Деревом проекта и текущим активным окном - будь то редактор кода декомпилятора/дизассемблера, Hex-редактор, панель свойств формы или любая другая панель. Это избавляет от необходимости перебирать все элементы управления клавишей Tab для переключения контекста.
  • Исправлена навигация по Tab в Hex-редакторе: нажатие Tab внутри Hex-редактора теперь корректно переключает фокус между шестнадцатеричным и текстовым представлением, после чего передает фокус на следующий элемент интерфейса. Ранее фокус застревал внутри редактора.
  • Привязка меток для скринридеров: текстовые метки интерфейса по всему приложению теперь строго привязаны к соответствующим полям ввода и выпадающим спискам, гарантируя, что скринридеры будут озвучивать правильный контекст для каждого элемента управления.

Интерфейс VB Decompiler, демонстрирующий фокус на дереве проекта и навигацию между панелями с помощью горячей клавиши Alt+1

Улучшенный охват опкодов .NET IL


В версии 26.1 поддержка декомпиляции C# расширена тремя дополнительными опкодами MS IL: constrained., rem и rem.un. Эти опкоды встречаются в вызовах виртуальных методов и операциях вычисления остатка от деления целых/беззнаковых чисел. Ранее они оставались в виде необработанного IL-кода; теперь они корректно переводятся в свои C#-эквиваленты.

Исправление стабильности: Обфусцированные процедуры .NET


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

Улучшения подсветки переменных


Унифицирована подсветка переменных в окне просмотра кода. Ранее клик по переменной подсвечивал её явные вхождения, но пропускал связанные использования строковых переменных, если они являлись частью структуры или использовались для доступа к члену объекта. Теперь переменные var_XX и str_XX обрабатываются одинаково: клик по любой переменной подсвечивает все места её использования, в том числе в качестве базовой структуры или квалификатора объекта. Например, при клике на str_1 также подсветится str_1.Value.

Исправления ошибок


  • Расположение элементов AI Helper: позиция элементов управления на вкладке AI Helper теперь корректно подстраивается под размер окна, даже если он не изменялся с момента предыдущего запуска.
  • Режим AI Helper по умолчанию: если реестр содержит некорректные или поврежденные настройки для AI Helper, приложение теперь безопасно использует режим LLM по умолчанию, избегая вывода пустого поля.


(C) Сергей Чубченко, разработчик VB Decompiler



* Visual Basic, Visual Studio и Windows являются зарегистрированными товарными знаками корпорации Microsoft.