Что такое обратная разработка

Что такое обратная разработка

актобарзар яантарбо еокат отЧ

Сегодня разберём один из терминов мира разработки — реверс-инжиниринг и обратную разработку. Вряд ли вам придётся заниматься этим в жизни, но приятно знать о таких штучках.

Сначала вспомним про два вида языков. Это нам пригодится для дальнейшего разговора.

Скриптовые, или интерпретируемые, языки: в них есть код, который построчно «читает» другая программа — интерпретатор. Она шаг за шагом выполняет команды скрипта, и без неё скрипт — это просто символы в файле. Но любой программист может прочитать эти символы и понять, что делает программа. 

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

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

Обратная разработка — это когда берут машинный код и превращают его обратно в команды на знакомом языке программирования. А потом анализируют и разбираются, как там всё работает.

Зачем нужна обратная разработка

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

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

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

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

Какие есть приёмы для этого

Декомпилировать машинный код в язык высокого уровня, например C++. Этот способ может сработать, если мы точно знаем, на каком языке написана программа. В этом случае дизассемблер ищет в машинном коде характерные фрагменты и переводит их в команды на понятном для нас языке программирования. Готовый код будет очень далёк от идеала, в нём будет много странных мест и повторов, но логика будет видна.

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

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

Чем отличается обратный код от исходного

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

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

Что дальше

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

Художник:

Даня Берковский

Корректор:

Ирина Михеева

Вёрстка:

Кирилл Климентьев

Соцсети:

Олег Вешкурцев

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Вам может быть интересно
[anycomment]
Exit mobile version