Поиск по сайту:

Что такое запутывание кода и стоит ли его использовать?


Некоторые языки, такие как Java и .NET, можно легко декомпилировать в читаемый исходный код. Обфускация кода — это процесс, который затрудняет чтение двоичных файлов вашего приложения с помощью декомпилятора. Это важный инструмент для защиты интеллектуальной собственности вашего бизнеса.

Зачем запутывать код?

Компилируемые языки, такие как C++, преобразуются непосредственно в байт-код. Единственный способ перепроектировать, как они работают, — это использовать дизассемблер, что является трудоемким и сложным процессом. Это не невозможно, но пытаться вывести логику приложения высокого уровня из потока языка ассемблера сложно.

С другой стороны, такие языки, как C# и Java, не компилируются для какой-либо конкретной операционной системы. Скорее, они компилируются в промежуточный язык, такой как MSIL .NET. Промежуточный язык похож на ассемблер, но его можно легко преобразовать обратно в исходный код. Это означает, что если у вас есть общедоступная DLL или исполняемый файл, распространяемый вашей компанией, любой, у кого есть копия вашего исполняемого файла, может открыть его в декомпиляторе .NET, таком как dotPeek, и напрямую прочитать (и скопировать) ваш исходный код.

Обфускация кода не может предотвратить этот процесс — любую .NET DLL можно подключить к декомпилятору. Что действительно делает обфускация, так это использует ряд уловок, чтобы сделать исходный код чертовски раздражающим для чтения и отладки.

Простейшей формой этого является переименование объекта. Обычной практикой является правильное название переменных, методов, классов и параметров в соответствии с тем, что они делают. Но вам не обязательно, и технически ничто не мешает вам назвать их с помощью ряда строчных букв L и I или случайных комбинаций китайских символов Юникода. Для компьютера проблем нет, но для человека совершенно неразборчиво:

IlIIIIlIIIllIIIllIIll
lIIIllIIllIlIIIIlIIIl

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

Более продвинутые обфускаторы могут пойти дальше и изменить структуру вашего исходного кода. Это включает в себя замену управляющих структур более сложным, но семантически идентичным синтаксисом. Они также могут вставлять фиктивный код, который ничего не делает, кроме как сбивает с толку декомпилятор. В результате ваш исходный код выглядит как спагетти-код, что делает его более раздражающим для чтения.

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

Существует множество вариантов обфускаторов, хотя это будет зависеть от того, какой язык вы запутываете. Для .NET есть Obfuscar. Для Java есть ProGuard. Для JavaScript есть javascript-obfuscator.

Другие варианты: конвертировать в скомпилированный язык

Преобразование одного языка программирования в другой — не такая уж безумная идея: Unity использует IL2CPP, преобразователь, который преобразует код .NET в скомпилированный байт-код C++. Это намного более производительно, но также помогает защитить игры от легкого взлома, что имеет решающее значение в среде, страдающей от пиратства и читеров.

У Microsoft есть CoreRT, экспериментальная среда выполнения .NET Core, использующая компиляцию с опережением времени, хотя она еще не готова для использования в производственной среде.

Следует ли запутывать?

Если вы развертываете код в ненадежных средах, где хотите защитить свой исходный код, вам почти всегда следует использовать хотя бы базовый обфускатор для переименования функций, методов и свойств, чтобы декомпиляция требовала немного больше усилий.

Если вам на самом деле не нужно, чтобы кто-то мог декомпилировать ваше приложение, вы можете использовать более навязчивый обфускатор, но на самом деле вам следует подумать, не будет ли лучше решить проблему, переключившись на язык, в котором нет эта проблема, например, C++ или Rust.