img

Что такое обфускация кода? Как замаскировать свой код, чтобы его защитить

21 ноября
20:00
Бесплатный вебинар
Введение в Docker
Ведущий — Филипп Игнатенко.
Руководитель центра разработки
Записаться
img
img

 

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

И среднестатистический человек, который взаимодействовал с этим программным обеспечением, не представлял никакой угрозы. Большинство пользователей даже не утруждали бы себя, чтобы прочитать руководство пользователя, которое поставлялось вместе с ПО, не то чтобы искать уязвимости в коде. 

И вот, пришел Интернет и все изменил.

Практически сразу компьютерные сети стали обмениваться информацией. И с ростом сложности росли также шансы на то, что кто-то (кто по сути не должен этого делать) может проникнуть в эти сети. 

И, как правило эти «кто-то» обладали необходимыми навыками, которые позволяли им наживаться на уязвимом коде. 

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

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

И все же, в современных школах программирования по-прежнему не уделяют должного внимания усилению защиты программного кода. А при разработке современных приложений этот этап становится обязательным. 

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

Что такое обфускация кода?

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

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

Беда в том, что многие методы обфускации кода могут потреблять дополнительные ресурсы и, соответственно, увеличивать время выполнения программы. 

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

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

  1. Избавьтесь от избыточных данных

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

Таким образом вы сможете существенно упростить свою кодовую базу и сократите поверхность атаки, которую вы так усердно пытаетесь защитить. 

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

  1. Преобразуйте данные

Следующий шаг – преобразовать данные, которые обрабатывает ваш код, так, чтобы их нельзя было распознать. 

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

В частности, вы можете шифровать ваши строки для того, чтобы их невозможно было прочитать. Для этого можно использовать довольно простую кодировку base64. Эта кодировка превратит этот код:

String s = "Hello World";

вот в этот:

String s = new String(decryptString("SGVsbG8gV29ybGQ="));

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

А если вы добавите к этому методу какие-нибудь другие, также связанные с преобразованием данных, то это вполне может стать серьезной первой линией защиты. 

  1. Путайте порядок выполнения процесса

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

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

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

Давайте в качестве примера взглянем на следующий фрагмент кода. Он вычисляет сумму и среднее арифметическое 100 чисел.

int i=1, sum=0, avg=0
while (i = 100)
{
sum+=i;
avg=sum/i;
i++;
}int i=1, sum=0, avg=0
while (i = 100)
{
sum+=i;
avg=sum/i;
i++;
}

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

Давайте посмотрим на еще один фрагмент кода. В нем мы добавили условную переменную random, которая усложняет структуру кода. Таким образом, разобрать его будет куда сложнее.

int random = 1;
while (random != 0)
{
switch (random)
{
Case 1:
{
i=0; sum=1; avg=1;
random = 2;
break;
}
case 2:
{
if (i = 100)
random = 3;
else random = 0;
break;
}
case 3:
{
sum+=i;avg=sum/i ; i++;
random = 2;
break;
}
}
}
  1. Попробуйте скрыть информацию об отладке

Иногда особо решительно настроенные злоумышленники могут попытаться получить всякого рода полезную информацию из информации об отладке. 

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

Так что, по мере возможностей желательно закрыть доступ к информации об отладке. А если это невозможно, то скройте в отчете любые личные данные.

  1. Выбирайте адреса случайным образом

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

И это не просто проблема новичков. Примерно 70% уязвимостей в веб-браузере Google Chrome являются следствием ошибок памяти. 

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

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

Кроме того, это добавляет еще одно преимущество. Даже если ваш код был успешно взломан, воспроизвести его будет очень сложно (если не невозможно). Уже одно это может заставить злоумышленника задуматься о том, стоит ли ему тратить свое время на взлом вашего программного обеспечения. 

  1. Меняйте ваш замаскированный код

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

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

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

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

Безопасность через неясность

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

На практике ваш код не обязательно должен быть идеальным. Он просто должен быть достаточно сложным, чтобы никто в здравом уме не стал даже пытаться его взламывать. А для тех, кто не в своем уме, это просто должно быть очень сложным и времязатратным, чтобы вы могли удерживать их на расстоянии. 

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

Если вы работаете над чем-то очень важным, возможно, вам стоит применить все эти «неприятные сюрпризы». А если вы пишете генератор цитаты дня, то, пожалуй, и волноваться так сильно не стоит. 

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

Ссылка
скопирована
Получите бесплатные уроки на наших курсах
Все курсы
Кибербезопасность
Скидка 10%
Основы кибербезопасности
Стань специалистом по кибербезопасности, изучи хакерский майндсет и научись защищать свою инфраструктуру! Самые важные и актуальные знания, которые помогут не только войти в ИБ, но и понять реальное положение дел в индустрии
Получи бесплатный
вводный урок!
Пожалуйста, укажите корректный e-mail
отправили вводный урок на твой e-mail!
Получи все материалы в telegram и ускорь обучение!
img
Еще по теме:
img
Киберпреступность — это печальная реальность современности, затрагивающая как частных пользователей, так и бизнес. Ни одна компа
img
При передаче данных между системами крайне важно сохранять их целостность и конфиденциальность. Для этого существуют протоколы и
img
Основные тезисы: Шифрование – это крайне важная технология для информационной безопасности, которая обеспечивает конфиденциально
img
Испытание на возможность проникновения в систему – это критически важный компонент, который предоставляет отказоустойчивые техно
img
Распределенные атаки типа «отказ в обслуживании» (DDoS - Distributed Denial of Service) направлены на то, чтобы «отключить» орга
img
  На заре информационных технологий, у разработчиков не было никакой необходимости беспокоиться о сетях. Их главной задачей бы
21 ноября
20:00
Бесплатный вебинар
Введение в Docker