Техническая поддержка :

Современные решения

для защиты Windows программ

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

Декомпиляция и эмуляция Native Code лучше чем когда либо в VB Decompiler 11

Три месяца кропотливой работы и несколько месяцев подготовительного этапа позади и я рад представить существенно обновленный VB Decompiler! Улучшено и сделано очень многое. Но главное, о чем хотелось бы упомянуть, это полностью переработанный эмулятор-декомпилятор машинного кода Visual Basic.

Декомпиляция LateMem, LateID и Named вызовов

Основа построения кода в VB6 построена на вызовах свойств и методов COM OLE объектов. Это ранние и поздние связывания, а также обращения к объектам по таблице виртуальных методов и Dispatch ID. Помимо этого вызовы производятся по UUID/GUID объекта и напрямую по имени. Всего только функций работы с методами и свойствами объектов в библиотеке MSVBVM60.DLL двадцать четыре! И это не считая функций создания объектов, проверки их созданности, а также выгрузки. Все это только для Native Code. В P-Code функции свои и они другие!



Потребовалось море сэмплов, сотни компиляций и проверок. Как результат проделанной работы - более качественная декомпиляция Native Code, поддержка большего числа вызовов и их правильная обработка. Особая гордость за вложенные вызовы вида Object.SubClass(Index).SubClass2(Index).Property. Подобные вызовы, для известных VB Decompiler'у ActiveX библиотек, поддерживаются в подавляющем большинстве случаев. Исключения составляют пожалуй лишь Named вызовы, когда не передается UUID объекта.

Обработка создания объектов

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



Трассировка для P-Code

Клиенты, использующие лицензию с возможностями трассировки, давно хотели ее поддержку не только для Native Code, но и для P-Code. В VB Decompiler уже сейчас можно включать/отключать оптимизатор декомпилированного кода, отключать обработку стэка, включать показ служебных опкодов компилятора. Теперь же появилась возможность еще и пошагово смотреть, как меняются переменные, и формируется декомпилированный код.



В Native Code трассировщике был добавлен поиск внутри списка переменных, введено отображение как типа текущего объекта (This, Me), так и контрола на форме, если он является текущим объектом. Улучшен вывод сравниваемых операндов для "cmp", "test".

Анализатор прототипов

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



Чтобы даже при быстрой декомпиляции качество было на высоте - в декомпилятор была добавлена функция предварительного анализатора приватных функций. Это несколько снижает скорость открытия файла, но все равно это в разы быстрее полной декомпиляции. Данная функция доступна в настройках и рекомендуема для включения.

Обработка "Else" конструкций в Native Code

Пять лет назад возможность развертывания "If" ... "Else" ... "End If" конструкций была добавлена для приложений, скомпилированных в P-Code. И вот, спустя несколько лет, эмуляция и обработка подобных конструкций доступна и для файлов, скомпилированных в машинный код. Было проделано много работы по обработке разного рода оптимизаций компилятора, обучению эмулятора разным сложным конструкциям, присутствующим внутри и перед Else блоками. Это проверки на созданность объектов, на переполнение, и так далее. На данный момент функционал "Else" ветвлений готов и может быть включен в настройках программы.



Работа с массивами

В версии 11 было продолжено развитие алгоритмов декомпиляции разного рода массивов в Native Code. Ввиду особенностей машинного кода, а также разного рода оптимизаций, вариантов доступа к массивам и их содержимому поистине огромное количество. С каждой новой версией их поддержка становится все лучше и точнее.



Расширен стэк эмулятора

Вот уже много лет эмулятор машинного кода использовал стэк на 16 элементов. Этого было достаточно для большинства сэмплов, разработанных в Visual Basic. В процессе работы над Late вызовами и их многочисленной вложенностью, особенно при работе с базами данных, было решено расширить стэк. Теперь внутренний эмулятор машинного кода использует стэк на 64 элемента по 4 байта (dword). Это дает возможность декомпилировать вызовы с десятками параметров и вложенных объектов.



Ускорение во всем

В каждой новой версии декомпилятор начинает работать быстрее и версия 11 не исключение! Ускорена проверка упакованности файлов. Ускорена обработка больших функций, содержащих более 100 тысяч строк кода. Ускорено сохранение файлов. Оптимизированы и ускорены критичные модули эмулятора. Оптимизирована база знаний внешних ActiveX и увеличена скорость ее загрузки.

Пользовательские типы

Visual Basic при компиляции файлов сохраняет крайне мало информации о пользовательских типах - структурах, объявляемых в заголовках форм и модулей, также именуемых UDT.



Тем не менее, VB Decompiler теперь поддерживает объявление UDT в заголовках объектов и показывает ссылки на них в коде. Ввиду того, что в бинарных файлах информации об UDT сохраняется крайне мало – декомпилятор способен узнать только размер пользовательского типа в байтах и число полей, являющихся строковыми.



Расширена работа с Case конструкциями

VB Decompiler теперь поддерживает "Case" конструкции с количеством элементов более 255. Фильтрует в дизассемблере размещенные в конце функций таблицы переходов в блоки "Case". Помимо этого добавлен ряд оптимизаций для более точной и качественной декомпиляции.



Декомпиляция внешних и внутренних COM OLE объектов

База знаний VB Decompiler значительно расширена. Ряд свойств объектов возвращают ссылку на другой объект. Была добавлена поддержка множества таких объектов. Реализована декомпиляция свойств и методов у класса RegExp2 из vbscript.dll. Также теперь поддерживаются обращения к массивам объектов через: Form.Controls.X, MDIForm.Controls.X, UserControl.Controls.X, PpropertyPage.Controls.X, UserDocument.Controls.X, ListView.Items.X



Отключение показа адресов в P-Code

Иногда хочется видеть код чистым, без указания адреса в памяти для каждой строки. В ряде случаев это полезно при сохранении проекта. Несмотря на кажущуюся простоту это требует тщательной обработки ссылок, чтобы не потерять метки для GoTo, GoSub, Resume, On Error и других переходов. Начиная с 11 версии декомпилятора Вы можете видеть код без служебных адресов не только для Native Code, но и для P-Code. Для этого достаточно отключить опцию показа адресов в настройках программы.



Разные цвета для процедур и функций

С добавлением анализатора прототипов, весьма полезно сразу, не открывая код видеть в дереве объектов и их событий и методов, что является событием, что функцией, а что процедурой. Теперь VB Decompiler выделяет их разным цветом, что упрощает анализ.



Поддержка ярлыков (*.lnk)

В некоторых случаях бывает удобно открыть в декомпиляторе ярлык, ссылающийся на бинарный файл. Файлы ярлыков в Windows имеют собственный формат и получить из них адрес файла довольно непросто. Особенно если не использовать внешние библиотеки, дабы не добавлять лишних зависимостей. В VB Decompiler этот вопрос решен без внешних вызовов и поддерживает большинство ярлыков.

Поддержка почти всех API MSVBVMXX.DLLL

Декомпилятор теперь поддерживает еще 28 функций runtime библиотеки Visual Basic. Можно смело сказать - VB Decompiler поддерживает почти все возможные API, предоставляемые MSVBVMXX.DLL. Это дает возможность декомпилировать файлы наиболее корректно.



Другие улучшения

Как всегда добавлено множество приятных мелочей. Запись даты и времени в экспортируемые файлы. Разные правки интерфейса. Добавлены новые языки GUI и справки. Проведено множество оптимизаций, рефакторинга и багфиксов. Улучшена работа трассировщика. Расширен функционал эмулятора команд FPU. Оптимизирован дизассемблер .NET сборок.



C каждой новой версией VB Decompiler становится быстрее и лучше и я рад Вам его представить.

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



* Visual Basic and Visual Studio are registered trademarks of Microsoft Corporation.





Комментарии

отсутствуют

Добавление комментария


Ваше имя (на форуме):

Ваш пароль (на форуме):

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

Комментарий: