Ограничения обфускации
В защитном комплексе DotFix NiceProtect используется уникальная технология обфускации данных, оставляемых компилятором, основанная на наших разработках в области декомпиляции Visual Basic и Delphi приложений. Многие современные языки программирования сохраняют огромное число служебной и отладочной информации в компилируемые файлы. Вы можете сколько угодно защищать код программы (использовать мутацию и виртуализацию), но имена публичных функций, форм, модулей, контролов на формах - все равно останутся в защищенном файле и будут помогать взломщику локализовать нужную функцию в Вашей программе. Для борьбы с этим нами был разработан обфускатор данных для Delphi и Visual Basic приложений. На настоящий момент, поддерживаются все актуальные версии Delphi, начиная с 3 версии, включая всю ветку Delphi XE - Delphi XE8, а также Delphi 10 Seattle, Delphi 10.1 Berlin.
Как работает обфускатор
Принцип работы обфускатора основан на декомпиляции всей программы. Программа разделяется на проект, используемые формы, модули и классы. Каждая форма декомпилируется с целью разделения на элементы управления (кнопки, текстовые поля и т.д.) и привязанные к ним события. Затем декомпилируются структуры с именами функций и процедур, а также события, входящие в каждый объект программы. В процессе сбора данной информации обфускатор проверяет зависимости одних объектов от других и производит синхронное изменение имен всех объектов и процедур.
После данной операции из 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 и никак не поможет в обфускации других языков.