Обратная разработка или реверс-инжениринг - это использующаяся в мире ИТ практика, которую иногда опасаются применять из-за её предполагаемой незаконности. В то же время, тема обратной разработки является достаточно популярной среди широкой технически подкованной публики, которую привлекает некоторый шарм взлома программ и получения полного доступа к устройствам.
Тем не менее, на сегодня обратная разработка программного обеспечения не является незаконной. Она часто используется при решении исследовательских задач в коммерческих и научных проектах. Более того, R&D компании часто предлагают независимые услуги по обратной разработке для IT проектов. Иногда просто необходимо знать, как работает сторонняя программа или что представляет собой формат данных, чтобы абсолютно законно улучшить свое собственное решение.
Эта статья описывает общие понятия и методы обратной разработки программного обеспечения, включая список объектов, который можно анализировать, и примеры, когда подобный анализ может понадобиться, а также общую примерную схему того, как выполнить реверс-инжиниринг программного обеспечения.
Объекты обратной разработки приложений
Приведем список объектов, к которым обычно применяется техника обратной разработки, и соответствующие задачи, которые таким образом решаются.
Исполняемый файл. Необходимо для того, чтобы узнать как именно работает приложение.
Применяется для:
Исследования вредоносного ПО;
Создания патча для приложения при отсутствии исходного кода;
Улучшения совместимости с приложением;
Улучшения интеграции с приложением.
Часть операционной системы (например, системная DLL). Необходимо для того, чтобы использовать недокументированные функции и интерфейсы.
Применяется для:
Создания приложений для управления системой;
Обеспечения тесного/расширенного взаимодействия приложения с операционной системой;
Исследования сложной программной ошибки.
Формат данных. Необходимо для того, чтобы получить структуру определенного файлового формата.
Применяется для:
Реализации возможности просмотра и/или создания соответствующих файлов;
Получения мобильных данных;
Поддержки расширенных возможностей файловой системы, например, поиска в соответствующих файлах или восстановления удаленных файлов.
Сетевой протокол. Необходимо для того, чтобы восстановить формат пакетов данных и последовательность обмена данными.
Применяется для:
Мониторинга сетевых коммуникаций, например, из соображений безопасности;
Совместимости со сторонними сетевыми приложениями и подсистемами.
Для достижения различных целей используются разные инструменты и разные тактики обратного инжиниринга программного обеспечения. В этой статье я сосредоточусь на процессе обратной разработки исполняемых файлов, так как эта задача подразумевает определенный ряд шагов и является наиболее сложной и творческой.
Тактики обратной разработки приложений
Шаг 0. Необходимые знания
Чтобы выполнить реверс-инжиниринг приложения, вам необходимо знать основные принципы его создания и работы:
Парадигмы программирования, такие как ООП;
Особенности архитектуры, а также процессов сборки и выполнения программного обеспечения для требуемой ОС;
Особенности структуры, трансляции и компиляции кода для требуемого языка.
Анализ приложения для iOS, написанного на Objective-C, сильно отличается от исследования сетевого приложения для Windows, созданного на C++. Вам необходимо знать типичные элементы архитектуры, типичные места, где следует искать определенные компоненты и данные, типичные структуры кода, уметь выделять ключевые инструкции в скомпилированном и декомпилированном коде. Будет идеальным наличие опыта разработки приложений того же типа, что и исследуемое приложение.
Шаг 1. Запустите и протестируйте исполняемый файл
Перед началом процесса обратной разработки, всегда полезно поработать с приложением и изучить его возможности для разных конфигураций и вариантов использования. Естественно, если вы исследуете вредоносную программу, её работу следует изучить на виртуальной машине.
Шаг 2. Проанализируйте, как исполняемый файл взаимодействует с внешним миром
Использование библиотек. Вы можете построить иерархию используемых модулей с помощью инструмента под названием Dependency Walker.
Взаимодействие с процессами. Существует несколько инструментов, способных помочь в исследовании функционирования приложения с точки зрения процессов, наиболее популярными из них являются Process Explorer и Process Monitor.
Взаимодействие с системными API. Иногда полезно выяснить, с какими системными API взаимодействует приложение и каким образом. APIMonitor является для этого идеальным инструментом.
Взаимодействие с файловой системой. Для этого можно использовать FileMon или функцию File Monitor, которую предоставляет Process Monitor.
Сетевые взаимодействия. Существует несколько сетевых снифферов, способных вам помочь: TCPView, WireShark, или Network Monitor.
Взаимодействие с физическими портами. Если приложение использует физические системные порты, PortMon поможет вам получить подробности этого взаимодействия.
Шаг 3. Углубленное исследование кода
Это то, что исследователи обычно и называют обратной разработкой: трансляция двоичного кода на язык ассемблера чтобы затем извлечь структуры, инструкции, и вызовы функций. Для этого вам понадобится дизассемблер и обычный отладчик. Наиболее популярным дизассемблером в профессиональной середе является IDA Pro; что касается отладчиков, то OllyDBG и WinDBG лучше всего подходят для обратной разработки в Windows и оба включают в себя встроенный дизассемблер, в то время как llbd является отличным отладчиком для кода под OS X / iOS. Осуществляя обратную разработку приложений для OS X / iOS, вы также можете использовать инструмент для реверс-инжиниринга Hopper.
Здесь вы сможете найти несколько статей с более подробным описанием инструментов обратной разработки и практическими примерами обратной разработки программного обеспечения.
Процесс обратной разработки может нести в себе различные дополнительные сложности. Например, исполняемый файл может быть запакован, и требуя распаковки, или приложение может иметь защиту от отладки, так что вам потребуется предварительно прикрепить к нему отладчик (интересный пример такой задачи вы можете найти в этой статье).
Обратная разработка программных приложений является творческой исследовательской задачей, которая требует терпения и интуиции, а также сильно зависит от вашего опыта разработки. Будучи высоко аналитической деятельностью, она не только способствует получению необходимой информации для выполнения проекта, но также улучшает ваше общее понимание процесса создания программного обеспечения, знание архитектуры приложений и принципов исполнения кода.
Столешницы для кухни - это самая часто используемая часть кухонной мебели, на которой производится большая часть работ по приготовлению пищи, горячие блюда ставятся на нее, различные пищевые продукты и посуда и прочие кухонные принадлежности, поэтому со временем случается так, что столешница, сделанная из непрочного материала теряет свой первоначальный цвет, истирается, тускнеет, а местами на ней могут оставаться следы от различных предметов