Автор: Сергей Чубченко. Дата публикации: 08.03.2026
Рад сообщить о выпуске VB Decompiler версии 26.1. Это крупное обновление включает глубоко переработанный оптимизатор C#-кода, совершенно новый встроенный плагин, полную совместимость со скринридером NVDA, а также множество улучшений стабильности и удобства использования.
Наиболее значимым техническим достижением версии 26.1 является абсолютно новый анализатор и оптимизатор процедур для C#-кода. Он работает с декомпилированным кодом любых .NET-языков - C#, VB.NET, F# и других, преобразуя низкоуровневые IL команды, сгенерированные компилятором, в чистый и читаемый исходный код на C#.
Исходный декомпилированный .NET-код изобилует инструкциями
Условные переходы, представленные цепочками инструкций
Теперь оптимизатор обрабатывает широкий спектр паттернов на уровне выражений, которые ранее оставались в коде, сгенерированном компилятором, в избыточном виде:
Помимо отдельных выражений, оптимизатор теперь очищает общую структуру декомпилированных процедур:
Приложения на VB6 хранят встроенные ресурсы (изображения, иконки и курсоры) в бинарных .FRX файлах рядом с каждой формой. До сих пор для извлечения и сохранения этих ресурсов требовались внешние инструменты или ручной анализ в hex-редакторе. В версии 26.1 добавлен новый плагин FRX Image Viewer, который делает этот процесс максимально простым.
Плагин доступен прямо из меню Плагины и предоставляет следующие возможности:
Исходный код плагина доступен бесплатно на GitHub:
https://github.com/DotFixSoft/frxviewer
Версия 26.1 привносит комплексную переработку специальных возможностей, делая VB Decompiler полностью пригодным для использования с NVDA и другими программами экранного доступа (скринридерами), а также значительно повышает эффективность работы только с клавиатурой.
В версии 26.1 поддержка декомпиляции C# расширена тремя дополнительными опкодами MS IL:
Внутренняя функция, отвечающая за обработку локальных переменных в процедурах .NET, была полностью переписана. Предыдущая реализация могла завершаться ошибкой при обработке сильно обфусцированных файлов, содержащих намеренно некорректные объявления локальных переменных - распространенный метод защиты от декомпиляции. Новая реализация корректно обрабатывает эти случаи, исключая сбои на подобных файлах.
Унифицирована подсветка переменных в окне просмотра кода. Ранее клик по переменной подсвечивал её явные вхождения, но пропускал связанные использования строковых переменных, если они являлись частью структуры или использовались для доступа к члену объекта. Теперь переменные
Продвинутый оптимизатор 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, устраняя лишний код.
Восстановление конструкций If/Else
Условные переходы, представленные цепочками инструкций
goto, теперь преобразуются в полноценные структуры if/else:
- Стандартные цепочки if/else восстанавливаются из паттернов условных goto.
- Нормализация инвертированных условий - вызовы методов операторов, таких как
op_Equalityиop_Inequality, заменяются на их читаемые эквиваленты (==,!=). - Фильтрация цепочек goto - множественные связанные последовательности if + goto, указывающие на одну и ту же метку, корректно сохраняются в случаях, когда результирующее тело условия оказалось бы пустым, всегда отдавая приоритет семантической корректности перед визуальной чистотой.
Оптимизация выражений
Теперь оптимизатор обрабатывает широкий спектр паттернов на уровне выражений, которые ранее оставались в коде, сгенерированном компилятором, в избыточном виде:
- Инлайнинг методов арифметических операторов и операторов сравнения (
op_Addition→+,op_GreaterThan→>и т.д.). - Восстановление оператора остатка от деления (modulo) из последовательностей инструкций div/mul/sub.
- Распознавание и упрощение паттернов логического короткого замыкания (short-circuit).
- Нормализация скобок для вызовов методов без аргументов (
.Trim→.Trim()). - Обработчики интерполированных строк (
DefaultInterpolatedStringHandler) сворачиваются в читаемые выражения конкатенации строк.
Очистка переменных и оптимизация структур
Помимо отдельных выражений, оптимизатор теперь очищает общую структуру декомпилированных процедур:
- Удаление лишних переменных возврата - простые временные, используемые только для хранения возвращаемого значения, удаляются; при этом доступ к полям, массивам и результаты вызова методов всегда сохраняются.
- Удаление избыточных копий переменных условий из тел циклов.
- Блоки
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
Доступность и навигация с клавиатуры
Версия 26.1 привносит комплексную переработку специальных возможностей, делая VB Decompiler полностью пригодным для использования с NVDA и другими программами экранного доступа (скринридерами), а также значительно повышает эффективность работы только с клавиатурой.
- Поддержка клавиши Enter в дереве проекта: нажатие Enter на выделенном узле в дереве проекта теперь открывает соответствующую форму, модуль или процедуру в активном окне просмотра (аналогично двойному клику).
- Новая горячая клавиша Alt+1: мгновенно переключает фокус между Деревом проекта и текущим активным окном - будь то редактор кода декомпилятора/дизассемблера, Hex-редактор, панель свойств формы или любая другая панель. Это избавляет от необходимости перебирать все элементы управления клавишей Tab для переключения контекста.
- Исправлена навигация по Tab в Hex-редакторе: нажатие Tab внутри Hex-редактора теперь корректно переключает фокус между шестнадцатеричным и текстовым представлением, после чего передает фокус на следующий элемент интерфейса. Ранее фокус застревал внутри редактора.
- Привязка меток для скринридеров: текстовые метки интерфейса по всему приложению теперь строго привязаны к соответствующим полям ввода и выпадающим спискам, гарантируя, что скринридеры будут озвучивать правильный контекст для каждого элемента управления.
Улучшенный охват опкодов .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.