Преднамеренное создание сложного для понимания кода
В разработке программного обеспечения обфускация — это процесс создания исходного или машинного кода , который трудно понять людям или компьютерам. Подобно обфускации в естественном языке , она может использовать ненужные окольные выражения для составления утверждений. Программисты могут намеренно запутывать код, чтобы скрыть его цель ( безопасность через неясность ) или его логику или неявные значения, встроенные в него, в первую очередь, чтобы предотвратить несанкционированное вмешательство, предотвратить обратную разработку или даже создать головоломку или развлекательную задачу для того, кто читает исходный код. Это можно сделать вручную или с помощью автоматизированного инструмента, причем последний является предпочтительным методом в отрасли. [1]
Обзор
Архитектура и характеристики некоторых языков могут сделать их более запутанными, чем другие. [2] [3] C , [4] C++ , [5] [6] и язык программирования Perl [7] — вот некоторые примеры языков, которые легко запутать. Haskell также довольно запутан [8], несмотря на то, что он довольно сильно отличается по структуре.
Свойства, которые делают язык запутанным, не очевидны сразу.
Методы
К типам обфускации относятся простая замена ключевых слов, использование или неиспользование пробелов для создания художественных эффектов, а также самогенерирующиеся или сильно сжатые программы.
По словам Ника Монтфорта , методы могут включать:
- запутывание имен, которое включает присвоение переменным бессмысленных или вводящих в заблуждение имен;
- путаница с данными/кодом/комментариями, которая включает в себя создание некоторого фактического кода, выглядящего как комментарии, или путаницу с синтаксисом и данными;
- двойное кодирование, которое может отображать код в форме поэзии или интересных фигур. [9]
Автоматизированные инструменты
Существует множество инструментов для выполнения или помощи в обфускации кода. Они включают экспериментальные исследовательские инструменты, созданные учеными, инструменты для любителей, коммерческие продукты, написанные профессионалами, и программное обеспечение с открытым исходным кодом . Существуют также инструменты деобфускации, которые пытаются выполнить обратное преобразование.
Хотя большинство коммерческих решений для обфускации работают путем преобразования либо исходного кода программы, либо платформенно-независимого байт-кода, используемого в Java и .NET , существуют также некоторые, которые работают непосредственно со скомпилированными двоичными файлами.
- Некоторые примеры Python можно найти в официальном FAQ по программированию на Python и в других местах. [10] [11] [12]
- Компилятор movfuscator C для x86_32 ISA использует только инструкцию mov для обфускации. [13] [14] [15 ]
Рекреационный
Написание и чтение запутанного исходного кода может быть головоломкой . Ряд конкурсов по программированию награждают наиболее креативно запутанный код, например, Международный конкурс запутанного кода на C и Конкурс запутанного кода на Perl .
Короткие обфусцированные программы Perl могут использоваться в подписях программистов Perl. Это JAPHs (« Just another Perl hacker »). [16]
Криптографический
Криптографы исследовали идею запутывания кода, чтобы обратная разработка кода была криптографически трудной. Это формализовано во многих предложениях по неразличимости запутывания , криптографического примитива, который, если его можно построить безопасно, позволит построить много других видов криптографии, включая совершенно новые типы, которые никто не знает, как сделать. (Более сильное понятие, запутывание черного ящика , как известно, в общем случае невозможно.) [17] [18]
Недостатки обфускации
- Хотя обфускация может затруднить чтение, написание и обратную разработку программы и сделать это трудоемким процессом, она не обязательно сделает это невозможным. [19]
- Это увеличивает время и сложность процесса сборки для разработчиков.
- Это может существенно затруднить отладку после того, как программное обеспечение было запутано.
- После того, как код больше не поддерживается, любители могут захотеть поддерживать программу, добавлять моды или лучше ее понимать. Обфускация затрудняет для конечных пользователей выполнение полезных действий с кодом.
- Определенные виды обфускации (т. е. код, который не является просто локальным двоичным файлом и загружает мини-двоичные файлы с веб-сервера по мере необходимости) могут снизить производительность и/или потребовать подключения к Интернету.
Уведомление пользователей о запутанном коде
Некоторые антивирусные программы, такие как AVG AntiVirus [20], также предупреждают своих пользователей, когда они попадают на веб-сайт с кодом, который вручную запутан, поскольку одной из целей запутывания может быть сокрытие вредоносного кода. Однако некоторые разработчики могут использовать запутывание кода с целью уменьшения размера файла или повышения безопасности. Обычный пользователь может не ожидать, что их антивирусная программа будет выдавать оповещения о безвредном фрагменте кода, особенно от доверенных корпораций, поэтому такая функция может фактически отпугнуть пользователей от использования легитимного программного обеспечения.
Mozilla и Google запрещают размещать в своих магазинах дополнений расширения браузеров, содержащие запутанный код. [21] [22]
Запутывание и лицензии Copyleft
Были дебаты о том, является ли незаконным обходить лицензии на программное обеспечение с копилефтом , выпуская исходный код в запутанной форме, например, в случаях, когда автор менее склонен предоставлять исходный код. Проблема решается в GNU General Public License , требуя, чтобы «предпочтительная форма для внесения изменений» была доступна. [23] На веб-сайте GNU указано: «Запутанный „исходный код“ не является настоящим исходным кодом и не считается исходным кодом». [24]
Декомпиляторы
Декомпилятор может выполнить обратную разработку исходного кода из исполняемого файла или библиотеки. Декомпиляцию иногда называют атакой man-in-the-end (mite), основанной на традиционной криптографической атаке, известной как « man-in-the-middle ». Она передает исходный код в руки пользователя, хотя этот исходный код часто трудно читать. Исходный код, скорее всего, будет иметь случайные имена функций и переменных, неправильные типы переменных и использовать другую логику, чем исходный код (из-за оптимизаций компилятора).
Модель запутывания
Обфускация модели — это метод сокрытия внутренней структуры модели машинного обучения . [25] Обфускация превращает модель в черный ящик. Это противоречит объяснимому ИИ . Модели обфускации также можно применять к обучающим данным перед их подачей в модель для добавления случайного шума. Это скрывает конфиденциальную информацию о свойствах отдельных образцов и групп образцов. [26]
Смотрите также
Ссылки
- ^ "Что такое обфускация (obfu)? - Определение с сайта WhatIs.com". SearchSoftwareQuality . Архивировано из оригинала 2 февраля 2019 г. Получено 1 февраля 2019 г.
- ↑ Бинсток, Эндрю (6 марта 2003 г.). «Запутывание: сокрытие кода от любопытных глаз». Архивировано из оригинала 20 апреля 2008 г. Получено 25 ноября 2013 г.
- ↑ Этвуд, Джефф (15 мая 2005 г.). "Джефф Этвуд, 15 мая 2005 г.". Codinghorror.com. Архивировано из оригинала 9 января 2010 г. Получено 25 ноября 2013 г.
- ^ "Запутывание". Kenter.demon.nl. Архивировано из оригинала 4 марта 2016 года . Получено 25 ноября 2013 года .
- ^ "Учебники C++ – Запутанный код – Простое введение". DreamInCode.net. Архивировано из оригинала 28 июня 2008 г. Получено 25 ноября 2013 г.
{{cite web}}
: CS1 maint: неподходящий URL ( ссылка ) - ^ "C Tutorials – Obfuscated Code in C". 7 июля 2011 г. Архивировано из оригинала 27 декабря 2013 г. Получено 25 ноября 2013 г.
- ↑ По состоянию на 2013-11-25 18:22 GMT. «Pe(a)rls in line noise». Perlmonks.org. Архивировано из оригинала 16 января 2009 года . Получено 25 ноября 2013 года .
{{cite web}}
: CS1 maint: числовые имена: список авторов ( ссылка ) - ^ "Obfuscation – Haskell Wiki". 16 февраля 2006 г. Архивировано из оригинала 30 августа 2017 г. Получено 3 марта 2020 г.
- ^ Монфор, Ник. "Запутанный код" (PDF) . Архивировано из оригинала (PDF) 24 апреля 2019 г. . Получено 24 ноября 2017 г. .
- ^ Бен Куртович. «Запутывание «Hello world!»». benkurtovic.com . Архивировано из оригинала 14 сентября 2017 г. . Получено 18 октября 2017 г. .
- ^ "Obfuscated Python". wiki.c2.com . Архивировано из оригинала 14 февраля 2017 г. . Получено 18 октября 2017 г. .
- ^ "Первый ежегодный обфусцированный контент Python". code.activestate.com . Архивировано из оригинала 25 мая 2023 г. Получено 18 октября 2017 г.
- ^ domas (3 ноября 2022 г.), xoreaxeaxeax/movfuscator, заархивировано из оригинала 12 ноября 2022 г. , извлечено 5 ноября 2022 г.
- ^ Break Me00 The MoVfuscator Превращаем mov в душераздирающий кошмар RE Кристофер Домас, архивировано из оригинала 21 октября 2022 г. , извлечено 5 ноября 2022 г.
- ^ Уильямс, Эл (21 марта 2021 г.). «Одна инструкция, которая правит всеми: компилятор C выдает только MOV». Hackaday . Получено 23 октября 2023 г. .
- ^ "JAPH – Just Another Perl Hacker". pm.org . Perl Mongers. Архивировано из оригинала 16 мая 2013 г. Получено 27 февраля 2015 г.
- ^ "Прорыв в криптографии может сделать программное обеспечение невзламываемым". Wired . ISSN 1059-1028. Архивировано из оригинала 14 апреля 2022 г. Получено 14 марта 2021 г.
- ^ Джейн, Ааюш; Лин, Хуэйцзя ; Сахай, Амит (2020). «Неразличимость обфускации от обоснованных предположений». Архив Cryptology ePrint . arXiv : 2008.09317 . Архивировано из оригинала 3 марта 2022 г. Получено 14 марта 2021 г.
- ^ ""Can We Obfuscate Programs?" Боаз Барак". Math.ias.edu. Архивировано из оригинала 23 марта 2016 г. Получено 25 ноября 2013 г.
- ^ "Блокировка веб-сайта и единственный способ исправить это — отключить HTTPS-с... | AVG". support.avg.com . 21 июля 2020 г. Архивировано из оригинала 4 февраля 2022 г. Получено 4 февраля 2022 г.
- ^ в 05:01, Томас Клэберн в Сан-Франциско 2 октября 2018 г. «Google принимает меры против замаскированного кода в Chrome Web Store». www.theregister.co.uk . Архивировано из оригинала 12 ноября 2019 г. . Получено 12 ноября 2019 г. .
{{cite web}}
: CS1 maint: числовые имена: список авторов ( ссылка ) - ^ Cimpanu, Catalin. «Mozilla объявляет о запрете расширений Firefox, содержащих запутанный код». ZDNet . Архивировано из оригинала 5 марта 2020 г. Получено 12 ноября 2019 г.
- ^ "Обоснование формулировки "предпочтительной формы произведения для внесения в него изменений" в GPL". Lwn.net. Архивировано из оригинала 2 декабря 2013 г. Получено 25 ноября 2013 г.
- ^ "Что такое свободное программное обеспечение?". gnu.org. Архивировано из оригинала 14 октября 2013 г. Получено 18 декабря 2014 г.
- ^ Чжоу, Минъи; Гао, Сян; Ву, Цзин; Гранди, Джон К.; Чен, Сяо; Чен, Чуньян; Ли, Ли (2023). «Обфускация моделей для защиты развернутых нейронных сетей».
- ^ Чжан, Тяньвэй; Хэ, Цзэчэн; Ли, Руби Б. (12 июля 2018 г.). «Машинное обучение с сохранением конфиденциальности посредством запутывания данных». arXiv : 1807.01860 [cs.CR].
Дальнейшее чтение
- Сейедхамзех, Джавад, ABCME: новый метаморфический движок, 17-я Национальная компьютерная конференция, Технологический университет имени Шарифа, Тегеран, Иран, 2012.
- B. Barak, O. Goldreich, R. Impagliazzo, S. Rudich, A. Sahai, S. Vadhan и K. Yang. «О (не)возможности запутывания программ». 21-я ежегодная международная конференция по криптологии , Санта-Барбара, Калифорния, США. Springer Verlag LNCS Volume 2139, 2001.
- Матеас, Майкл; Ник Монтфорт. «A Box, Darkly: Obfuscation, Weird Languages, and Code Aesthetics» (PDF) . Труды 6-й конференции по цифровому искусству и культуре, ИТ-университет Копенгагена, 1–3 декабря 2005 г. . стр. 144–153. Архивировано (PDF) из оригинала 23 июня 2008 г. . Получено 28 июня 2008 г. .
Внешние ссылки
- Международный конкурс запутанного кода на языке C
- Защита кода Java посредством обфускации кода, ACM Crossroads, выпуск весна 1998 г.
- Можно ли скрыть программы?
- Юрий Лифшиц. Конспект лекций по теме «Запутывание программ» (весна 2005 г.)
- c2:BlackBoxВычисление