Что такое реверс-инжиниринг?
Наверное, мы все ломали игрушки в детстве, пытаясь понять, как они работают. Конечно, когда мы становимся старше, это исчезает. Но не всегда. Первое, что делают военные, получая оружие на поле боя – это разбирают его, чтобы увидеть как работает эта штурмовая винтовка и можно ли сделать его более удобным. Так же и пользователи, желающие знать, как работает программа – правда, с другим подходом.
Реверс-инжиниринг — это восстановление структуры объекта, будь то программа или ее часть. Это делается, когда исходный код программы потерян или он недоступен для публики. Реверс-инжиниринг программного обеспечения - восстановление принципов/алгоритмов программы для того, чтобы понять, как программа работает, и, возможно, воспроизвести этот механизм. У этих действий могут быть следующие цели:
• Анализ вредоносного ПО.
• Поиск закрытых уязвимостей в ПО для последующего создания вирусов или эксплойтов.
• Создание описания для форматов данных или протоколов, используемых в программе.
• Анализ драйверов с закрытым исходным кодом для создания собственных, с открытым кодом.
• Восстановление утраченной информации.
• Выявление побочных эффектов.
Однако взлом программного обеспечения не следует путать с обратный инжиниринг услуги которого сегодня чрезвычайно востребованы: к хакерству относятся такие действия, как возврат функций отладки или модулей, которые были отключены по умолчанию из-за уязвимости или других проблем, а также изучение принципа работы проверки лицензии и ее отключение. Реверсирование, в свою очередь, представляет собой полный анализ работы и поведения программы.
Как работает реверс-инжиниринг?
Обратный инжиниринг можно разделить на программный и аппаратный. Однако последнее нас не интересует, поскольку эта статья относится только к реверс-инжинирингу программного обеспечения. Например, возьмем программу, написанную на языке C++ или Java, которую могут понять другие программисты. Но чтобы запустить его на компьютере, его нужно перевести другой программой, которая называется компилятор, в двоичный код. Скомпилированный код непонятен для большинства программистов, но есть способы превратить машинный код в более удобный для человека формат, используя программный инструмент декомпилятора. Реверс-инжиниринг состоит из нескольких этапов:
• Сбор информации. На этом шаге собирается вся возможная информация (т.е. первоначальная проектная документация и т.п.) о программном обеспечении.
• Изучение информации. Информация, собранная на предыдущем шаге, изучается, чтобы пользователь ознакомился с системой.
• Структуризация. Этот шаг подразумевает идентификацию структуры программы в форме структурной диаграммы, где каждый узел соответствует определенной процедуре.
• Описание функционала. Этот шаг обрабатывает детали каждого модуля структуры. Диаграммы написаны с помощью структурированного языка, такого как таблица решений.
• Запись потоков данных. Из информации, полученной на этапах 3 и 4, выводятся диаграммы потока данных, чтобы показать поток данных между процессами.
• Поток управления записью. Записывается управляющая структура программного обеспечения высокого уровня.
• Предварительный просмотр извлеченного проекта. Извлеченный проектный документ проверяется несколько раз, чтобы обеспечить последовательность и правильность.
• Создание документации. Наконец, на этом этапе вся документация, включая SRS, проектную документацию, историю, проверку и т.п., записывается для дальнейшего использования.
Инструменты реверс-инжиниринга
Как уже упоминалось выше, реверс-инжиниринг часто используется для исследования вирусов и поиска практических решений противодействия им. Для обратного инжиниринга вредоносного кода специалисты используют множество инструментов. Вот некоторые из важнейших:
• Дизассемблеры (например, IDA Pro) . Дизассемблер анализирует программу создания кода сборки. Декомпиляторы могут преобразовывать двоичный код в исходный код, хотя они доступны не для всех архитектур.
• Дебагеры. Реверсеры используют отладчики для управления выполнением программы, чтобы получить представление о том, какие действия она выполняет при запуске. Они также позволяют инженеру контролировать определенные аспекты программы при ее работе, например области памяти программы. Это позволяет лучше понять действия программы и их влияние на систему или сеть.
• Программы просмотра PE (CFF Explorer, PE Explorer) . Например, средства просмотра PE (для формата Windows Portable Executable File) извлекают важную информацию из исполняемых файлов, чтобы обеспечить просмотр зависимостей.
• Анализаторы сети. Анализаторы сети показывают инженеру, как программа общается с другими машинами, в частности какие соединения создает программа и какие данные пытается отправить.