Улучшенная поддержка COM OLE объектов и работы с внутренними классами в VB Decompiler 11.9
В новой версии VB Decompiler проведен ряд фундаментальных изменений, а также исправлены все найденные недочеты.
Новый алгоритм работы с внешними объектами
Каждый раз, когда декомпилятор сталкивается с кодом вызова методов из внешних объектов (ActiveX файлов OCX и DLL), производится ряд действий. Сначала производится поиск этого объекта во встроенной базе данных декомпилятора. Это значительно ускоряет анализ, а также дает возможность декомпилировать код даже в том случае, если вызываемые внешние объекты не зарегистрированы в системе и более того, если их файлы вообще отсутствуют. Это работает для стандартных и часто используемых популярных библиотек.
В случае, если вызываемый объект декомпилятору неизвестен, запускается алгоритм анализа GUID'а вызываемого ActiveX, а также идентификатора интерфейса и класса внутри этого COM OLE контейнера. Алгоритм достаточно сложный, так как Visual Basic поддерживает множество способов таких вызовов. Это и раннее связывание, и позднее связывание, обращение по ID интерфейса к ранее созданному экземпляру OLE объекта, обращение используя и GUID библиотеки и идентификатор интерфейса и т.д. Особенно множество таких вызовов в Native Code. Это и обращение к методам объекта после API __vbaNew и обращения после __vbaObjSet и __vbaObjSetAddref и 22 функции из серии __vbaLateXX/__vbaVarLateXX. Все это уже поддерживает VB Decompiler. Но есть один нюанс. Если объект декомпилятору не известен, то запускается парсер внешней DLL/OCX библиотеки. Сначала поиск ее файла по GUID, а затем разбор ее TypeLib таблиц.
Ранее декомпилятор делал достаточно поверхностный разбор TypeLib. И иногда генерируемые прототипы функций могли не иметь возвращаемых значений (хотя они присутствовали). Также далеко не всегда задавался тип возвращаемого значения. В случае базовых типов это было не критично (Visual Basic вообще любит Variant типы). А вот когда возвращаемый тип - это экземпляр другого класса или интерфейса - код декомпилировался некорректно, так как декомпилятор не знал, что возвращаемый внешним методом параметр нужно рассматривать как класс, а не строковую или числовую переменную.
В новой версии разбор TypeLib информации внешних библиотек был полностью переписан и теперь прототипы всегда содержат возвращаемый тип, если это класс или интерфейс.
Новый алгоритм разбора If ... Else ... End If
В основе любой функции всегда лежат условия и сравнения. VB Decompiler имеет довольно продвинутый алгоритм анализа условных переходов. Корректно распознаются Else ветвления, Select Case и т.д. Но в ряде нестандартных случаев декомпилятор мог испытывать сложности в анализе. В частности если один из параметров сравнения уже был результатом другого сравнения переменных. Или когда один из параметров сравнения - результат работы функции с присваиванием результата ее работы переменной. Равно как и сравнение указателя класса с нулем, в то время как указатель уже был декомпилирован и подставлен его прототип. В этих случаях мог выдаваться не совсем понятный код с промежуточными присваиваниями. Теперь такие моменты анализируются на этапе разбора элементов сравнения и код выглядит чище.
Улучшен разбор прототипов в виртуальных таблицах методов
Каждая форма, UserControl или класс имеют виртуальную таблицу публичных методов (VTable). Часто она содержит не только имена, но и прототипы функций с именами параметров. К сожалению, в некоторых случаях, длины параметров распознавались некорректно и декомпилятор не разбирал часть имен аргументов функции. Ввиду полной не документированности внутренних структур Visual Basic, найти решение получилось не сразу, а лишь после анализа десятков примеров, где в параметрах функций использовались сложные типы данных. Теперь декомпилятор более полно поддерживает расшифровку прототипов.
Соединение декомпилированного кода с дизассемблированным и переход на нужную строку
В декомпиляторе имеется очень полезная функция объединения декомпилированного кода с машинным для более глубокого анализа. В декомпилированном коде достаточно щелкнуть правой кнопкой мыши, выбрать "Copy to disassembler" и весь декомпилированный код будет объединен с дизассемблированным. Это очень полезно чтобы понять из чего взялось то или иное сравнение или откуда появилась переменная. Но есть одно но. После объединения, курсор устанавливался на начало кода и приходилось искать заново строку, анализ которой производили. Если кода много, это создавало много неудобств. Теперь достаточно перед щелчком правой кнопки установить курсор на адрес строки (loc_XX) слева от кода и после объединения будет произведен переход на ту же строку.
Экспериментальная поддержка Windows XP
Когда-то, VB Decompiler разрабатывался на Visual Basic 6.0. Он поддерживал все версии Windows, начиная с Windows 95. Даже сейчас, клиенты могут скачать старую версию 8.4, которая будет работать и на Windows 95 (включая дизассемблирование .NET сборок без присутствия .NET Framework в системе) и на Windows 11. К сожалению, высокая совместимость VB6 не дает использовать новые возможности операционных систем, а сам язык сильно устарел. Десять лет назад VB Decompiler был переписан на другой язык. Постепенно совместимость со старыми и не поддерживаемыми операционными системами стала пропадать в угоду добавлению новых возможностей. Понимая, что некоторые клиенты до сих пор используют виртуальные машины на Windows XP для анализа кода, была проведена работа по адаптации декомпилятора для запуска под XP. К сожалению, нет возможности гарантировать 100% работу всего функционала, но продукт теперь может быть установлен и использоваться под Windows XP.
Множество других улучшений
Сложно в одной статье рассказать весь объем проделанных работ в новой версии. Каждый новый релиз - это море изменений. Какие-то более явные, какие-то менее. Но все они не просто добавляют внешний лоск, а реально улучшают качество декомпиляции и делают код нагляднее и понятнее. В новой версии добавлена поддержка эмуляции ряда команд ассемблера, которые ранее не поддерживались. Эмуляция некоторых уже поддерживаемых команд была доработана. Изменены алгоритмы разбора вызовов внутренних классов, что добавило возможность также выводить обращения к публичным переменным, заданным в виртуальной таблице методов класса. Добавлена поддержка базовых методов при ручном вызове классов (такие, как AddRef, Release, PropertyBag и так далее). Исправлена ошибка, скрывающая форму или класс в дереве объектов, если за ней шел пустой модуль. Доработан анализатор Select Case. И много, много другого.
Как всегда, с каждой новой версией, VB Decompiler становится существенно лучше. Улучшается качество кода. Добавляются новые возможности. Я также благодарен всем нашим пользователям за использование продукта. Именно благодаря Вам он продолжает активное развитие вот уже 17 лет!
(C) Сергей Чубченко, разработчик VB Decompiler
* Visual Basic and Visual Studio are registered trademarks of Microsoft Corporation.
Комментарии |
отсутствуют |
Добавление комментария |