Обфусация кода, Защита от декомпиляции
Собственно, кто какие способы защиты от декомпиляции программы и кто какие способы обфуксации кода написанного на c# знает?
Отслеживать
9,644 4 4 золотых знака 35 35 серебряных знаков 72 72 бронзовых знака
задан 22 июл 2014 в 19:34
238 1 1 золотой знак 5 5 серебряных знаков 15 15 бронзовых знаков
интересно, а зачем?
22 июл 2014 в 19:39
есть такая программа, называется С++:)
22 июл 2014 в 19:40
Невозможно защитить программу написанную на .net, на все известные обфускаторы есть рефлеторы c плагинами, которые прекрасно деобфусцируют код. Единственный вариант защититься, выполнять всю логику в облаке и отправлять пользователю результат.
22 июл 2014 в 19:44
Подойдём с другой стороны: вы когда-нибудь пробовали разобраться в чужом сложном коде, написанном без комментариев и с нечитаемыми именами переменных? Это дико сложно, не говоря уж о поддержке такого кода (поищите по форуму, такие проблемы регулярно встречаются). А при декомпиляции вы получаете вариант не лучше: там такая вся программа. Украсть код, даже исходники, не даст ничего. Уводить надо команду разработчиков, кого-нибудь, кто понимает логику кода и знает, как с ней работать. Так что не парьтесь. Никому исходники не нужны.
22 июл 2014 в 20:18
Если вам правда нужна такая защита, то попробуйте вот что: Все названия переменных пишите задом наперёд: mSomeString -> gnirtSemoSm Строки конвертируйте в base64. В каждый метод пихайте аргумент, который не должен использоваться: void doiVemoS(String ataDdesU, int hrenZnaetZachemEto) И в середине метода, например, сделайте проверку: if (hrenZnaetZachemEto == 7) log(«0JLRiyDRgtGA0LDRgtC40YLQtSDQstGA0LXQvNGPINC30YDRjw==»); От такого кода у «хакера» на первых 50 строках отпадёт желание не только продолжать в этом разбираться, но и пользоваться вашей программой вообще.
22 июл 2014 в 21:32
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Но я вижу, что здесь только издеваются, так что, закройте кто-нибудь тему
@MadKeks никто над вами не издевается, не преувеличивайте. Дело в том, что необходимость в обфускации программ на C# сама по себе довольно сомнительна — очень существенная часть C# кода — это веб-приложения, веб-сервисы и прочий код, который работает на сервере, а следовательно, конечный пользователь его не видит и покопаться в нем не сможет даже с помощью ildasm’a или Reflector’a. Большая часть оставшегося софта — это программы, используемые очень ограниченным кругом лиц (внутрикорпоративные десктоп-приложения например), а следовательно, никому не придет в голову воровать их исходный код, не представляющий особой ценности. К примеру, на своей первой работе я получил в сопровождение кучу адского говнокода, нарушающего все возможные и невозможные каноны чистоты кода и в каккой-то степени благодаря этому уже являвшийся обфусцированным (справедливости ради, мои навыки на тот момент как раз того и стоили — из под моих пальцев вытекал точно такой же кривой говнокод). Так вот что тогда, что сейчас я бы не только не стал этот код воровать с помощью декомпиляции, я бы не стал брать его даже даром из исходников.
В подобной защите, вероятно, нуждается серьезное проприетарное ПО, скажем, какой-нибудь Photoshop, но оно на C# обычно не пишется.
Учитывая, что исходники практически на все случаи жизни можно отыскать на всяческих гитхабах и битбакетах, пляски с бубном для получения исходников становятся еще более сомнительными.
Стоит также отметить вот что: на моей памяти 99% процентов случаев, когда программист волновался по этому поводу сводились к тому, что это был юный и неопытный разработчик, искренне уверенный в том, что его хелловорлды способны потрясти мир и произвести революцию в области софта, а потому срочно нуждаются в защите и сокрытии своих исходников. По мере профессионального взросления у них это обычно проходило.
Впрочем, при желании материалов на эту тему можно найти достаточно. Например вот и вот
UPD
Стоит кстати заметить, что обфускация во многом зависит от средств конкретного языка
Статья NETрогай! Как защитить программу от лишних глаз.
Введение
Со времен появления первых программ и компьютеров, людям не раз приходилось сталкиваться со множеством проблем. Одна из них появилась еще в период создания коммерческого ПО. Мало кто горит желанием платить за использование софта. В связи с этим сейчас нам очень знакомо слово — пиратство. Хакеры каждый день вскрывают множество утилит и выпускают их крякнутые версии в открытый доступ. Поэтому сегодня я расскажу тебе, как с этим бороться.
- Spices.Net
- Smart Assembly
- NET Reactor
Программа для тестов
Чтобы что-то защищать нужно что-то создать. Я не стал далеко ходить и написал самую простую утилиту с большой, красной кнопкой. При нажатии на нее операционная система выходит из строя. Поэтому если какой-то любопытный пользователь захочет ее вскрыть мы этого не позволим. Открываем Visual Studio и выбираем проект Windows Forms.
Возможность создать интерфейс я предоставляю тебе. Дай волю фантазии и создай свой графический интерфейс с одной единственной красной кнопкой. Далее тебе потребуется открыть скрипт основного окна и записать туда такой короткий код:
[DllImport("ntdll.dll", SetLastError = true)] private static extern int NtSetInformationProcess(IntPtr hProcess, int processInformationClass, ref int processInformation, int processInformationLength); private void Click_Button(object sender, EventArgs e) < int isCritical = 1; // 1 int BreakOnTermination = 0x1D; // 2 Process.EnterDebugMode(); // 3 // 4 NtSetInformationProcess(Process.GetCurrentProcess().Handle, BreakOnTermination, ref isCritical, sizeof(int)); >
В первом мы создаем критический процесс и присвоим ее значение 1. Ниже задаем значение для флага BreakOnTermination в шестнадцатиричной системе счисления. После делаем запрос отладочных привилегий в строчке 3 и после присваиваем нашему флагу значение один. Все это дело происходит под четвертым комментарием.
Сохраняем результат и собираем проект. Только не думай нажимать на эту кнопку! Иначе придется перезагружать систему, а это сейчас будет лишним действием. Давай загрузим PE-файл в DiE и убедимся, что все работает корректно.
Библиотека никуда не пропала как и линковщик. Все строки хорошо просматриваются, а энтропия остается на статусе в 68%. Значит ничего не зашифровано и мы можем спокойно работать с софтом. Если ты до сих пор не понял, где хранится твой PE-файл из проекта, то загляни в папку bin и там же перейди на Debug. Ну а теперь стоит приступить к защите.
Как работает защита
Для начала предлагаю ознакомиться с теоретической частью нашей статьи. Прежде всего существует два типа защиты NET приложений. Это использование обфускаторов и протекторов. Разберем их плюсы и минусы работы.
- Плюсы: ограничение прав сборки в оперативной памяти с последующим сохранением на диске. Достаточно разнообразный набор функций для защиты.
- Минусы: конфликты с разрядностью системы. Проще говоря ты не можешь создать 64 битную и 32 битную программу одновременно. Яркая и очень хорошо выраженная реакция антивирусов на протекторы. Из-за нее многие пользователи просто боятся использовать такой продукт. К этому добавляется заявление производителей, которые рекомендуют обфуцировать код перед тем, как покрывать его протектором. То есть они сами признают минус своих детищ.
- Плюсы: независимость от каких-либо программ. Простота и надежность в работе, что дает гарантию запуска кода. Также это считается нестандартным подходом к защите софта.
- Минусы: здесь есть один жирный минус. Заключается он в том, что на родном языке чтение кода почти невозможно, но дизассемблировать программу и узнать ее алгоритм работы по прежнему остается реальным.
Spices.Net
Spices.Net — инструментальное средство следующего поколения для .Net разработчиков, которое содержит функции защиты .NET кода и множество других возможностей. Программа состоит из ядра системы и 2-х внешних модулей Spices.Obfuscator и Spices.Decompiler. Spices.Decompiler содержит функции декомпилирования для 6 языков IL, C#, C++, VB.Net, J#. В ближайшем будущем в программе появятся новые дополнения, Spices.Investigator (.Net PE metadata browser) и Spices.Informer. Как ты понимаешь по мимо защиты он умеет и декомпилировать некоторые программы. Но наша задача защитить исходный код, чтобы до него не мог добраться пользователь. Поэтому чтобы это сделать открываем нашу программу во вкладке File и далее переходим на Tools, кликаем по кнопке Obfuscate! и ждем результата. В итоге у тебя должен появиться файл и папка Output, где лежит готовая работа.
Теперь давай посмотрим, что у нас получилось. Первым делом заливаем все это в наш любимый DiE.
Как ты видишь понятие протектора или обфускатора в логах у нас не висит, а это уже хороший плюс в копилку. Глянем вкладку строк и посмотрим, что там изменилось. Изменения появились, хоть и не сильно заметные, но расположение строк явно говорят о наличие какой-то внешней защиты. В энтропии у нас все по стандарту, цифры не поменялись и стабильно держат планку на 63%. Давай копнем чуть глубже и посмотрим результат в dotPeek, он точно должен определить подвох.
А его тут нету. Весь код спокойно читается и никакой обфускации не произошло. В строках DiE мы видели все те же строки, но в другом формате. И выходит, что Spices.Net только на словах защищает код. А вот кстати та самая функция, которая вызывает синий экран смерти путем создания критического процесса. При декомпиляции она выглядит таким образом:
[DllImport("ntdll.dll", EntryPoint = "NtSetInformationProcess", SetLastError = true)] private static extern int \u0030(IntPtr _param0, int _param1, ref int _param2, int _param3); private void \u0030(object _param1, EventArgs _param2)
Поэтому здесь мы разобрались с тем, что не весь софт умеет адекватно выполнять свою работу. Сразу занесем название утилиты в черный список, чтобы в дальнейшем не натыкаться на нее. Это кстати объясняет почему при статическом анализе из скриншота не было видно строчки протектора.
Smart Assembly
SmartAssembly – это программное обеспечения представляет собой NET-обфускатор и систему составления автоматических отчетов об обнаруженных ошибках и использовании возможностей приложений. С помощью этого решения NET-разработчики могут создавать высококачественные и свободные от багов продукты. Из особенностей могу отметить наличие множества функций для настройки обфускации, ну а из минусов то, что программа является платной и имеет только пробную версию. Поэтому некоторые функции будут для нас закрыты.
Первым делом нас встречает окно с просьбой загрузить исполняемый файл. Берем в руки нашу программу и выгружаем ее в приложение. Далее настраиваем обфускацию из предложенных функций. Нам доступно создание отчетов, создание сложного ключа, автоматическая отправка ошибок, удаление ненужных строк, настройка уровня обфускации и настройка динамического прокси. Ставим все по хардкору и компилируем наш софт, попутно молясь, что все сработает. Ну а если ты хочешь знать, что конкретно я использовал, то выставляй в настройках следующие функции: Obfuscation (3 level), Compression and Encryption, Strings Encoding, MSIL Disassembelr Protection. Ждем несколько минут и радуемся успешной сборке. Переходим в DiE и смотрим изменения.
Строки зашифрованы, а энтропия подскочила до 77%. Поэтому сказать, что нет изменений очевидно нельзя. Вместо обфускатора у нас в колонке отображается протектор, хотя на самом деле это не так. В скором времени ты поймешь почему. Теперь давай откроем dotPeek и взглянем на то, как выглядит наш код. А он очень сильно изменился.
Переходим в тот же файл MainWindow.cs и смотрим нашу часть кода, которая отвечает за главное действие программы. Теперь все это дело выглядит так:
[DllImport("ntdll.dll", SetLastError = true)] private static extern int NtSetInformationProcess( IntPtr hProcess, int processInformationClass, ref int processInformation, int processInformationLength); private void Click_Button(object sender, EventArgs e)
Теперь как ты понимаешь разобрать название переменных и большую часть кода стало невозможно. К этому добавляется несколько пустых функций в начале нашего файла. Есть также дополнительные модули, которые помогают запутать код и сбить с пути реверсера. Как я говорил ранее, если в dotPeek это прочитать невозможно, то в дизассемблерах все легко читается и понять как работает программа вполне возможно. Возьми тот же x64dbg и попробуй залить бинарник с обфускацией. Разница конечно будет, но не такая яркая как в нашем случаи. Поэтому давай теперь попробуем запутать в принципе все, что только можно и покроем нашу программу протектором.
NET Reactor
NET Reactor — это мощная система защиты и лицензирования NET-кода, которая помогает разработчикам в защите своего NET программного обеспечения простым и безопасным способом. Работать мы будем на крякнутой версии этого протектора. У тебя скорее всего возник вопрос, а почему бы не использовать официальную версию? Здесь все очень просто. В отличие от предыдущих программ, которые яростно требуют чтобы их купили реактор просто при каждой компиляции добавляет диалоговое окно в код с названием протектора. То есть перед запуском самой программы у тебя вылезет маленькое рекламное окошко с названием NET Reactor. Гениальный как по мне ход.
Запускаем наш протектор и выбираем создание нового проекта. Далее заливаем туда файл и выбираем нужные функции, их ты можешь увидеть на скриншоте. Чтобы не устраивать танцы с бубном я отметил тот тип защиты, который применяется наиболее чаще в защите. Так мы создаем гарантию того, что итоговый проект запустится. После всех манипуляций кликаешь на кнопочку Protect и терпеливо ждешь результата. Дождался? Заливаем все это дело в DiE и смотрим, что получилось в итоге.
В столбце наш протектор никак не отображается. Неужели ничего не поменялось? Заглянем в энтропию и посмотрим на статус. 71%, а это значит, что файл чем-то покрыт. Открывай строки, здесь посмотри внимательно на некоторые команды, увидел? Некоторые из них просто зашифрованы. А это значит, что пора смотреть, что под капотом. На удивление та же ситуация. Все функции имеют непонятный вид, а наша команда вызова синего экрана смерти вообще как-то странно выглядит:
[DllImport("ntdll.dll", EntryPoint = "NtSetInformationProcess", SetLastError = true)] private static extern int v5LKivyS4(IntPtr _param0, int _param1, ref int _param2, int _param3); private void txK5sHCkH(object _param1, EventArgs _param2)
Можно только сказать, что протектор справился на ура! Теперь наш код полностью защищен от пиратов, жаждущих вечно что-то сломать и вскрыть. По мимо этого все функции не отображаются в правильном названии и имеют совершенно другой вид. Поэтому кому-то другому будет очень тяжело ориентироваться в этой паутине. Задача выполнена, поэтому можем спокойно переходить к итогам статьи.
Подводим итоги
Итак, сегодня я рассказал тебе о трех утилитах, которые помогут тебе скрыть свой код от пользователей. К сожалению одна из них отказалась работать и от обфускации осталось лишь одно слово. Но это только подтверждает факт того, что не любая программа способна защитить софт. Что лучше использовать в работе решать тебе. Лично я отдаю свой голос в пользу NET Reactor, так как в работе это незаменимый софт. Но не стоит забывать про его конкурента Smart Assembly, ведь он тоже имеет место быть. Хоть и есть в нем минус, который выражается в отсутствии адекватной бесплатной версии.
Защита исходного кода, исполняемых файлов, обфускация C++ и .Net-приложений
Исходный код приложения – это основной актив разработчика ПО. На написание кода уходит львиная доля времени и средств. Именно поэтому злоумышленники, а также конкуренты не преминут воспользоваться результатами вашего труда в случае ненадлежащего отношения к защите исходного кода.
Кроме того, защита кода не позволит злоумышленникам выделить фрагменты, ответственные за обмен ключами (DRM), а также внедрить в вашу программную среду вредоносное ПО.
В основе решений лежат технологии StarForce для защиты кода приложений:
| Преобразование кода С++ и .Net в код виртуальной машины. |
| Шифрование строк и массивов. |
| Преобразование кода в цифровой автомат. |
| Введение ложных связей. |
| Объединение участков кода и т.д. |
Перевод скомпилированного кода в инструкции виртуальной машины StarForce позволяет значительно затруднить анализ и модификацию кода программы злоумышленником.
Обфускация графа алгоритма программы С++ и .Net, позволяет затруднить понимание функционирования алгоритмов программы.
Для усложнения анализа и реверс-инжиниринга в продуктах StarForce применяются собственный язык программирования StarForce P-code и собственный компилятор StarForce Compiler.
В целях надежной защиты кода приложений компанией StarForce были разработаны два решения – StarForce Crypto и StarForce C++ Obfuscator.
Защита бинарного кода программ для Windows
Продукт: StarForce Crypto
Решение обеспечивает защиту исполняемого кода от анализа и модификации Windows-приложений, а также сокрытие / защиту от подмены любых неизменяемых файлов данных приложения.
StarForce Crypto рекомендуется для защиты Windows-приложений, которые могут распространяться на CD/DVD-дисках, USB-накопителях и через интернет, в том числе через Steam от анализа, взлома, модификации и реверс-инжиниринга.
Продукт защищает участки кода и данные, которые представляют собой интеллектуальную ценность и которые критично защищать с точки зрения бизнеса. StarForce Crypto обеспечивает надежную защиту кода, исключая возможные способы понимания логики работы приложения.
Решение поддерживает защиту бинарных (скомпилированных) исполняемых файлов и read-only данных и совместим с аппаратными платформами x8632 и x8664.
StarForce Crypto устанавливается через интернет в любом месте и в любое удобное для разработчика время.
Существует возможность усилить защиту путем внедрения технологии привязки защищенного приложения к оптическому носителю, персональному компьютеру или серверу, используя другие продукты StarForce.
Защита исходного кода программ для всех операционных систем
(Windows, macOS, iOS, Android)
Продукт: StarForce C++ Obfuscator
Решение предназначено для обфускации (преобразования) исходных текстов программ (кода), написанных на языках C и C++ для любых операционных систем.
StarForce C++ Obfuscator используется для защиты программного обеспечения, к которому предъявляются повышенные требования по взломостойкости, например, защита ключей DRM или других данных, потеря которых может негативно отразиться как на доходах разработчика ПО, так и прибыли компании-заказчика данного ПО. Защита исходного кода помогает решить эту проблему
В отличие от StarForce Crypto данное решение поддерживает защиту программного обеспечения, написанного под любую операционную систему (Windows, macOS, iOS, Android), а также совместим со всеми аппаратными платформами (процессорами), что делает этот продукт кросс-платформенным.
Главной особенностью продукта является поддержка более чем 30 методов обфускации кода, которые можно включать и выключать независимо друг от друга, и их тонкой настройки.
Основные методы обфускации в StarForce C++ Obfuscator
| Маскировка обращения к переменным. | Перемешивание графа исполнения кода. |
| Внедрение фиктивных узлов в граф исполнения. | Дублирование ветвей графа. |
| Динамическое ветвление графа. |
Дополнительные методы
StarForce Obfuscator C++ является отдельным приложением, которое устанавливается на стороне заказчика. Это эксклюзивный продукт компании StarForce по защите исходного кода, содержащий уникальные обфусцирующие алгоритмы.
Данный продукт является одним из лучших на рынке обфускаторов, благодаря использованию большого ассортимента методов защиты кода и многолетней работе без компрометации.
Обфускация кода — что, как и зачем

В наше время компьютерные системы и программы играют важнейшую роль в жизни организаций. Поэтому безопасность и надежность программного обеспечения является критически важным фактором для всех, кто использует их. Однако при получении исходного кода существует риск кражи конфиденциальная информация, алгоритмы работы или могут быть сделаны иные действия, приносящие ущерб компании или пользователям.
Для защиты от таких угроз существуют различные методы, одним из которых является обфускация кода. Обфускация кода — это процесс приведения исходного кода программы к виду, сохраняющему исходную функциональность, но затрудняющему анализ, понимание алгоритмов работы и модификацию при декомпиляции. Этот процесс используется в случаях, когда исходный код программы содержит конфиденциальную информацию, а также злоумышленниками, которые хотят скрыть свои злонамеренные действия от антивирусных программ.
Чтобы понять всю суть обфускации рассмотрим следующие вопросы:
Зачем нужна обфускация?
Как обфускация работает?
Алгоритмы обфускации
Виды обфускации
Проблемы и недостатки обфускации
Используют ли обфускацию сейчас?
Обфускация вирусописателей
Другие способы защиты
Зачем нужна обфускация?
Сначала разберёмся, что такое reverse engineering.
Реверсивная инженерия (reverse engineering) — изучение того, как устроено какое-то программное обеспечение, с целью понять механизм его работы. С помощью реверсивной инженерии можно, например, сделать кряк на лицензионную программу, наверно, самым востребованным для поиска кряков является виндоус. Именно поэтому разработчики, которые бояться за безопасность своих программ, стараются различными методами защититься от реверсивной инженерии.
Обфускация является одним из методов защиты от реверсивной инженерии. Обфусцировать можно не только скомпилированную программу, но и исходный код, что актуально для скриптовых языков. Для обфускации кода используют специальные программы – обфускаторы. Данный метод защиты создает лишние инструкции, запутывает, добавляет ложные зависимости в коде, тем самым делая код сложнее для анализа и реверса, однако это замедляет программу.
Как обфускация работает?
Методов обфускации несколько, но в общем все они нацелены на то, чтобы после проведения обфускации код не был понятен. Руками заниматься обфускацией крайне неэффективно для хоть сколь-нибудь больших проектов, поэтому используют обфускаторы, которые могут повредить исходный код, а кроме этого существуют деобфускаторы, которые нацелены на приведение обфусцированного кода к исходному. Но минусы мы рассмотрим позже.
В теории должно получиться так, чтобы после обфускации получился код, который работает корректно, но при его изучении нельзя было получить полезную информацию. На практике же это невозможно. Любую защиту можно обойти. Обфускация лишь предполагает, что обход займёт нецелесообразное количество времени.
На реальном примере обфускация может выглядеть как-то так:
a = 'a' _b = 'b' def foo(): print(a) def _bar(): print(_b) foo() # func foo _bar()
O00O0O0 ='a'; _OO00000O00O0O0O0O ='b'; def foo ():print (O00O0O0 ) def _O000000O00OOO0OO0 ():print (_OO00000O00O0O0O0O ) foo () _O000000O00OOO0OO0 ()
Мощные обфускаторы упаковывают код в более сложные конструкции.
Алгоритмы обфускации
Существует большое количество алгоритмов работы обфускаторов, однако большинство из них базируются на двух основополагающих алгоритмах:
- Алгоритм Колберга;
- Алгоритм Chenxi Wang’s.
Виды обфускации
Наиболее известными и частыми являются следующие виды обфускации:
- Лексическая обфускация
Это самый простой вид обфускации, при котором происходит:- удаление комментариев или замена их на бессмысленные
- удаление символов форматирования кода
- замена имён на трудно воспринимаемые (часто очень похожие последовательности нулей и букв О, единиц и букв I и тд)
- изменение расположение частей программы
- добавление лишних операций, которые не повлияют на итоговый результат выполнения
- Обфускация структур данных
Преобразования данного вида связаны с трансформацией структур данных. Существует следующие методы преобразования данных:- обфускация хранения
Обфускация хранения предполагает создание и использование нетривиальных типов данных, замена существующих типов данных и т.п.
Используются следующие методы: разделение одной переменной на комбинацию переменных, преобразование статистических данных в процедурные, изменение области действия переменной, изменение интерпретации данных - обфускация соединения
Обфускация соединения состоит в соединении нескольких зависимых данных или разделении независимых данных. Так, например, массив можно разделить на несколько или наоборот несколько массивов соединить в один. - обфускация переупорядочивания
Обфускация переупорядочивания включает в себя изменение порядка объявления переменных или функций, изменение внутреннего порядка структур данных.
- вставка функций (вставка тела функции вместо вызова функции)
- извлечение функции (выделение участка кода в отдельную функцию)
- распараллеливание кода в тех участках, где это возможно осуществить
- добавление «мёртвого» кода
- добавление недостижимого кода
- добавление избыточного кода
- устранение библиотечных вызовов
- преобразование графа потока управления
- клонирование функций
- объединение функций
- реструктуризация циклов
- расширение области действия переменной
- переупорядочивание циклов, выражений, условных и безусловных переходов, вызовов функций.
Проблемы и недостатки обфускации
- Скорость работы программы
Так как обфускация может нагружать программу, то после проведения обфускации может получиться, что скорость работы пострадала. А если использовать методы, которые, например, только переименовывают переменные, то никакой защиты не получится. - Некорректность работы программы после обфускации
В попытках защитить программу можно наделать критических ошибок, которые приведут к неправильной работе программы. Можно элементарно забыть переименовать переменную или при использовании обфускатора не знать алгоритм его работы и запустить на коде, который несовместим с обфускатором. После этого на определения проблем может уйти много времени. - Использование деобфускаторов
Деобфускатор — это программа, которая даёт возможность получить из запутанного кода читаемый код. Например, достаточно известная программаde4dot. Особенно хорошо такие программы работают при обфускации через бесплатные и популярные обфускаторы.
Используют ли обфускацию сейчас?
Этот подход был весьма популярен в прошлом, но сейчас интерес к нему снизился.
Во-первых, у разработчиков появилась возможность использовать более сложные методы защиты.
Во-вторых, обфускация может привести к неожиданным проблемам. Например, если обфускация была сделана неправильно, это может привести к неработоспособности программы. Кроме того, обфускация усложняет отладку и тестирование, что может замедлить разработку и повысить ее стоимость.
В-третьих, надеяться, что код спасёт лабиринт обфускации не стоит. Один из интересных способов обфускации был реализован компанией Dropbox. Способ заключался в том, что их код был написан на Python, но скомпилирован кастомным компилятором. Однако и на такой способ нашлась разгадка.
Несмотря на это, некоторые разработчики все еще используют обфускацию для защиты своих программ. Но зачастую обфускация кода — это всего лишь дополнительный инструмент для защиты кода от постороннего несанкционированного вмешательства. Как единственный инструмент защиты данный процесс не имеет особого смысла. Хотя в работе с другими инструментами защиты он снижает вероятность изучения исходного кода программы.
Обфускация вирусописателей
Кроме защиты кода от злоумышленников обфускация помогает и вредоносным программам замаскироваться.
Вирусописатели используют обфускацию кода, чтобы скрыть свои вредоносные программы от антивирусных программ и обходить системы безопасности. Этот метод позволяет им изменить код вредоносного программного обеспечения таким образом, чтобы он не совпадал с оригинальным кодом и не был распознан антивирусным программным обеспечением.
В качестве примера можно привести вредоносную программу, которая осуществляет утечку данных. Для того, чтобы избежать обнаружения и блокировки антивирусным ПО, вирусописатель может применить обфускацию кода. Это позволит ему изменить код таким образом, чтобы он не соответствовал типичным образцам, которые используются антивирусными программами для определения вредоносных программ.
Также обфускация кода может использоваться для скрытия секретной информации, такой как пароли и ключи, которые могут быть использованы для взлома системы. В этом случае, вирусописатель может использовать обфускацию кода для того, чтобы закодировать эту информацию и скрыть ее от детектирования антивирусных программ.
Из-за этого некоторые антивирусы начали реагировать на обычные программы, если в них использовалась обфускация. Но разработчики защитных программ, хорошо знают все эти методики уже давно и сейчас успешно определяют такие угрозы.
Другие способы защиты
- Создание зависимостей между протектором и основным кодом.
Нужно написать код таким образом, чтобы от наличия протектора зависела дальнейшая работа ПО. В протекторе могут, например, храниться какие-то значения переменных, которые в свою очередь будут получаться из сети интернет.
Но, используя этот метод, необходимо защитить от отладчика. Да и в целом от отладчика стоит защищаться всегда.
- Виртуализация нативного кода.
Вместо обфускации может использоваться более надёжная мутация — виртуализация. При виртуализации код будет исполняться на виртуальной машине. Но этот способ съедает производительность в разы, поэтому необходимо создать протектор, который будет исполняться на виртуальной машине, чтобы производительность основной программы не пострадала.
Почти все популярные приложения для телефонов и компьютеров, которые не требуют сверхбольшой производительности, используют клиент-серверную архитектуру. При таком подходе пользователь не видит всю логику обработки данных, а только получает визуальное отображение. Такая логика перешла из сайтов, так как помимо защищённости очень удобно переносить приложение на другие операционные системы.
Минус такого подхода очевиден — сильное взаимодействие с интернетом, поэтому не для всех это подойдёт.
- Электронная подпись.
Метод довольно простой. Необходимо вставить в приложение код, который будет получать хеш ключа текущей цифровой подписи пакета и сравнивать его с ранее сохраненным. Совпадают — приложение не было перепаковано (и взломано), нет — значит было. Однако код такой подписи взломщик может просто вырезать.
- Частые обновления.
Скорее не способ, а просто рекомендация. Ведь при обновлении взломщику скорее всего нужно будет снова мучаться. Но не стоит обновлять каждый день в надежде, что это поможет, потому что и с этим можно справиться. Так, разработчики игры PUBG для защиты от читеров выпускали микрообновления каждый день, чтобы разработчики читов не успевали адаптировать свой софт. В начале это действительно помогло, но через непродолжительное время эти обновления стали бесполезными.
Заключение
Создать на 100% защищенное приложение не получится, можно даже не пытаться. Не существует метода абсолютной защиты, любую защиту можно обойти. В таком случае главная цель защиты — сделать так, чтобы для взлома понадобилось больше времени, чем для выхода обновления. В таком случае программа может считаться хорошо защищённой.
Главное понимать, какие убытки потенциально принесёт получение исходного кода. И исходя из этого решать насколько защищённое приложение необходимо создавать и какие способы стоит выбирать.
Хоть приложение рано или поздно взломают есть очень простые способы существенно усложнить жизнь среднестатистическому ревёрсеру, а самому не тратить существенного количество времени.
Источники информации
- https://ru.wikipedia.org/wiki/Обфускация(программное_обеспечение)
- https://elib.pnzgu.ru/files/eb/doc/MIExqoevWhxW.pdf
- https://habr.com/ru/articles/533954/
- https://habr.com/ru/articles/255871/
- https://neolurk.org/wiki/Reverse_Engineering/Полная_версия
- https://itnan.ru/post.php?c=1&p=534076
- https://thecode.media/obscurity/
- https://www.usenix.org/system/files/conference/woot13/woot13-kholia.pdf
- https://habr.com/ru/articles/452276/
- https://codernet.ru/articles/security/obfuskacziya_i_deobfuskacziya_koda_vsyo_pro_etot_metod_zashhityi_po/
- https://xakep.ru/2016/12/26/android-reverse-debug-security/#toc02
- https://teletype.in/@it_ha/SyqfW2a0N
- http://citforum.ru/security/articles/obfus/
- https://sharcus.blogspot.com/2011/06/blog-post.html
- https://habr.com/ru/articles/533578/#4
- https://codernet.ru/articles/security/obfuskacziya_i_deobfuskacziya_koda_vsyo_pro_etot_metod_zashhityi_po/
- https://sccs.intelgr.com/archive/2016-03/11-Makarenko.pdf
- обфускация хранения