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

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
22
Лист. 3. Пример содержания .spec-файла
Лист. 4. Установка RPM-пакета представляет собой всего одну консольную команду
1.2.4. Системное ПО
Системное программное обеспечение традиционно делится на две группы:
базовое и сервисное. К примерам базового программного обеспечения можно
отнести:
make install DESTDIR=$RPM_BUILD_ROOT
install -m 755 -d $RPM_BUILD_ROOT/%{_sbindir}
ln -s ../bin/eject $RPM_BUILD_ROOT/%{_sbindir}
%find_lang %{name}
%files -f %{name}.lang
%doc README TODO COPYING ChangeLog
%{_bindir}/*
%{_sbindir}/*
%{_mandir}/man1/*
%changelog
* Wed Oct 20 2011 John Doe <jdoe@example.com> 0.8.18.1-0.1
- Initial RPM release
yum update-to nameofpackage versionnumber
23
операционные системы – программы, которые управляют
устройствами компьютера и обеспечивают работу других программ
операционные оболочки (shell) – интерфейсы для взаимодействия
пользователей с операционной системой.
Сервисное ПО интерпретируется гораздо шире и подразумевает совокупность
программ, расширяющих базовое ПО. Среди них:
архиваторы
программы, обслуживающие устройства компьютера: жесткий диск,
оперативную память, процессор, видеокарту
дисковые утилиты: дефрагментаторы, программы для диагностики и
очистки, разметки жесткого диска
программы для диагностики оперативной памяти, процессора,
видеокарты
программы для управления реестром приложений
утилиты безопасности, антивирусы, шифрования, резервного
копирования и восстановления данных, фаерволлы и сетевые экраны
программы установки и удаления приложений
менеджер автозагрузки
твикер – утилита для настройки параметров ОС, которые недоступны для
изменения стандартными средствами
сетевые утилиты (ipconfig, ifconfig, ping, netstat, route, traceroute и прочие).
Дистрибуция системного программного обеспечения мало отличается от
прикладного, с той лишь разницей, что часто такие пакеты существуют в двух
версиях: готовые к использованию и состоящие из исходного кода, который можно
изменить и затем собрать «под себя».
24
1.3. Распаковка кода
1.3.1. Практические аспекты
Часто точная распаковка бывает затруднена и невозможна. Тем не менее,
существует множество программных средств, выполняющих распаковку файлов,
использующих две стратегии: динамический и статический анализ.
Динамический анализ подразумевает собой запуск файла и создание
распакованного файла из образа, загруженного в память. Этот метод опасен, т.к. если
файл содержит вирус, система может быть повреждена. Кроме того, упаковщики
имеют ряд средств для борьбы с динамической распаковкой: можно не
расшифровывать весь код сразу, а делать это по мере исполнения, или
расшифровывать и запускать программу целиком только в определенный день
недели.
Статические распаковщики, такие как CUP386 или UNP, которые пытаются
распаковать файл, не запуская его, часто оказываются бесполезны, если алгоритм
упаковки требует запуска файла.
1.3.2. Reverse engineering
В 1990 году Институт инженеров электротехники и электроники (IEEE)
определил [12] обратную разработку как «процесс анализа программной системы
для:
идентификации ее компонент и их связей
создания версии системы в другом виде или на более высоком уровне
абстракции»
Сама по себе обратная разработка не включает изменение исходной системы или
создание новой, основанной на ней. Это «процесс исследования, а не изменения или
25
воспроизведения» [12]. На практике обратная разработка используется в двух типах
ситуаций. В первом случае, исходный код программы известен, и обнаружены
некоторые высокоуровневые аспекты программы, например, недостаток
документации или ее неактуальность. Во втором случае, исходный код неизвестен, и
тогда все попытки его воспроизвести считаются обратной разработкой. К другим
целям обратной разработки относят аудит безопасности, удаление защиты от
копирования, включение дополнительных функций платного программного
обеспечения.
Тестирование по стратегии чёрного ящика – “black box testing часто
ассоциируют с обратной разработкой [13], т.к. у тестировщика есть API, который
нужно протестировать, не зная внутреннего устройства программы.
Обратная разработка программного обеспечения производится с помощью
следующих методик [14]:
анализ обмена данными – наиболее распространённый в обратной
разработке протоколов обмена данными метод. Производится с
помощью анализатора шины и пакетного сниффера для
прослушивания шины компьютера и компьютерной сети
соответственно.
дизассемблирование машинного кода программы для получения её
листинга на языке ассемблера. Этот способ работает на любой
компьютерной программе, но требует достаточно много времени,
особенно для неспециалиста.
декомпиляция машинного или байт-кода программы для создания
исходного кода на некотором языке программирования высокого
уровня.
26
1.3.3. Декомпиляторы
Декомпилятор – это компьютерная программа, принимающая исполняемый
файл на вход, пытаясь создать высокоуровневый файл с исходным кодом, который
можно успешно перекомпилировать. Декомпиляторы обычно неспособны идеально
воспроизвести оригинальный код, поэтому часто генерируют обфусцированный код.
Тем не менее, декомпиляторы остаются одним из важнейших инструментов в
обратной разработке компьютерного программного обеспечения.
Декомпиляция может использоваться для восстановления утерянного исходного
кода и часто полезна в некоторых аспектах проверки компьютерной безопасности,
совместимости и исправления ошибок. Успех декомпиляции зависит от количества
информации, представленный в декомпилируемом коде и точности анализа,
производимого над ним. Байт-кодовые форматы, используемые многими
виртуальными машинами (такими, как Java Virtual Machine или .Net Framework
Common Language Runtime) часто включают в себя дополнительные метаданные и
высокоуровневые особенности, которые облегчают декомпиляцию. Наличие
отладочных данных может сделать возможным воспроизведение оригинальных имен
переменных и структур и даже номера строк.
1.3.4. Дизассемблеры
Дизассемблер – это компьютерная программа, транслирующая машинный код в
текст программы на языке ассемблера [15]. Дизассемблеры отличаются от
декомпиляторов, которые в отличие от первых нацелены на высокоуровневые языки.
Вывод работы дизассемблера часто отформатирован в удобном к чтению человеком
виде, а не пригодном для ввода в ассемблер, что делает дизассемблеры по факту
инструментом для обратной разработки.
По взаимодействию с пользователем дизассемблеры делятся на:
27
интерактивные, т.е. позволяющие изменять правила
дизассемблирования и исследовать программы
автоматические, генерирующие готовый код, который можно затем
править в редакторе.
Однопроходные дизассемблеры обычно являются частью отладчика, а
многопроходные позволяют более гибко анализировать программы: на первых
проходах автоматически или интерактивно собирается информация о границах
процедур и функций, а на последнем проходе формируется итоговый листинг.
Чаще всего дизассемблер используют для анализа программы (или её части),
исходный текст которой неизвестен — с целью модификации, копирования или
взлома. Реже — для поиска ошибок в программах и компиляторах, а также для
анализа и оптимизации создаваемого компилятором машинного кода.
Дизассемблеры не применяются для кода, модифицирующегося во время
исполнения
1.3.5. Взлом ПО
Как правило, в основе работы программы, позволяющей осуществить взлом
программного обеспечения, лежит исследование ассемблерного кода, полученного с
помощью дизассемблера. Полученный результат может использоваться по-разному,
в зависимости от способа взлома:
для построения генератора ключей
для внесения изменений (патчей) в исполняемый файл. Этот способ
не требует анализа и алгоритма проверки правильности ключа и
заключается в поиске проверки нескольких условий пригодности и
корректности ключа и замене ее на безусловный переход к
выполнению основной функциональности.
28
Изменение исполняемого файла не всегда может проводиться с
недобросовестными целями, а может быть мотивировано отключением
нежелательных действий со стороны программы (например, напоминания о
регистрации, исправление ошибок, сокращения функциональности программы и
т.д.). В этих случаях соответствующие команды процессору часто заменяются на
байты со значением 90h, что соответствует ассемблерной команде nop (no operation),
то есть «пустой команде», не выполняющей никаких действий.
Между тем, патч возможен, как правило, в том случае, когда исполняемый файл
программы не защищён специальными упаковщиками и шифраторами,
скрывающими реальный код исполняемого файла. Для последнего типа программ
зачастую используется самая интеллектуальная часть обратной разработки —
исследование кода программы при помощи отладчика и создание генератора ключей,
но возможны и другие решения [16]:
использование загрузчика: способ обходить некоторые виды защиты
ПО, заключающиеся в использовании внешних систем защиты:
определенные фрагменты программы в оперативной памяти
заменяются сразу после загрузки в память и до непосредственным
запуском кода в точке входа
применение патча (в том числе бинарного): способ, похожий на
«загрузчик», но модификация производится статически в файлах
программы. Является одним из самых простых и быстрых способов
взлома ПО.
использование взломанной версии: способ заключается в подмене
оригинальных файлов программы файлами, которые уже взломаны.
использование эмулятора ключа: способ используется для обмана
защит, построенных на использовании в качестве защиты
29
электронного ключа (как правило, подключаемого к LPT или USB
порту компьютера). Заключается в снятии дампа внутренней памяти
ключа. Файл с содержимым этой памяти подаётся на вход
специальной программе-эмулятору, которая подключает свой
драйвер-фильтр в стек драйверов и обманывает защищённую
программу, эмулируя работу с аппаратным ключом. В случаях
наличия в программе обращений к ключу для аппаратного
шифрования участка памяти этот метод используется в связке с
методом бинарного патча.
подмена официального сайта программ и/или соответствующее
изменение настроек с целью обойти проверку ключа, если она была
вынесена разработчиками на какой-либо интернет-ресурс (В
абсолютном большинстве случаев — для предотвращения взлома,
реже — для учёта и ведения статистики, сбора сведений). Чаще всего
осуществляется на примитивном уровне путём модифицирования
файла “hosts” и запуска различных эмуляторов.
запрет доступа программы к интернету выполняется в тех случаях,
когда программа требует активации лицензионного ключа через
интернет, либо в случаях, когда программа связывается с сервером
разработчика для обмена данными или обновления. Это действие,
обычно, производится после введения ключа, сгенерированного
генератором ключей.
В Глава 1. рассмотрена актуальность алгоритмов упаковки и шифрования.
Проанализирована применимость данных методов в различных сферах
разработки:
30
в разработке под мобильные устройства
в веб-разработке
в прикладном программном обеспечении
в системном ПО.
Приведен обзор современных методологий распаковки кода: декомпиляция,
дизассемблирование, обратная разработка и др.
31
ГЛАВА 2. ОБЗОР МЕТОДОЛОГИЙ
2.1. Методы упаковки
2.1.1. Алгоритмы сжатия
Существующие алгоритмы сжатия данных можно разделить на два больших
класса – с потерями и без. Алгоритмы с потерями обычно применяются для сжатия
медиа-контента – аудио, видео, большинства графических файлов. Эти алгоритмы
позволяют достичь больших степеней сжатия благодаря избирательной потере
качества. Однако, по определению, восстановить первоначальные данные из сжатого
результата невозможно.
Алгоритмы сжатия без потерь применяются для уменьшения размера данных, и
работают таким образом, что возможно восстановить данные в точности такими,
какие они были до сжатия. Они применяются в коммуникациях, архиваторах и
некоторых алгоритмах сжатии аудио и графической информации. Так как целью
работы является написать алгоритм, корректно упаковывающий исходный код (так,
чтобы при распаковке или даже в сжатом виде он работал без ошибок, в том числе в
логике, без потерь по памяти и т.д.), далее будут рассматриваться только алгоритмы
сжатия без потерь.
Основным принципом алгоритмов сжатия без потерь является утверждение о
том, что в любом файле, содержащим неслучайные данные, информация частично
повторяется [17]. Используя статистические математические модели можно
определить вероятность повторения определённой комбинации символов. После
этого можно создать коды, обозначающие выбранные фразы, и назначить самым
часто повторяющимся фразам самые короткие коды. Для этого используются разные
техники, например: энтропийное кодирование, кодирование повторов, и сжатие при
помощи словаря. С их помощью 8-битный символ, или целая строка, могут быть

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

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