Обратная инженерия
Обра́тная инжене́рия (англ. reverse engineering; обратный, реверс-инжиниринг), процесс, методика, позволяющие при наличии некоторой информации об изделии или наличии самого продукта (изделия) построить (восстановить) представление о структуре и выяснить принципы работы изделия, в том числе компонентов компьютера или компьютерной программы, с целью дальнейшего повторения (воспроизведения) либо улучшения характеристик. В зависимости от объекта информация, полученная в ходе его обратной инженерии, может быть полезна при исследовании устаревших, давно созданных объектов (и, например, не имеющих описания в виде технической документации надлежащего качества), выявлении проблем безопасности, выяснении принципов работы устройства и др.
Процедура обратной инженерии в значительной степени зависит от того, к какому объекту она применяется, однако всех их объединяет наличие трех основных этапов: извлечение информации (англ. information extraction) – сбор всевозможных данных об объекте; моделирование (англ. modeling) – построение на основе собранных данных абстрактной модели, которую можно было бы использовать при создании нового (или повторении) устройства или компьютерной программы; валидация (англ. review) – проверка свойств модели. Обратная инженерия применяется в разработке компьютеров и программного обеспечения (ПО), машиностроении и химической промышленности, биологии и др.
Цели обратной инженерии
Причины применения обратной инженерии весьма разнообразны. Исторически она возникла как задача анализа образцов оборудования для достижения промышленного или военного паритета. Однако, по существу, процесс реверс-инжиниринга не подразумевает только прямого копирования или какого-либо изменения готового продукта. Это в большей степени изучение с целью получения сведений об особенностях разработки в условиях полного отсутствия или очень незначительной достоверной информации о том, как именно продукт был сделан.
Иногда целью обратной инженерии является простое восстановление документации на устаревшие (англ. legacy) системы, всё ещё находящиеся в использовании. В случае когда объект обратной инженерии – разработка конкурента, настоящей целью может быть не его копирование, а получение сведений о возможностях конкурента. Обратная инженерия может также использоваться для улучшения возможностей взаимодействия (совместимости) различных продуктов, и законность использования отдельных видов обратной инженерии именно в этих целях является предметом судебных разбирательств, несмотря на законодательные ограничения в США и ЕС.
Обратная инженерия ПО может помочь пониманию структуры исходного кода в целях поддержки и улучшения программ, с её помощью может быть получена необходимая информация для принятия решений по разработке ПО, а кроме того, построенное в процессе обратной инженерии графическое представление (модель) программы позволит исследовать исходный код, что в дальнейшем будет способствовать устранению ошибок и уязвимостей.
Этот же процесс используется для «взлома» программного обеспечения и носителей с целью снятия защиты от копирования или для создания улучшенной копии или подделки, что обычно является целью конкурента или хакера.
Разработчики вредоносных программ часто используют методы реверс-инжиниринга для поиска уязвимостей в операционной системе, чтобы создать компьютерный вирус, который может использовать системные уязвимости.
Существуют и другие цели и мотивы применения обратной инженерии.
Совместимость. Реверс-инжиниринг может быть использован для полного и точного восстановления интерфейсов и протоколов взаимодействия программных, сетевых и компьютерных компонентов. Целью такого реверс-инжиниринга является обеспечение функциональной совместимости (англ. interoperability).
Военный или промышленный шпионаж. Изучение новейших разработок противника или конкурента путём кражи или захвата прототипа продукта, его последующего детального изучения (англ. dismantling) может привести к разработке аналогичного продукта или более эффективных мер противодействия.
Устаревание. Интегральные схемы часто разрабатываются на основе запатентованных (проприетарных) технологий и строятся на производственных линиях, которые устаревают всего за несколько лет. Когда эти технологии и линии больше не могут обслуживаться, поскольку запасные части к ним больше не производятся, единственный способ воспользоваться имеющимися разработками в новых условиях – выполнить обратную инженерию существующего чипа, а затем перепроектировать его с использованием новых инструментов, руководствуясь знаниями, полученными в процессе обратной инженерии. Связанная проблема, которую можно решить с помощью обратной инженерии, – необходимость поддержки (технического обслуживания, обеспечения расходными материалами и запчастями для непрерывной работы) существующих устаревших устройств, которые больше не поддерживаются их оригинальным производителем.
Анализ безопасности продукта. Исследование того, как работает продукт, путём определения технических характеристик его компонентов и оценки сделанных затрат, а также выявление потенциального нарушения патентных прав. Также частью анализа безопасности продукта является получение конфиденциальных данных путём разборки (англ. disassembling) и анализа устройства частей системы.
Экономия. Своевременное выяснение того, на что способно то или иное устройство, может избавить пользователя от необходимости покупать отдельный продукт.
Распространённые ситуации использования
Машиностроение
По мере того как компьютерное проектирование (САПР) становилось все более популярным, реверс-инжиниринг стал жизнеспособным методом создания виртуальной 3D-модели существующей в натуре детали для использования в 3D-инструментах компьютерного моделирования или другом программном обеспечении. Процесс обратной инженерии включает в себя измерение объекта, а затем его реконструкцию в виде 3D-модели. Физический объект можно измерить с помощью технологий 3D-сканирования, таких как координатные измерительные машины, лазерные сканеры, дигитайзеры со структурированным светом или промышленное компьютерное сканирование (компьютерная томография). Сами по себе измеренные данные, обычно представляемые в виде облака точек, не содержат топологической информации и проектных замыслов. Первое может быть восстановлено путём преобразования облака точек в сетку с треугольной гранью. Обратная инженерия направлена на то, чтобы выйти за рамки создания такой сетки и восстановить замысел проекта, пользуясь аналитическими поверхностями, где это необходимо (плоскости, цилиндры и т. д.), а также сплайнами для создания компьютерной модели поверхности. Построение такой модели позволяет модифицировать исходную конструкцию в соответствии с новыми требованиями, составить производственный план и т. д.
Программное обеспечение
В 1990 г. Институт инженеров электротехники и электроники (IEEE) определил обратную инженерию ПО как «процесс анализа рассматриваемой системы для идентификации компонентов системы и их взаимосвязей, а также для создания представлений системы в другой форме или на более высоком уровне абстракции» (Cross. 1990), в котором «рассматриваемая система» (англ. subject system) является конечным продуктом разработки программного обеспечения. Обратная инженерия – это только процесс исследования, и рассматриваемая программная система не модифицируется, в противном случае это было бы реинжинирингом или реструктуризацией. Обратную инженерию можно выполнять не только на функциональном конечном продукте, но и на любой стадии производственного цикла.
Программная технология защиты от несанкционированного доступа, такая как запутывание (обфускация), используется для предотвращения реверс-инжиниринга и реинжиниринга проприетарного ПО и программных систем. На практике возникают два основных типа реверс-инжиниринга. При первом типе исходный код программы уже доступен, но обнаружены аспекты программы более высокого уровня, которые, возможно, плохо задокументированы, или документация устарела. При втором типе исходный код недоступен и любые попытки восстановить исходный код рассматриваются как реверс-инжиниринг.
Методы обратной инженерии двоичного кода
Реверс-инжиниринг ПО может быть проведён по-разному. Существуют три основных способа.
1. Анализ путём наблюдения за обменом информацией, наиболее распространённый в реверс-инжиниринге протоколов, который включает использование анализаторов шин и анализаторов пакетов, например для доступа к компьютерной шине или компьютерной сети и раскрытия данных трафика на них. Затем можно проанализировать поведение шины или сети, чтобы создать автономную реализацию, имитирующую это поведение. Это особенно полезно для обратной инженерии драйверов устройств. Иногда результативности реверс-инжиниринга во встраиваемых системах способствуют намеренно введённые производителем инструменты, такие как порты JTAG или другие средства отладки. В Windows популярны низкоуровневые отладчики, такие как SoftICE.
2. Дизассемблирование позволяет понять структуру и логику программы, доступную лишь в её машинном представлении – массиве битов. Вручную это требует особой квалификации и больших трудозатрат. Основным видом инструментов дизассемблирования являются интерактивные дизассемблеры.
3. Декомпиляция с использованием декомпилятора, процесс, который позволяет с разной вероятной результативностью воссоздать исходный код на каком-либо языке программирования высокого уровня для программы, доступной только в машинном коде или байт-коде.
Исходный код и модели программных систем
В технологиях, базирующихся на использовании моделей программ (например, model-driven development), реверс-инжинирингом называется процесс построения (восстановления) модели системы из её исходного кода. В случае когда используется UML (см. CASE-технологии) как средство моделирования, может быть поставлена задача автоматического или автоматизированного построения некоторых видов диаграмм, отражающих структуру или поведение имеющейся программной системы. Такими диаграммами могут быть, например, диаграммы классов или диаграммы последовательностей UML.
В рамках Object Management Group (OMG) был подготовлен проект стандарта метамодели выявления знаний (Knowledge Discovery Metamodel – KDM), однако широкого использования этого стандарта и поддерживающих его инструментов пока нет, что связано как со сложностью автоматического выявления знаний об архитектуре программной системы, так и с ограниченным применением UML в промышленной разработке ПО.
Телекоммуникационные протоколы
Протокол – совокупность правил и соглашений, определяющая процесс обмена сообщениями (допустимые последовательности и форматы сообщений) в компьютерной сети либо между различными программами. Одной из форм представления логики протокола может модель в форме детерминированного автомата. Соответственно, цель обратной инженерии протокола может быть разделена на две подзадачи: выявление формата сообщений и построение (восстановление) детерминированного автомата.
Интегральные схемы / смарт-карты
В данном случае реверс-инжиниринг – это инвазивная и разрушающая форма анализа чипа или смарт-карты. Исследователь использует химические вещества, чтобы стравливать слой за слоем чип, и делает снимки с помощью сканирующего электронного микроскопа. Этот метод помогает изучить всю аппаратную и программную часть смарт-карты. Основная проблема для исследователя состоит в том, чтобы восстановить логику функционирования чипа, узнать, как он работает. Разработчики чипов используют различные методы защиты от реверс-инжиниринга, в частности обфускацию и скремблирование.