
В сегодняшнюю цифровую эпоху компьютерное программное обеспечение управляет всем и полностью укоренилось в нашем обществе. Невозможно никуда пойти или что-то сделать, не используя его. Это в наших карманах, в наших машинах, в наших телевизорах, в наших продуктовых магазинах, в наших больницах, в наших спортзалах, везде. Большая часть написанного программного обеспечения не была сделана бесплатно, и часто его производство очень дорого.
По данным PayScale, средняя зарплата разработчика программного обеспечения составляет 70 000 долларов в год [1]. Это только на одного человека. Нередко над одной командой разработчиков программного обеспечения работает 6–10 человек. Предполагаемый доход издателей программного обеспечения в США в 2018 году составил 257,94 миллиарда долларов [2]. Это большие деньги, и именно поэтому защита написанного программного обеспечения становится все более важной.

Однако есть одна серьезная проблема: можно извлечь исходный код для четырех из пяти самых популярных языков программирования, используемых в современном программном обеспечении [3]. Сюда входят такие языки, как Java (на котором написано большинство приложений для Android) и C# (популярный язык для приложений для Windows 10). Это можно сделать с помощью декомпилятора.
Декомпиляторы
При написании программного обеспечения разработчики создают файлы, похожие на текст. Проблема в том, что аппаратное обеспечение компьютеров не способно понять эти текстовые файлы, и их нужно сначала прогнать через компилятор. Это выводит то, что известно как машинный код (файл называется двоичным). Декомпилятор — это программное обеспечение, которое пытается получить выходные данные компилятора и воспроизвести исходные файлы.
Многие компании не реализуют никакой защиты от декомпиляторов при выпуске своего программного обеспечения. Многие из ранних языков программирования, такие как C, компилируют свои программы непосредственно в машинный код. Большим недостатком этого подхода является то, что не все компьютерное оборудование сделано одинаково. Это означает, что не все компьютеры способны понять один и тот же двоичный файл. Чтобы поддерживать пять разных типов компьютеров, компании пришлось бы производить и распространять пять разных двоичных файлов. Чтобы решить эту проблему, были созданы новые языки программирования, которые могли компилироваться в промежуточный язык. Затем появлялась другая программа, которая переводила этот промежуточный язык в машинный код локальной машины. Таким образом, компания могла создать один промежуточный двоичный файл, и этот единственный двоичный файл мог работать на любом компьютере, на котором был установлен этот транслятор. Недостатком этого является то, что в большинстве случаев промежуточный язык можно декодировать обратно во что-то похожее на исходный исходный код.

Два самых популярных языка в мире сегодня входят в число языков, которые делают это: Java и C#. Если злоумышленники смогут воссоздать исходные файлы, это может дать им возможность делать множество вещей, в том числе пытаться украсть проприетарные участки кода из программного обеспечения или злоупотреблять программным обеспечением способами, которые никогда не предполагались.
Программное обеспечение не всегда пишется хорошо или с учетом лучших практик, и код может включать информацию, которой не должно было быть в начале, например, имена пользователей и пароли для доступа к устройствам, например, к некоторым камерам безопасности [4]. Извлечение этих имен пользователей и паролей может быть очень простым с помощью декомпилятора.
Запутывание
Один из способов победить декомпиляторы — использовать обфускацию кода. Существует множество бесплатных и платных программ для запутывания кода, которые существуют почти для каждого языка программирования, и большинство из них относительно просты в использовании.
Идея обфускации кода состоит в том, чтобы сделать декомпилированный вывод чрезвычайно трудным для отслеживания и чтения. Существует много разных способов запутать программное обеспечение на разных уровнях, но некоторые из распространенных методов заключаются в удалении ценных метаданных, переименовании меток и функций, чтобы они не имели смысла, и даже в шифровании частей приложения. Этот процесс может быть выполнен непосредственно перед или после компиляции программного обеспечения. Это означает, что во многих ситуациях обфускация не окажет заметного влияния на разработчиков программного обеспечения.

Однако у запутывания есть некоторые недостатки. Одной из часто встречающихся проблем является обфускация, отрицательно влияющая на производительность программного обеспечения. Выполнение операций может занимать больше времени, или программное обеспечение может потреблять много ресурсов в зависимости от степени запутанности программного обеспечения. Еще одна проблема, которая может возникнуть, — это устранение неполадок в работе программного обеспечения. Обфускация может затруднить или сделать невозможным выполнение таких действий, как чтение трассировки стека из ошибок.
Заключение
Количество написанного программного обеспечения и доходы, которые оно приносит, будут только расти с течением времени. Для компаний и разработчиков программного обеспечения важно подумать о том, как они могут защитить как свое программное обеспечение, так и свою интеллектуальную собственность. Обфускация — лишь один из многих методов, которые могут сделать именно это.
Ссылки
- https://www.payscale.com/research/US/Job=Software_Developer/Salary
- https://www.statista.com/statistics/184124/estimated-revenue-of-us-software-publishers-since-2005/
- https://insights.stackoverflow.com/survey/2019#technology-_-programming-scripting-and-markup-languages
- https://arstechnica.com/information-technology/2017/06/internet-cameras-expose-private-video-feeds-and-remote-controls/