Диплом: Алгоритмы упаковки и шифрования исполняемого кода

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
12
атакуют не успевших вовремя обновиться пользователей [3]. Эти две ситуации
связывает одна фундаментальная проблема, а именно: написанная человеком
программа может быть человеком же и понята, проанализирована, разобрана.
Алгоритм, который бы мог до неузнаваемости, необратимо переделать программу,
сохраняя ее функциональность, называется «обфусцирующий» или «обфускатор».
В распоряжении разработчиков на данный момент не существует хороших
обфускаторов, а те обфускаторы, которые широко используются сегодня, весьма
примитивны — они могут переставлять инструкции, заменять имена переменных,
вставлять куски кода, которые не имеют никакого эффекта или никогда не
вызываются, и делать аналогичные вещи, которые в целом можно назвать “Security
through obscurity” («безопасность через непонятность»). Но такие преобразования
при небольшом усердии легко обратить, а потому это не преграда для хороших
хакеров.
1.2. Основные цели использования алгоритмов упаковки и
шифрования на разных платформах
1.2.1. Мобильные устройства
На мобильных устройствах сжатие исполняемых файлов особенно актуально:
небольшой объем памяти дисковой и оперативной, специфика техники, желание
иметь приложения на все случаи жизни. Рассмотрим две самые популярные
мобильные операционные системы: Android и iOS.
Все приложения для платформы Android представляют собой APK-файлы
(Android Package Kit) архивные исполняемые файлы-приложения. Чтобы создать
APK-файл, программу для Android сначала компилируют, а потом все ее части
архивируют в один файл-контейнер в формате, похожем на zip, но основанном на
JAR (Java ARchive) с расширением .apk [4]. Структура архива отображена на Рис. 1
13
Рис. 1. Структура архивного файла Android-приложения
Каждое приложение Android, установленное на устройстве, работает в
собственной "песочнице" (изолированной программной среде) [5]:
Application
AndroidManifest.xml
META-INF
// данные о
подписи
CERT.RSA
CERT.SF
MANIFEST.MF
classes.dex
// java-
байткод,
сгенерированный
в результате
компиляции
res
// файлы
ресурсов
drawable icon.png
layout main.xml
resources.arsc
14
операционная система Android представляет собой
многопользовательскую систему Linux, в которой каждое приложение
является отдельным пользователем;
по умолчанию система назначает каждому приложению уникальный
идентификатор пользователя Linux (этот идентификатор используется
только системой и неизвестен приложению); система устанавливает
полномочия для всех файлов в приложении, с тем чтобы доступ к ним был
разрешен только пользователю с идентификатором, назначенным этому
приложению;
у каждого процесса имеется собственная виртуальная машина (ВМ), так
что код приложения выполняется изолированно от других приложений;
по умолчанию каждое приложение выполняется в собственном процессе
Linux. Android запускает процесс, когда требуется выполнить какой-либо
компонент приложения, а затем завершает процесс, когда он больше не
нужен либо когда системе требуется освободить память для других
приложений.
На устройства на базе iOS (iPhone, iPad, iPod Touch) приложения поставляются
в формате архивных файлов-приложений IPA (iOS App Store Package) (4).
Каждый .ipa-файл — это бинарный файл для ARM-архитектуры, который на деле
является сжатой в формате zip папкой определённой структуры (Рис. 2) и
содержащей исполняемый файл, файлы ресурсов, таких как видео, аудио и
изображения и т. д. Файл .ipa может быть установлен только на iPhone, iPod Touch,
iPad, и не может быть запущен в эмуляторе iPhone на компьютере, так как он не
содержит бинарный код для x86 архитектуры, но может быть переименованы в .zip
и распакованы любым поддерживающим этот формат распаковщиком.
15
Рис. 2. Структура архивного приложения для iOS
1.2.2. Веб-разработка
В веб-разработке упаковка исходного кода не менее важна: со стороны клиента,
ни одному пользователю не понравится каждый раз при открытии веб-страницы
скачивать сотни и тысячи мегабайт данных только для того, чтобы сайт хорошо
отображался (он просто закроет страницу, не дождавшись, и уйдет на другой ресурс),
а с серверной – упаковка любого рода упрощает поддержку приложения.
Наиболее разнообразна в этой категории упаковка клиентского кода. Она
необходима в основном для оптимизации количества скачиваемых данных. Во-
первых, можно уменьшить размер файлов со скриптами на странице, минифицируя
Application
Payload Application.app
iTunesArtwork
iTunesArtwork@2
x
iTunesMetadata.
plist
WatchKitSupport WK
16
их, т.е., удаляя пробелы, сокращая названия переменных и т.д. [6]. На Лист. 1 и Лист.
2 показана минификация кода с помощью Webpack и плагина UglifyJS:
Лист. 1. Исходный код на языке JavaScript
Лист. 2. Минифицированный с помощью UglifyJS код на языке JavaScript
Webpack это инструмент, позволяющий преобразовать код к виду, пригодному
для использования в целевой среде (в большинстве случаев – в веб-браузерах) [7].
Результатом такого преобразования является один или несколько т.н. бандлов
(bundles) – упакованных скриптов, пригодных для целевой среды. Например,
разработка ведется в соответствии со стандартом ECMAScript 6 (ES6), код разделен
на логические модули, необходимо как-то запускать этот код в браузерах. Если эти
модули являются Node.js-модулями, браузер не поймет, как их интерпретировать, так
function map(array, iteratee) {
let index = -1;
const length = array == null ? 0 : array.length;
const result = new Array(length);
while (++index < length) {
result[index] = iteratee(array[index], index, array);
}
}
function map(n,l){let t=-1;const e=null==n?0:n.length,o=new
Array(e);for(;++t<e;)o[t]=l(n[t],t,n)}
17
как Node-модули существуют только внутри среды разработки Node. Также, код,
написанный по стандарту ES6 не будет работать в старых браузерах, таких как,
например, Internet Explorer 11. Webpack решает эти проблемы, транслируя такой код
в стандарт, который браузер умеет воспринимать [8] [9]. Кроме того, Webpack
предоставляет широкий набор возможностей оптимизации конечных файлов, о
которых речь пойдет дальше.
Во-вторых, можно включать в проект библиотеки не целиком. Например, объем
исходного кода таких библиотеки, как Moment.js и Lodash можно значительно
уменьшить, указав в конфигурационном файле, какие из локализационных файлов
оставить (для Moment.js), или настройку не добавлять неиспользуемые функции (для
Lodash) [6].
В-третьих, можно разделять один большой файл с клиентскими данными на
несколько поменьше и подгружать их «по требованию». Например, если сайт
представляет собой интернет-магазин, совершенно не обязательно, что пользователь
что-то купит (перейдет на страницу оформления заказа) или воспользуется не
основными страницами, а значит ему не нужны стили и скрипты, которые
используются только на тех страницах, и их можно исключить из основного файла.
1.2.3. Прикладное ПО
Прикладное ПО, как и ПО серверной части web-приложений, нужно
упаковывать, в первую очередь для удобства разработки, поддержки и
распространения. Рассмотрим все три варианта использования на примере
библиотеки языка Python.
С точки зрения программиста, это позволяет удобно разворачивать среду
разработки. Если все библиотеки упакованы стандартным образом, их можно
установить буквально одной консольной командой. На Рис. 3 и Рис. 4 приведены
18
фрагменты документации одной из библиотек языка Python, которую нужно
скомпилировать перед использованием.
Рис. 3. Документация библиотеки N, требующая дополнительной компиляции
19
Рис. 4. Документация библиотеки N, секция с компиляцией
В случае использования стандартной упаковки установка библиотеки может
выглядеть, как показано на Рис. 5. Несмотря на всю лаконичность команды, даже
таких библиотек в проекте может быть десяток. Но даже этот этап можно скрыть от
глаз пользователя.
20
Рис. 5. Фрагмент документации библиотеки M, не требующей пре-компиляции
Например, при использовании упаковки в RPM-пакеты (Red Hat Package
Manager – является основным форматом пакетов в LSB [10]), разработчик пишет
специальный .spec-файл [11], в котором описываются все команды, необходимые
для установки программы, в том числе: компиляция, удаление исходных файлов,
правильное размещение конфигурационных файлов, установка зависимостей и т.д.
На Лист. 3 показан пример содержания такого файла, а на Лист. 4 – установка пакета
такого рода.
С точки зрения поддержки пакетирование удобно тем, что можно иметь
несколько актуальных версий и постепенно и безболезненно выводить из
использование старые. Распространение упакованного кода также удобно своей
стандартизацией и централизацией (репозитории, где собраны пакеты. Для Python
это может быть, например, PyPI – Python Package Index).
21
Name: eject
Version: 2.1.5
Release: 1%{?dist}
Summary: A program that ejects removable media using software
control
License: GPLv2+
URL: http://www.pobox.com/~tranter
Source0: http://www.ibiblio.org/pub/Linux/utils/disk-
management/%{name}-%{version}.tar.gz
BuildRequires: gettext
BuildRequires: libtool
%description
The eject program allows the user to eject removable media
%prep
%setup -q -n
%build
%configure
make %{?_smp_mflags}
%check
make check
%install
rm -rf $RPM_BUILD_ROOT

Смотрите также:

"Автоматизация обработки заявок ООО "Проектно-Строительная Компания"
"Автоматизация процесса аттестации персонала для ООО "Нэт Бай Нэт Холдинг"
"Анализ интернет-активности конкурентов ( на примере конкурентов "Газпром нефть")
"Бухгалтерский учёт и аудит расчётов с подотчётними лицами в организации на примере ООО "ЛОЦ 10""
«Психологическое сопровождение персонала в организации на примере ООО «Крокус»
Cовершенствование деловой оценки персонала в организации (на примере ООО "Даймонд кейтеринг развитие")
IPO - инструмент финансирования деятельности организации. На примере ПАО «Нефтяная компания «Лукойл»
PR как средство продвижения организации (на примере ПАО "Тамбовский завод "Комсомолец им. Н.С. Артемова")
PR-коммуникации в сфере общественного питания (на примере кафе-кондитерской «Cream Cheese»)
SMM как средство повышения эффективности работы учреждений социокультурной сферы (на примере Малого театра)