# Ограничения обфускации - Совместимость и RTTI

> Важные ограничения при использовании обфускации. Как избежать ошибок при защите кода, использующего RTTI, Reflection или специфичные функции VB6.

Canonical HTML: <https://www.niceprotect.com/help/ru/obfuscation_restrictions.htm>

## Ограничения обфускации


В защитном комплексе **DotFix NiceProtect** используется уникальная технология обфускации данных, оставляемых компилятором, основанная на наших разработках в области декомпиляции **Visual Basic** и **Delphi** приложений. Многие современные языки программирования сохраняют огромное число служебной и отладочной информации в компилируемые файлы. Вы можете сколько угодно защищать код программы (использовать мутацию и виртуализацию), но имена публичных функций, форм, модулей, контролов на формах - все равно останутся в защищенном файле и будут помогать взломщику локализовать нужную функцию в Вашей программе.
Для борьбы с этим нами был разработан обфускатор данных для **Delphi** и **Visual Basic** приложений. На настоящий момент, поддерживаются все актуальные версии **Delphi**, начиная с 3 версии, включая всю ветку **Delphi XE**, а также 
**Delphi 10 Seattle**, **Delphi 10.1 
Berlin**, **Delphi 11 Alexandria**, **Delphi 12 Athens** и **Delphi 13 Florence**.



Как работает обфускатор



Принцип работы обфускатора основан на декомпиляции всей программы. Программа разделяется на проект, используемые формы, модули и классы. Каждая форма декомпилируется с целью разделения на элементы управления (кнопки, текстовые поля и т.д.) и привязанные к ним события. Затем декомпилируются структуры с именами функций и процедур, а также события, входящие в каждый объект программы. В процессе сбора данной информации обфускатор проверяет зависимости одних объектов от других и производит синхронное изменение имен всех объектов и процедур.



После данной операции из EXE файла удаляется практически вся идентификационная информация о принадлежности той или иной функции к тому или иному модулю или классу. Поэтому найти в программе форму **frmTrial** или **frmRegistration** будет куда сложнее.



Ограничения обфускатора Visual Basic 5.0/6.0 приложений



Обфускатор использует сложный алгоритм анализа зависимостей объектов, но некоторые вещи он все же не поддерживает. Потому в некоторых случаях программу потребуется заранее подготовить к процессу обфускации. Рассматриваемые ниже нюансы касаются только обфускации **Visual Basic 5.0/6.0** приложений. Давайте рассмотрим эти вещи.



1. Обфускатор не поддерживает Design time ссылки одних объектов на другие



К примеру, у Вас есть **TreeView** а у него есть свойство **ImageList**. Так вот, если имя **ImageList** объекта указывать в свойстве **ImageList** контрола **TreeView**, то после обфускации оно не будет изменено, и программа будет завершаться с ошибкой. Тоже касается баз данных и указания **DataSet**'ов и **Recordset**'ов в свойствах компонента.

Begin ComctlLib.TreeView TreeView1
Height          =   1932
Left            =   3600
TabIndex        =   3
Top             =   1320
Width           =   2412
_ExtentX        =   4255
_ExtentY        =   3408
_Version        =   327682
Style           =   7
**ImageList = "ImageList1"**
Appearance      =   1
End



Проблема заключается в том, что каждый ActiveX объект на форме имеет свой формат сохраненных свойств. И декомпилятор, встроенный в защиту, не способен декомпилировать все возможные свойства всех существующих внешних объектов.



Все это легко можно решить, если перенести присвоения из Design time в Runtime, а именно перенести эти присвоения в **Form_Load**:


Private Sub Form_Load()
TreeView1.ImageList = ImageList1
End Sub



Тоже самое потребуется сделать с каждым таким присвоением. К счастью такого кода обычно крайне мало.



2. Не поддерживаются ранние объявления объектов (LateCall вызовы)



Мало кто пользуется этой возможностью, потому эта несовместимость не коснется большинства проектов на VB6. Тем не менее о ней необходимо помнить. Если вы создаете копии объектов форм (работаете с формой как с классом) - то наверняка Вам знакомы подобные строки:

Private Sub Form_Load()
Dim oForm as New frmMain
oForm.Show
End Sub



Так вот, в этом случае имя **frmMain** вставляется компилятором VB6 прямо в код функции **Form_Load**. Обфускатор не декомпилирует код, а только данные, потому эта вставка остается незаметной. Результат - программа будет завершаться с ошибкой после обфускации. К сожалению, сделать поддержку таких вызовов в **DotFix NiceProtect** не представляется возможным ввиду того, что потребуется дизассемблирование, а затем декомпиляция кода всех функций программы. Компилятор VB6 поддерживает два типа компиляции: **P-Code** и **Native Code**. А это значит, что обфускатор для решения этой задачи должен уметь декомпилировать и **P-Code** и **Native Code**. Несмотря на то, что у нас имеются подобные технологии, декомпиляция процесс крайне небыстрый. Для больших проектов декомпиляция всего кода может занимать более получаса. И это без учета времени на анализ ссылок на объекты и их переименование. Ввиду этого, по объективным причинам, мы приняли решение не использовать полную декомпиляцию и анализ кода в **DotFix NiceProtect**, тем более что это может решить только задачу в рамках **Visual Basic 5.0/6.0** и никак не поможет в обфускации других языков.
