Руководство: обратный инжиниринг запутывания кода
Опубликовано: 2021-11-17Фигуры обфускации кода — один из самых популярных подходов к безопасности приложений для предотвращения взлома приложений. Это одно из наиболее часто предлагаемых усилий AppSec специалистами по безопасности во всем мире, и оно часто заботится о самых минимальных требованиях безопасности вашего приложения. Эта стратегия часто используется в качестве основного механизма защиты от попыток взлома и защищает от типичных угроз, таких как внедрение кода, реверс-инжиниринг и подделка личной информации клиентов и пользователей приложений.
Обфускация кода?
Практика запутывания исполняемых файлов, чтобы они перестали быть понятными, понятными или практичными, известна как запутывание кода. Исходный код был запутан до такой степени, что третьей стороне трудно понять его, не говоря уже о выполнении. Неясность не влияет на пользовательский интерфейс конечного пользователя или предполагаемый вывод кода. Это всего лишь предупредительный шаг, чтобы сделать код бесполезным для любого потенциального хакера, имеющего доступ к исполняемому коду программного обеспечения.
Зачем нужно запутывать код?
Обфускация кода особенно важна для программного обеспечения с открытым исходным кодом, у которого есть существенный недостаток с точки зрения возможности взлома для личной выгоды. Разработчики гарантируют, что интеллектуальная собственность их продукта защищена от угроз безопасности, несанкционированного доступа и обнаружения недостатков приложений, что затрудняет реинжиниринг программы.
Независимо от используемого метода сокрытия, этот подход ограничивает опасный исходный код и обеспечивает различные уровни безопасности программы. Время, стоимость и ресурсные причины способствуют отказу от вашего кода, когда он запутан, поскольку декомпилированный код становится неразборчивым.
Методы запутывания кода
Обфускация работает на разных уровнях: она может быть реализована на уровне семантической/лексической структуры кода или на уровне структуры данных/потока управления. Стратегии запутывания также различаются в зависимости от действия над кодом. По сути, команда безопасности определяет тип запутывания кода, который следует использовать в сотрудничестве с командой разработчиков.
Обфускация должна быть переименована.
Этот подход влечет за собой запутанные имена переменных, так что фактическая цель их использования искусно скрыта. Декомпиляторам трудно понять поток управления, поскольку методы и переменные переименовываются с использованием различных обозначений и номеров. Этот метод запутывания обычно используется для маскировки кода приложений платформы Java, .NET и Android. Это классифицируется как обфускация макета, поскольку оно направлено непосредственно на исходный код, чтобы обеспечить уровень защиты для приложения.
Обфускация данных
Этот метод фокусируется на структурах данных, используемых в коде, что делает невозможным для хакера доступ к истинной цели программы. Это может повлечь за собой изменение способа хранения данных в памяти программным обеспечением и того, как эти данные обрабатываются для получения конечного результата. Данную процедуру можно выполнить разными способами:
1. Обфускация агрегации
В результате этого меняется способ сохранения данных в программном обеспечении. Массивы, например, могут быть разделены на несколько подмассивов, на которые затем можно ссылаться во всей программе.
2. Обфускация хранения данных
Это влияет на способ хранения данных в памяти. Разработчики могут, например, переключаться между локальным и глобальным хранилищем переменных, чтобы скрыть истинную природу поведения переменных.
3. Получение обфускации по требованию
Этот подход изменяет порядок данных без изменения функциональности программы/фрагмента кода. Разработчики достигают этого, создавая отдельный модуль, который вызывается для каждого экземпляра ссылки на переменную.
4. Шифрование строк
Этот метод шифрует все читаемые строки, что приводит к неразборчивому коду. Когда программное обеспечение запускается, они должны быть расшифрованы во время выполнения.
5. Обфускация потока управления/кода
Способ, которым управление передается от одной части кодовой базы к другой, имеет решающее значение для определения цели программы. Запутывание этого потока часто является наиболее прибыльным способом извратить ход игры. Эта стратегия запутывания держит хакеров в страхе, затрудняя им понимание того, как и почему код следует определенному пути.
Включение случайных и неожиданных операторов, а также ненужных операторов переключения регистра (мертвый код), которые никогда не будут выполняться, является одним из наиболее распространенных способов реализации этой стратегии запутывания. У этих утверждений нет никакой другой функции, кроме как сбить с толку целевого хакера. В случае условной ориентации программы это изменение в последовательности операторов выполнения программы чрезвычайно полезно.

Обфускация отлаживается.
Отладочная информация часто бывает полезна для получения важной информации о ходе выполнения программы и дефектах путем декомпиляции и повторной компиляции исходного кода. Очень важно скрыть такие идентифицирующие данные, изменив их идентификаторы, номера строк или полностью отключив доступ к данным отладки.
Обфускация должна быть решена.
Ошибки программирования памяти стали широко распространены в атаках, особенно в языках, не безопасных для памяти, таких как C и C++. Недостатки безопасности часто вызваны такими ошибками, как неконтролируемый доступ к массиву. Подход с обфускацией адресов затрудняет обратный инжиниринг, поскольку виртуальные адреса кода и данных программы рандомизируются каждый раз, когда выполняется преобразованный код. В результате большинство атак с ошибками памяти являются недетерминированными, с очень низкой вероятностью успеха.
Персонализированное кодирование
Разработчики используют этот подход для шифрования строк с помощью специального алгоритма, а затем предоставляют функцию декодера для восстановления исходного кода.
Аргументы, передаваемые во время выполнения
Программу можно изменить так, чтобы она ожидала параметров во время выполнения. Чтобы расшифровать переменные, пользователь должен иметь как код, так и ключ дешифрования.
Чтобы разработать метод многоуровневой защиты для защиты приложений от различных угроз безопасности, команда безопасности может выбрать одновременное развертывание нескольких методов.
Вывод
Подводя итог, можно сказать, что неправильное направление само по себе неэффективно в борьбе с серьезными проблемами безопасности. Деобфусцировать код сложнее из-за наличия программного обеспечения ИИ и навыков хакеров, но это не невозможно. В результате криптография не является панацеей от всех проблем безопасности программного обеспечения.
Команда разработчиков может использовать различные подходы к запутыванию кода для защиты своего кода в ненадежной среде, в зависимости от требований безопасности, характера программы и эталонного показателя производительности. Их следует проводить, принимая во внимание преимущества и недостатки каждого подхода. Эта стратегия должна поддерживать другие инициативы AppSec, такие как шифрование, RASP, правила хранения данных и т. д. В сочетании с решениями RASP, такими как AppSealing, он становится мощным противоядием от сегодняшних проблем безопасности.