Reverse engineering

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 16:26, 21 января 2019.

Reverse engineering – исследование некоторого готового устройства или программы, а также документации на него с целью понять принцип его работы. Фактически Reverse engineering заключается в процессе разбора приложения с целью понять, как оно работает, чтобы в будущем воссоздать этот процесс с внесением необходимых изменений. Обычно для этих целей используются отладчик и ассемблер. В зависимости от качества используемого программного обеспечения будут отличаться результат и количество времени, которое необходимо потратить на его приведение в нормальный вид.

Нельзя сказать, что реверс-инжиниринг можно представить как что-то однородно плохое или хорошее. Конечно, с точки зрения разработчиков, которые создали приложение, это совсем не радостное событие. Но с другой стороны, во многих случаях написание опытными программистами необходимых файлов может быть по времени менее затратным, нежели использование подобного инструментария. Хотя для начинающих разработчиков реверс-инжиниринг может сослужить неплохую службу, если нет представления о том, как реализовать что-то, даже примерные и не совсем понятные наброски могут помочь с достижением поставленной цели.[Источник 1]

Виды

Существуют следующие виды реверс-инжиниринга:

  1. Реверс-инжиниринг программного обеспечения — это когда постигают суть неведомой программы с закрытым исходным кодом. Процесс нередко происходит с применением специализированного софта: декомпиляторов, отладчиков, дизассемблеров, распаковщиков и прочих хитрых инструментов.
  2. Реверсинг «железок» — определение структуры и спецификаций устройства. Создание альтернативных драйверов, а ещё «прошивки», которые иногда хочется менять и переделывать под свои цели. [Источник 2]

Безопасность

Если нужна защита от реверс-инжиниринга, то в таком случае есть два варианта: использование специальных программ или создание кодовой конструкции, которая будет мешать совершать разбор написанного. Последний вариант подходит исключительно опытным специалистам. Для Android- приложений в качестве специализированного программного обеспечения используется ProGuard. Это приложение, которое используется для сокращения, обфускации и оптимизации кода. Если программу «прогнать» через него, то получим файл с расширением *.apk меньшего размера, чем он был. В таком случае его будет значительно сложней разобрать. Причем преимуществом данной программы является то, что она даже была внедрена в систему сборки Android-приложений с обновления r9. Поэтому воспользоваться ею может любой разработчик, который имеет стандартные инструменты создания и разработки.

Также есть способ узнать, подключен ли отладчик к вашему коду. Но есть одна проблема. Эта проверка определяет, подключен ли отладчик в данное конкретное время. Хакер может подключиться к приложению после этой проверки, когда приложение уже не подозревает об опасности. Эту проблему можно решить двумя способами:

  • Включить проверку в цикл выполнения (run loop), так что проверка будет выполняться постоянно.
  • Поставить проверку в наиболее критичных участках кода, где нас больше всего волнует безопасность.

Первый вариант обычно нежелателен. Его цена — трата драгоценного процессорного времени.[Источник 3]

Сферы применения

Машиностроение, автомобилестроение, авиация

Копирование различных механизмов и машин без фактической разработки. Позволяет минимальными затратами воспроизвести удачную конструкцию, но есть случаи копирования и неудачных машин.

Примеры:

  • Советский грузовик АМО-3 был практически полной копией американского грузовика «AutoCar-SA».
  • Советский лодочный мотор «Москва» был практически полной копией очень удачного американского мотора ScottAtWater.
  • Пример неудачного выбора прототипа для обратной разработки — советский лодочный мотор «Вихрь», копия немецкого мотора Koening.
  • Советский самолет Ту-4, за исключением двигателей, является почти точной копией американского Boeing B-29 Superfortress.
  • Практически все бензиновые двигатели, установленные на мотоблоках, генераторах и других малогабаритных машинах китайского производства — копии японских моторов Honda GX.
  • Знаменитые японские АКПП Aisin A130 и A140 — несколько доработанные нелицензионные копии АКПП Chrysler 1940—1950-х годов, которые производились американской компанией на заводах в Японии после Второй мировой войны.
  • Первые китайские внедорожники Admiral, Great Wall и другие — нелицензионные практически точные копии внедорожника Toyota Hilux Surf.

Электроника

Обратная разработка электронных устройств появилась ещё на заре радиотехники. В 1920—1930 годах различные фирмы копировали друг у друга радиолампы и схемотехнические решения их применения. Именно с обратной разработкой, а не с лицензионным производством, связано то, что радиолампы одного назначения почти всех производителей оказались унифицированными и взаимозаменяемыми. Например европейская лампа EL95 клон более ранней американской лампы 6KA5. Есть и обратные примеры: американские 6CA5 и KT88 — клоны европейской лампы EL34. То же самое относится и к советским радиолампам, многие из которых являются клонами американских ламп, получаемых по ленд-лизу (например 6Ж4, 6П9) или немецких из трофейной аппаратуры (6Г2, ГУ50). Вместе с лампами копировались и типовые схемы их включения, то есть фактически схемы блоков радиоаппаратуры. Поэтому именно благодаря обратной разработке ламповая эпоха охарактеризовалась по сути переходом к типовому проектированию в электронике. В частности, все выпускаемые в мире бытовые приемники-супергетеродины строились фактически по трем схемам, которая определялась лампой смесительно-гетеродинного узла: двойной триод, триод-гептод или пентагрид. То же самое относилось и к усилителям низкой частоты. Существовало не более десятка типовых схем их построения в зависимости от выходной мощности: маломощные однотактные на комбинированной лампе типа 6Ф3П, маломощные однотактные с темброблоком на двойном триоде (типа 6Н1П) и выходном пентоде (6П14П, EL84) или лучевом тетроде (6П3С, EL34), двухтактные с триодным фазоинвертором (6Н1П + 2х6П14П), двухтактные многокаскадные (6Н8П + 2х6П6С + ГУ50). Черно-белые телевизоры и вовсе строились по одной-двум схемам. Примеры:

  • Копирование различных электронных блоков без фактической разработки. Известно, что многие элементы, в частности, ТТЛ различных компаний и национальных стандартов, взаимозаменяемы. Например, американская серия интегральных схем 7400 и её советский аналог К(Р)155.
  • Процессор Am386 компании AMD создан ради совместимости с чипом 80386 фирмы Intel и в пользу экономической целесообразности.
  • Процессоры Super386 38600SX и 38600DX компании Chips and Technologies созданы методом ОР.

Программное обеспечение

Исследование и обратная разработка программ обычно осуществляются с целью дальнейшей модификации, копирования, или, например, написания генераторов ключей, алгоритм работы которых получен на основе анализа алгоритма их проверки. Также исследование программ применяется с целью получения некоторых закрытых сведений о внутреннем устройстве программы — о протоколе сетевого обмена с сервером, аппаратным средством, ключом защиты или о взаимодействии с другой программой. Ещё одна область применения — получение информации о способах экспортирования данных из многочисленных проприетарных форматов файлов.

С развитием Интернета популярные операционные системы и программы всё интенсивнее исследуются на предмет обнаружения в них уязвимостей или т. н. «дыр». В дальнейшем найденные дыры могут использоваться для получения несанкционированного доступа к удалённому компьютеру или компьютерной сети. C другой стороны, обратная разработка применяется при исследовании антивирусными компаниями вредоносного ПО c целью добавления его сигнатур в базы своих продуктов.

Одним из широко известных примеров обратной разработки является исследование BIOS персонального компьютера IBM, ставшее серьёзным шагом на пути развития производства IBM-совместимых компьютеров сторонними производителями. Создание сервера Samba (входящего в состав ОС GNU/Linux и работающего с серверами на базе ОС Microsoft) также потребовало обратной разработки используемого Microsoft протокола SMB. Создание многих ICQ-клиентов также потребовало обратной разработки протокола ICQ.

Обратная разработка программного обеспечения производится с помощью следующих методик:

  • Анализ обмена данными, наиболее распространённый в обратной разработке протоколов обмена данными, который производится с помощью анализатора шины и пакетного сниффера для прослушивания шины компьютера и компьютерной сети соответственно.
  • Дизассемблирование машинного кода программы для получения её листинга на языке ассемблера. Этот способ работает на любой компьютерной программе, но требует достаточно много времени, особенно для неспециалиста.
  • Декомпиляция машинного или байт-кода программы для создания исходного кода на некотором языке программирования высокого уровня.

В настоящее время под словами «reverse engineering» чаще всего понимается т. н. clean room reverse engineering, то есть процесс, при котором одна группа разработчиков анализирует машинный код программы, составляет алгоритм данной программы на псевдокоде либо, если программа является драйвером какого-либо устройства, составляет исчерпывающие спецификации интересующего устройства. После получения спецификаций другая группа разработчиков пишет собственный драйвер на основе полученных спецификаций или алгоритмов. Такой подход позволяет избежать обвинений в нарушении авторских прав на исходную программу, так как по законам, к примеру в США, подпадает под понятие «fair use», то есть добросовестного использования оригинальной программы. Результат обратной разработки редко идентичен оригиналу, что и позволяет избежать ответственности перед законом, особенно при условии контроля отсутствия этой идентичности первой группой разработчиков и отсутствия нарушений торговых марок и патентов.

Базы данных

Может использоваться при создании реляционной модели базы данных. [Источник 4]

Reverse engineering на примере Android

Декомпиляция

Этот процесс будет проводиться с использованием программы Apk Manger. Прежде чем приступать к работе, необходимо убедиться, что есть нужные драйверы для работы девайса, а также функционирует режим USB-debugging. Первоначально необходимо будет переместить файл, который будет разбираться в директиву apk_manager\place-apk-here-for-modding. После этого следует запустить Script.bat. Если никаких проблем нет, то запуститься консоль. Надо выбрать пункт номер девять – «Декомпилировать». После того как будет запущен процесс, необходимо не закрывать консоль. Потом следует открыть интересующий apk-файл с помощью архиватора и извлечь из него classes.dex, который нужно обработать программой dex2jar. Для необходимого нам результата его надо переместить на объект с расширением .bat. Появится файл, который будет заканчиваться на .jar.

Анализ данных

Чтобы получить информацию о приложении, необходимо открыть его манифест. По нему определяется, что выступает в роли главной активности. Она-то и представляет наибольшую важность. Необходимо проверить наличие информации о менеджере лицензий, если она есть, то это существенно усложнит проведение реверсного инжиниринга. Если переключиться на jd-gui и развернуть дерево, то появится несколько пространств имён. Необходимо зайти в пространство имен, в котором находятся необходимые данные. Здесь необходимо найти и удалить ключ, а потом и остальные строки, которые проверяют, является ли лицензионной работающая версия. Потом в Apk Manager ищем место, куда указано размещать байт-код. После этого осталось только скомпилировать программу.

Сборка приложения

В этом поможет всё тот же Apk Manager. В окне консоли выбираем пункт №14. Далее дело техники. Если приложение довольно сложное, то при запуске оно может частично или полностью потерять свою работоспособность. Сказать, что нужно делать в конкретном случае, общими словами невозможно, поэтому искать проблемное место придётся самостоятельно. Так, если окно приложения блокируется всплывающим окном, то необходимо просмотреть код и удалить ту его часть, что отвечает за данный диалог. Помочь с этим сможет jd-gui. Реверсный инжиниринг не является лёгким делом, и он требует наличия значительного багажа знаний. Даже если всё без проблем запустилось, необходимо будет протестировать работоспособность приложения. То есть реверс-инжиниринг является ещё затратным по времени действием. Необходимо продолжать работать, пока не будут выявлены все проблемы.

Источники

  1. Реверс-инжиниринг для начинающих // FB [2012-2019]. Дата обновления: 30.01.2019. URL: http://fb.ru/article/245082/revers-injiniring-dlya-nachinayuschih-zaschita-android-prilojeniy-ot-revers-injiniringa (дата обращения: 26.12.2018)
  2. Что такое реверс-инжиниринг // xbb [2007-2019]. Дата обновления: 23.12.2018. URL: http://xbb.uz/IT/Chto-takoe-revers-inzhiniring (дата обращения: 26.12.2018)
  3. Ломаем iOS-приложение // Хабрахабр [2006-2019]. Дата обновления: 11.09.2018. URL: https://habr.com/post/199130/ (дата обращения: 26.12.2018)
  4. Обратная разработка // Wikipedia [2017-2019]. Дата обновления: 10.10.2018. URL: https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0 (дата обращения: 26.12.2018)