reverse engineering что это такое

Реверс-инжиниринг для начинающих: основные концепции программирования

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

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

Примечание Программный код для этой статьи компилируется с помощью Microsoft Visual Studio 2015, так что некоторые функции в новых версиях могут использоваться по-другому. В качестве дизассемблера используется IDA Pro.

Инициализация переменных

Переменные — одна из основных составляющих программирования. Они делятся на несколько видов, вот некоторые из них:

Примечание в С++ строка — не примитивная переменная, но важно понять, как она будет выглядеть в машинном коде.

Давайте посмотрим на ассемблерный код:

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Здесь можно увидеть как IDA показывает распределение пространства для переменных. Сначала под каждую переменную выделяется пространство, а потом уже она инициализируется.

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

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

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Инициализация строковой переменной в C++

Для инициализации строки требуется вызов встроенной функции.

Стандартная функция вывода

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

27–29 декабря, Онлайн, Беcплатно

Теперь посмотрим на машинный код. Сначала строковый литерал:

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Вывод строкового литерала

Теперь посмотрим на вывод одной из переменных:

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Математические операции

Сейчас мы поговорим о следующих математических операциях:

Переведём каждую операцию в ассемблерный код:

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Для сложения мы используем инструкцию add :

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

При вычитании используется инструкция sub :

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

При умножении — imul :

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

При поразрядной конъюнкции используется инструкция and :

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

При поразрядной дизъюнкции — or :

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

При поразрядном исключающем ИЛИ — xor :

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Поразрядное исключающее ИЛИ

При поразрядном отрицании — not :

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

При битовом сдвиге вправо — sar :

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Битовый сдвиг вправо

При битовом сдвиге влево — shl :

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Битовый сдвиг влево

Вызов функций

Мы рассмотрим три вида функций:

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Вызов функций без параметров

Функция newfunc() просто выводит сообщение «Hello! I’m a new function!»:

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Вызов такой функции выглядит следующим образом:

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Вызов функции с параметрами

Посмотрим на код функции:

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Циклы

Теперь, когда мы изучили вызов функции, вывод, переменные и математику, перейдём к контролю порядка выполнения кода (flow control). Сначала мы изучим цикл for:

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Графический обзор цикла for

Прежде чем разбить ассемблерный код на более мелкие части, посмотрим на общий вариант. Как вы можете видеть, когда цикл for запускается, у него есть 2 варианта:

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Теперь давайте взглянем на цикл while :

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

В этом цикле генерируется случайное число от 0 до 20. Если число больше 10, то произойдёт выход из цикла со словами «I’m out!», в противном случае продолжится работа в цикле.

Условный оператор

Теперь поговорим об условных операторах. Для начала посмотрим код:

Посмотрим на ассемблерный граф:

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Ассемблерный граф для условного оператора

Оператор выбора

Оператор выбора очень похож на оператор условия, только в операторе выбора одна переменная или выражение сравнивается с несколькими «случаями» (возможными эквивалентностями). Посмотрим код:

Оператор выбора не следует правилу «Если X, то Y, иначе Z» в отличии от условного оператора. Вместо этого программа сравнивает входное значение с существующими случаями и выполняет только тот случай, который соответствует входному значению. Рассмотрим два первых блока подробней.

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Два первых блока оператора выбора

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Если var_D0 (A) равно 5, то код перейдёт в секцию, которая показана выше, выведет «5» и затем перейдёт в секцию возврата.

Пользовательский ввод

В этом разделе мы рассмотрим ввод пользователя с помощью потока сin из C++. Во-первых, посмотрим на код:

Разберём это в машинном коде. Во-первых, функция cin :

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Функция C++ cin детальнее

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Мы рассмотрели лишь основные принципы работы программного обеспечения на низком уровне. Без этих основ невозможно понимать работу ПО и, соответственно, заниматься его исследованием.

Источник

Что такое реверс-инжиниринг?

Реверс-инжинирингом называют процесс, при котором физический объект разбирают на части и измеряют. Таким образом можно понять, как он был изготовлен, из каких компонентов состоит и как работает. Объектом может быть примерно всё: от огромного авианосца или инженерного сооружения вплоть до крошечных элементов часового механизма.

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Введение

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

Целью реверс-инжиниринга обычно является создание 3D-модели, которую можно использовать в CAD-приложениях. При правильном подходе реверс-инжиниринг дает возможность применять полученную информацию о конструкции объекта для решения целого ряда задач:

Как получить данные для реверс-инжиниринга

3D-сканирование снятого с производства поворотного круга с помощью Artec Eva. Впоследствии 3D-сканы экспортировали в программу для реверс-инжиниринга Geomagic Design X и перевели их в цельную модель, которую затем использовали для производства аналогичной детали.

Хотя время от времени, чтобы получить данные для реверс-инжиниринга, используются другие методы (как аналоговые, так и цифровые), всё же самыми популярными на сегодняшний день являются 3D-сканеры, координатно-измерительные машины и КТ-сканирование. В зависимости от сферы применения у каждого метода есть свои плюсы и минусы. Многое определяется бюджетом, опытом работы с выбранной технологией и временем, выделенным на реализацию проекта.

Полигональная 3D-модель поворотного круга, созданная на основе сканов Artec Eva

Готовая к реверс-инжинирингу CAD-модель поворотного круга

КТ-сканирование

КТ-сканирование — это эффективный способ провести измерение как внешней, так и внутренней поверхности объекта. КТ считается популярным инструментом медицинской диагностики. Однако этот метод также может быть подходящим решением для реверс-инжиниринга (в определенных ситуациях и для определенных сфер применения). Компьютерный томограф собирает информацию о форме объекта с помощью рентгеновского излучения. Поскольку рентгеновские лучи проходят сквозь объект, можно не беспокоиться о том, как лучше его расположить. Рентген может «увидеть» все внутренние, закрытые участки, например, поры и другие полости. Излучение в виде конусов (либо срезов) проходит сквозь объект; собираемые данные формируются в слои и собираются в цельную 3D-модель.

Промышленный компьютерный томограф EasyTom. Изображение предоставлено компанией CyberOptics Corporation

Однако у томографов тоже есть недостатки. Поскольку для анализа детали они используют радиацию, сканируемый объект должен помещаться внутри специальной камеры томографа (чтобы рентгеновские лучи не могли проникнуть наружу и навредить оператору, эта камера полностью герметичная). Это ограничение не позволяет оцифровывать большинство объектов среднего и крупного размера.

В то время как преимуществом томографа является возможность оцифровывать как внешние, так и внутренние поверхности, эта технология подходит только для сканирования ограниченного числа промышленных объектов.

Кроме того, что цена на надежный томограф может достигать 250 000 долларов США и даже больше, а также что для работы с ним требуются специально обученные операторы, полученные таким образом сканы металлических объектов и даже деталей с металлическими компонентами могут содержать большое количество шума. Это связано с тем, что металл поглощает и рассеивает рентгеновские лучи, что значительно снижает точность сканов. Металлы с низкой плотностью (например, алюминий) сканировать намного проще, чем, например, сталь.

В идеале объект должен быть небольшого размера, состоять из пластика или из металла низкой плотности. В противном случае КТ-сканирование может потребовать несколько дополнительных часов на обработку сканов, только чтобы удалить артефакты и попытаться восстановить точные размеры объекта. Есть вероятность, что вы вообще не сможете оцифровать деталь, если она имеет неподходящий размер или плотность материала.

Контактное измерение (координатно-измерительные машины)

Координатно-измерительные машины (КИМ) отличаются исключительной точностью полученных данных и подходят как для контроля качества, так и для реверс-инжиниринга. Они используют заранее запрограммированные или контролируемые оператором датчики, которые записывают серию XYZ-координат массива точек на поверхности объекта, а затем шаг за шагом реконструируют его видимую геометрию.

Два инженера проверяют компонент производственной установки с помощью КИМ

При высокой стоимости оборудования и сопутствующих расходах КИМ может быть эффективным решением для съемки объектов различного размера, выполненных из разных материалов.

Большинство КИМ представляют собой очень тяжелые устройства, которые обычно устанавливаются в одном помещении, откуда их очень сложно (а иногда даже невозможно) транспортировать в другой цех или компанию, если вдруг возникает такая необходимость. Из-за этого КИМ невозможно отвезти к клиенту, чтобы отсканировать объект там, где ему удобно, или же отправиться с такой машиной в другую страну (конечно, если необходимое качество данных не может обеспечить портативная КИМ). Кроме того, для работы с таким оборудованием требуются специально обученные операторы, а для настройки и перепрограммирования необходимо довольно много времени. Помимо этого, КИМ нужно тщательно оберегать от случайных ударов, толчков и вибраций, которые могут полностью сорвать проект, если останутся незамеченными.

Контакт с поверхностью гарантирует исключительную точность 3D-данных, собираемых датчиком КИМ. Однако есть и недостатки: данные собираются с низкой скоростью, машина не способна анализировать участки поверхности, до которых не может добраться датчик, существует риск серьезно повредить некоторые хрупкие объекты и т. п.

Поскольку самые распространенные типы датчиков КИМ непрерывно соприкасаются с поверхностью измеряемого объекта, стоит упомянуть и потенциальный риск повреждений и неточностей. Существует очень много материалов, которые могут повреждаться из-за воздействия датчика: на их поверхности могут появляться царапины, потертости или шероховатости. Риск деформации абсолютно недопустим при работе с очень дорогими или бесценными объектами, включая музейные экспонаты, раритеты из частных коллекций и др.

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

3D-сканирование

Для сотен тысяч пользователей во всем мире профессиональные 3D-сканеры всех типов (настольные, портативные и устанавливаемые на штатив) являются надежным решением для реверс-инжиниринга и других задач. В то время как томографы и КИМ имеют высокую цену, практически лишены мобильности и требуют солидного опыта работы, лучшие 3D-сканеры отличаются противоположными качествами.

Сканирование с помощью структурированной подсветки

3D-сканеры на основе технологии структурированной подсветки снимают объект путем направления на его поверхность пучка света с определенным паттерном. Когда свет возвращается к датчикам сканера, устройство анализирует искажения паттерна, возникшие при контакте с поверхностью, и преобразует их в точные цифровые копии объекта в программе этого сканера. Такая цифровая копия в формате полигональной 3D-сетки может затем использоваться для создания CAD-модели, используемой для реверс-инжиниринга этого объекта.

3D-сканирование днища Volvo XC90 с помощью Artec Leo для реверс-инжиниринга выхлопной системы кроссовера

Одним из главных преимуществ использования 3D-сканеров на базе технологии структурированной подсветки является высокая скорость съемки. В отличие от КИМ или фотограмметрии, новейшие профессиональные 3D-сканеры со структурированной подсветкой могут за считанные минуты оцифровывать даже крупные объекты, причем с субмиллиметровой точностью и без контакта с поверхностью. В зависимости от модели сканера, луч света, который вы направляете на объект в процессе оцифровки, будет снимать от 1 миллиона до 3 миллионов точек в секунду.

Обработка скана ходовой части Volvo XC90 в Artec Studio

При работе с 3D-сканером на базе технологии структурированной подсветки вы сразу видите результаты съемки на экране ноутбука или сканера и можете рассмотреть каждый оцифрованный участок или область. Если что-то пропустили, то можно просто сделать еще одно-два движения сканером, чтобы заполнить прогалы.

Наконец, 3D-сканеры со структурированной подсветкой совершенно безопасны в использовании: они не вредят ни оператору, ни тем, кого он снимает. Это одна из главных причин, по которой такие 3D-сканеры широко используются в сфере здравоохранения.

Лазерные сканеры для крупных объектов и панорам

Устанавливаемые на штатив лазерные 3D-сканеры (лидары) можно разделить на две категории: времяпролетные и фазовые. Первые направляют лазерный луч на объект или площадку, на которой находятся несколько объектов, а затем высчитывают точное расстояние до него, фиксируя время, за которое свет вернулся к датчику сканера. Датчик также анализирует интенсивность излучения.

Фазовые лидары направляют равномерный луч лазера в нескольких разных фазах. Когда луч возвращается обратно к датчику сканера, изменения света анализируются специальными алгоритмами обработки и используются для определения точного расстояния между сканером и снимаемым объектом и/или площадкой.

Подготовка устанавливаемого на штатив устройства Artec Ray для 3D-сканирования палубы плавучей платформы

На основе полученных данных создается цифровое изображение объекта или панорамы в виде облака точек с высоким разрешением. Затем эти облака точек можно перевести в полигональные сетки с помощью программы для сканирования. 3D-сетки можно использовать в самых разных целях, включая создание CAD-моделей для реверс-инжиниринга, виртуальные транспарентные модели, поэтажные планы зданий и т. п.

Лазерные 3D-сканеры с увеличенным рабочим расстоянием могут легко оцифровывать крупные и даже огромные объекты и панорамы, причем делают это с невероятной точностью. Лучшие сканеры этого типа имеют рабочее расстояние от одного до 100+ метров. Они используются для создания метрологически точных 3D-моделей автомобилей, реактивных самолетов, суперъяхт и даже целых заводских цехов.

Благодаря надежному ПО для 3D-сканирования данные с лазерных сканеров с увеличенным радиусом действия можно легко объединить со сканами портативных 3D-устройств, чтобы создать цельную 3D-модель, в которой не будет пропущен ни один важный элемент объекта или панорамы. Хорошим примером может послужить реверс-инжиниринг современного пассажирского самолета с помощью лазерного сканера, который отснял конструкцию воздушного судна, и портативного 3D-сканера, который оцифровал приборную панель и сложные детали в кабине пилотов и салоне.

Простота использования, непревзойденные возможности сканирования

Настольные, портативные 3D-сканеры со структурированной подсветкой и лазерные устройства с увеличенным рабочим расстоянием настолько просты в использовании, что даже студенты всего за несколько часов могут научиться оцифровывать и крупные, и мелкие объекты. Именно благодаря портативности их можно использовать в помещении, на улице и вообще там, где это удобно клиенту (как бы далеко ни пришлось везти сканер).

По сравнению с томографам и КИМ, использование которых подразумевает значительные временные затраты, настольные и портативные 3D-сканеры могут оцифровать те же объекты в разы быстрее, что существенно снижает нагрузку на оператора и повышает продуктивность. Устанавливаемые на штатив лазерные сканеры еще более удобны в использовании: вы просто ставите штатив в нужное место и запускаете сканирование.

3D-сканеры являются незаменимыми инструментами для большинства задач, связанных с реверс-инжинирингом. Лучшие сканеры отличаются высокой скоростью работы, безопасностью и простотой использования. Они способны с субмиллиметровой точностью оцифровывать самые разные объекты (от мелких до крупных).

Чтобы полностью реконструировать всю поверхность объекта, включая углубленные участки и компоненты, при необходимости можно отсканировать их дважды.

Итак, профессиональные 3D-сканеры (настольные, портативные и лазерные с увеличенным радиусом действия) являются надежным решением для реверс-инжиниринга объектов самого разного плана: от кольца с бриллиантом вплоть до таких объектов, как тяжелая техника, самолеты и здания.

Источник

Реверс-инженер: кто это, обязанности, зарплаты и как им стать в 2021 году. Обзор профессии.

Кто такой реверс-инженер?

Реверс-инженер (reverse engineer) — это специалист по обратной разработке, который исследует готовое устройство/программу и документацию для того, чтобы понять принцип работы или найти уязвимости, а в последующем сделать изменение или воспроизвести устройство, программу или иной продукт с такими же функциями, но без прямого копирования.

Что делают реверс-инженеры и чем занимаются?

Обязанности на примере одной из вакансий:

Что должен знать и уметь реверс-инженер?

Требования к реверс-инженерам:

Востребованность и зарплаты реверс-инженеров

На сайте поиска работы в данный момент открыто 197 вакансий, с каждым месяцем спрос на реверс-инженеров растет.

Количество вакансий с указанной зарплатой реверс-инженера по всей России:

Вакансий с указанным уровнем дохода по Москве:

Вакансий с указанным уровнем дохода по Санкт-Петербургу:

Как стать реверс-инженером и где учиться?

Варианты обучения для реверс-инженера с нуля:

Ниже сделали обзор 3 лучших онлайн-курсов.

3 лучших курсов для обучения реверс-инженера: подробный обзор

1 место. Курс «Reverse-Engineering» — OTUS

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Вы освоите на практике важнейшие приемы реверс-инжиниринга: статический и динамический анализ. Познакомитесь с низкоуровневым и системным программированием, подробно разберете аспекты внутреннего устройства Windows. Вам предстоит изучить и классифицировать вредоносное ПО на примерах реальных malware, выловленных в сети.

Реверс-инжиниринг кода (обратная разработка кода) — это процесс анализа машинного кода программы, который ставит своей целью понять принцип работы, восстановить алгоритм, обнаружить недокументированные возможности программы, и т.п. Основные методы реверс-инжиниринга — это статический или динамический анализ кода. При статическом анализе исследователь дизассемблирует код программы, используя специальное ПО, и далее анализирует ассемблерный код. При динамическом анализе исследователь запускает код в изолированной среде (песочнице) или отладчике и анализирует код в динамике.

Для кого этот курс?

Как проходит практика?

Студенты заранее получают стенды и разворачивают их у себя локально до начала занятия. Практику вы будете выполнять у себя на виртуальной машине во время вебинара под руководством преподавателя. На курсе вас ждет:

Программа обучения:

Модуль 1. Низкоуровневое программирование наассемблер под x8086/x64.

Модуль 2. Низкоуровневое программирование наассемблер под MIPS.

Модуль 3. Защищённый режим процессора

Модуль 4. Внутреннее устройство Windows

Модуль 5. Системное программирование

Модуль 6. Обратная разработка программ

Модуль 7. Проектный модуль

Выпускной проект:
Вместе с участниками группы по ходу курса мы «разревёрсим» несколько реальных вредоносных программ, определим их функционал и в качестве выпускного проекта напишем программу для лечения.

После обучения вы

Источник

Reverse engineering: обратная разработка приложений для самых маленьких

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Выделяют 4 методики проведения обратной разработки:

анализ обмена данными приложения, с помощью различных анализаторов трафика;

использование режима отладки для поиска нужных участков кода и просмотра данных с которыми работает приложение;

дизассемблирование машинного кода программы (изучение требует довольно много времени);

декомпиляция кода программы для создания исходного кода программы на языке программирования высокого уровня.

Установка

Рекомендуемым разработчиками способом установки и обновления Radare2 является установка из официального git-репозитория. Предварительно в системе должны присутствовать установленные пакеты git, build-essential и make.

Запуск установки рекомендуется производить не из под пользователя root, иначе скрипт сам произведёт понижение привилегий.

Далее устанавливаем графическую оболочку для Radare2. Мы будет устанавливать официальный GUI под названием Iaito. Установим пакеты, необходимые для установки Iaito:

Для дистрибутивов Linux на базе Debian, есть готовые пакеты, ссылки на которые можно взять тут. Скачаем и установим нужную версию пакета:

Теперь установим плагин r2ghidra, который является интеграцией декомпилятора Ghidra для Radare2. Плагин не требует отдельной установки Ghidra, так как содержит в себе всё необходимое. Для установки плагин доступен в качестве r2pm пакета:

Установленный плагин автоматически интегрируется в GUI Iaito. После установки запускаем графическую оболочку и если все сделали правильно, то видим стартовый экран:

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Теперь мы можем заняться нашим примером. Суть программы-примера заключается в следующем: при запуске на экране выводится некий токен, необходимый для того, чтобы зафиксировать выполнение задания и приватный SSH ключ. Но что-то пошло не так и в результате ключ выводится в некорректном виде, а токен не принимается в качестве правильного.

Первый запуск программы-примера

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Открываем файл в Iaito, оставляем настройки анализа по умолчанию:

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

После того, как Radare2 проанализирует файл, смотрим результат, открывшийся во вкладке Dashboard:

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Программа скомпилирована под 64-битную версию Linux, написана на языке C. Слева мы видим список функций, которые Radare2 смог обнаружить. Среди них импортируемые из библиотеки libc функции printf, puts и putchar, выводящие на экран строку по формату и символ.

Функция main – это главная функция программы. Выполнение начинается с неё. Кликнув два раза по её названию, открывается вкладка Disassembly с результатом её дизассемблирования:

Немного про Ассемблер

Команды ассемблера

Каждая команда Ассемблера — это команда для процессора. Синтаксис команды состоит из нескольких частей:

Или рассмотрим другой пример как выглядит возведение числа в степень в Ассемблере:

Это же действие будет выглядеть на языке высокого уровня, например, Си как:

Вернемся к нашему заданию

Для большего понимания логики выполнения программы можно переключиться на вкладку Graph внизу окна. Там мы увидим блоки команд функции, в которой мы находимся, и переходы между ними, построенные Radare2 на основе команд условных и безусловных переходов.

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Масштабирование на этой вкладке выполняется сочетаниями клавиш Ctrl+»-» и Ctrl+»+». Можно было бы начать разбираться в работе программы уже с этого места, но есть возможность посмотреть на программу в ещё более “читаемом” виде. Переключаемся на вкладку Decompiler, внизу окна и видим псевдокод, полученный в результате декомпиляции (восстановление до кода на языке, на котором программа была написана, в нашем случае – язык C) средствами встроенного декомпилятора Radare2.

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

В полученном тексте всё ещё много упоминаний регистров и безусловных переходов. Переключимся на декомпилятор Ghidra, который мы ранее установили. Для этого в правом нижнем углу окна в выпадающем списке выберем “pdg” вместо “pdc”.

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Теперь код программы стал практически полностью читаем, за исключением имён переменных.

В коде мы видим, что сначала выводится строка “Token:”, после чего происходит вызов некой функции с двумя параметрами, после которого идёт цикл с переменной var_8h, которая проходит значения от 0 до 14 включительно и выводит что-то посимвольно, основываясь на адресе памяти 0x5020 и счётчике с множителем 8. Из этого можно сделать вывод, что в памяти, начиная с адреса 0x5020, расположен массив структур из 15 значений размером 8 байт. Также стоит обратить внимание, что адрес 0x5020 передавался в качестве первого параметра в функцию, вызываемую перед этим циклом. Будем для простоты далее называть его “токен”. Далее по коду выводятся строки начала закрытого ключа и в цикле выводится посимвольно закрытый ключ. Внутри цикла вывода ключа идёт повторяющийся цикл по обнаруженному нами ранее массиву структур, используя переменную var_ch. Перед выводом на экран над каждым символом закрытого ключа производится операция исключающего ИЛИ (XOR) с текущим символом токена. После цикла выводится строка, завершающая закрытый SSH ключ. Исходя из того, что выводимый программой токен не является правильным, можно сделать вывод, что что-то происходит не так в ранее обнаруженной нами функции с двумя параметрами fcn.00001189, вызываемой перед выводом токена на экран. Перейдём на неё, дважды кликнув по названию функции в списке слева.

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

В полученном после декомпиляции коде функции мы видим, что она представляет из себя двойной цикл с параметром, в котором после сравнения двух значений элементов структуры происходит их обмен местами, если одно значение меньше другого. Больше всего это похоже на алгоритм сортировки. В частности, на одну из реализаций сортировки “пузырьком”. Основываясь на информации об алгоритме сортировки “пузырёк” и полученном нами коде, можно сделать вывод, что условие выхода из вложенного цикла написано с ошибкой. Проход осуществляется не до конца массива структур.

Получается, нужно это исправить. Переключимся на вкладку дизассемблера:

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

В полученном коде мы видим только одну команду вычитания 8:

Переключимся в режим графа, чтобы соотнести ассемблерный код с результатом декомпиляции:

Представление в виде графов

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Проанализировав логику переходов и соотнеся её с ассемблерным кодом подтверждаем, что нас интересует именно эта область функции.

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

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

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

По относительному адресу команды 0x00001211 убеждаемся, что курсор стоит там, где необходимо. Выделяем 4 байта, начиная с адреса 0x00001211 и справа выберем вкладку “Parsing”. Увидим результат дизассемблирования выделенных байт.

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Теперь нужно заменить выделенные байты на 4 байта со значением 90 (шестнадцатиричное значение машинного кода команды nop), но тут мы сталкиваемся с тем, что в Iaito нельзя просто так отредактировать шестнадцатиричное значение по адресу. Список доступных действий мы можем увидеть, нажав на выделенных байтах правую кнопку мыши.

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Да, можно воспользоваться сторонним hex-редактором, но это было бы “неспортивно”. Так как мы пробуем выполнить все действия только в рамках функционала Radare2, то будем использовать что есть.

Сначала выберем “Write zeros”. Iaito напомнит нам, что файл открыт в режиме “только для чтения” и предложит переоткрыть его либо в режиме для записи, либо включить режим кэширования. В режиме кэширования все изменения к исходному файлу будут применяться только после выбора пункта меню “File → Commit changes”.

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Выберем режим кэширования, после чего снова попытаемся записать нули. И теперь это у нас получается. На каждом из четырёх байт выберем из контекстного меню пункт “Edit → Increment/Decrement” и добавим значение 144 (десятичную запись шестнадцатиричного числа 90).

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

Смотрим на получившийся результат:

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

После внесения изменений не забываем нажать “File → Commit Changes”. Запускаем ещё раз программу dechip, чтобы посмотреть результат наших действий:

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

reverse engineering что это такое. Смотреть фото reverse engineering что это такое. Смотреть картинку reverse engineering что это такое. Картинка про reverse engineering что это такое. Фото reverse engineering что это такое

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

Заключение

В целом, бесплатный аналог IDA Pro в лице Radare2 является довольно неплохим решением. Однако, официальный GUI Radare2 хоть и позволяет удобно перемещаться между инструментами Radare2 и в части отображения информации удобнее консольной версии, но в то же время он ещё недостаточно доработан и не предоставляет всех возможностей, которые можно реализовать через консоль. Со всеми возможностями консольной версии можно ознакомиться в официальной книге по Radare2.

Что касается обратной разработки, то он оказался совсем не страшным и даже при начальном уровне знания языка Ассемблер можно разбираться в устройстве какого-нибудь простенького приложения. А в Корпоративных лабораторияx Pentestit можно попробовать свои силы не только в реверс-инжинеринге бинарных файлов, но и в деассемблировании Android/IOS приложений.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *