lublukotov123
lublukotov123
Просветленный
- Регистрация
- 22/03/2025
- Сообщения
- 13
- Репутация
- 2
-
0
- #1
За авторством t.me/doxbotlist
Ревёрс-инжиниринг
Все делается точно так но только наоборот, мы превращаем машинный код в знакомый человеку язык программирования.
Приведу ещё пару примеров где полезна обратная разработка:
Это файлы, которые скачивает браузер при открытии какого либо сайта. Все это - картинки и иконки
Так же программ для реверс энжиринга тоже уйма, тот же всеми знакомый Cheat engine. Вообще, это программа для обратной разработки, но она чаще всего используется у пользователя для накрутки игровой валюты где-нибудь GTA.
Cheat Engine
Дополнительные программы для реверс энжиринга:
IDA pro
Ghidra
x64dbg
Пишем наш код в среде Visual Studio Code
Открываем программу IDA Pro и видим первый экран. Здесь нажимаем кнопку «New», чтобы начать процесс дизассемблирования:
Дальше нужно загрузить файл в программу. На выбор есть два варианта - формат DLL или бинарный файл. У меня будет пример на файле DLL
Теперь вот как выглядит наш дизассемблированный файл. Можно поизучать его и понять, из каких элементов он вообще состоит.
Сначала мы попадаем на вкладку «IDA View-A». Это место, где находится код языка ассемблера нашей переведённой программы. Если приглядеться, то можно увидеть строчку lea rdx, _Val ; "Hello, World". Она показывает, что мы что-то делаем со строкой «Hello, World» - а точнее, вывести её в консоль. Но это очевидно для нас, потому что программа простая. Если бы тут был, скажем, код операционной системы Windows, или какой либо GTA V, то мы бы думали очень долго.
Теперь надо посмотреть что находится в других вкладках программы:
Вкладка «Hex View 1». Тут дизассемблированный код представлен в виде шестнадцатеричных - то есть понятных для компьютера - символов. Если понимать язык нулей и единиц, отсюда можно достать полезную информацию - например, найти повторяющиеся команды или какие-нибудь интересные данные.
Кстати, стоит обратить внимание на функции слева. Они тоже могут дать уйму полезной информации:
по этим функциям можно понять, какие системные вызовы делает программа. Правда, имена этих вызовов не вполне очевидны, поэтому часто приходится искать в интернете, зачем они нужны.
Следующая вкладка - «Structures».
Тут можно подробнее исследовать, как устроены структуры данных в программе. Например, здесь показано, какие классы вызываются, какие типы переменных они используют и какие исключения обрабатывают.
Ревёрс-инжиниринг
Что такое ревёрс-инжиниринг вообще?
Представим что вы программист, и вас есть задача узнать как работает прототип какой либо программы, но у вас есть только файл в формате ехе.
Будет не просто решить если вы будете размышлять в парадигме "прямой" разработки. Она состоит из:- Человек пишет код на понятном для него языке - например, Java, Python или C#;
- затем он передает файл компилятору, который превращает код из понятного для человека в бинарный файл - чтобы его мог прочитать компьютер;
- Пользователь скачивает скомпилированную программу - например, в вышеупомянутом формате EXE и запускает её на компьютере.
Именно для этого и придумали ревёрс-инжиниринг!
Все делается точно так но только наоборот, мы превращаем машинный код в знакомый человеку язык программирования.
Как это работает?
- Сначало разработчик получает исполняемый файл, который понимает только компьютер;
- затем он пропускает этот файл через специальную программу и превращает в код на знакомом ему языке программирования;
- Дальше человек изучает этот файл и пытается разобраться во внутреннем устройстве и работе программы.
Так выглядит код программы которая прошла через ревёрс-инжиниринг:
Приведу ещё пару примеров где полезна обратная разработка:
- Разработка модов для игр. В видеоиграх обратная разработка позволяет создавать модификации для игр и изменять игровой процесс: добавлять новые функции и контент. Например, таким образом создавались моды для игр The Elder Scrolls V: Skyrim и Grand Theft Auto 5.
- Изучение старых технологий. Иногда бывает, что оригинальная документация для приложения утеряна либо программа написана для старых компьютеров, которые больше не производятся. Поэтому разработчикам приходится с нуля воссоздавать код приложений.
Мы разобрались с вами о том, что такое ревёрс-инжиниринг. Теперь разберем способы как она именно происходит
- Перевести бинарный файл в код на языке высокого уровня. Для этого существуют специальные программы -дизассемблеры. Они понимают, как устроен машинный код, и без проблем могут перевести его на удобный для нас язык программирования-например, C++. Но единственный минус работы дизассемблера в том, что в готовом коде часто нет названий переменных и комментариев, поэтому после процедуры разработчику нужно будет довольно долго разбираться, за что отвечают отдельные блоки кода.
- Перевести бинарный файл в код на языке ассемблера. Ассемблер - язык более высокого уровня, чем машинный код, но гораздо более низкого, чем привычные нам JavaScript и Python. Любой процессор умеет работать с ассемблером, поэтому для компьютера этот способ расшифровки бинарного файла - самый простой. Чтобы прочитать код, написанный на ассемблере, нужно разбираться в том, как устроен процессор.
- Изучить, какие данные программа пересылает по Сети или внутри компьютера. Обычно программы обмениваются данными по интернету или внутри операционной системы. Поэтому, чтобы понять, как устроена программа, ревёрс-инженеры используют специальные сетевые анализаторы. Существует сетевой анализатор, встроенный прямо в Хром. Чтобы его открыть, нужно зайти в инструменты разработчика нажав F12 и перейти на вкладку «Network».
Это файлы, которые скачивает браузер при открытии какого либо сайта. Все это - картинки и иконки
Теперь, когда мы знаем основные способы обратной разработки, давайте перейдём к самому процессу - этапам ревёрс-инжиниринга. Всего их четыре.
- Для начала нам стоит "попробовать программу". Провести предварительное исследование. Сначала нужно внимательно изучить программу: понажимать все кнопки, попользоваться всеми функциями. Это поможет составить цельную картину того, как работает приложение.
- Начать разборку. Теперь мы должны посмотреть внутрь программы и узнать, как она устроена. Для этого как раз применяем один из способов обратной разработки, а затем изучаем полученный код.
- Провести анализ. Когда мы разобрались, какие в программе есть алгоритмы и структуры данных, пора собирать всё вместе. Мы изучаем все части и пытаемся понять, как они работают вместе. Например, смотрим, в какой последовательности выполняются методы в коде.
- Далее остаётся всего лишь задокументировать функциональность. Нужно записать,что делают функции, какие переменные они принимают и куда отправляют данные.
Как освоить ревёрс-инжиниринг: самые первые шаги
Попробуйте изучить обратную разработку на ваших проектах, либо же решить задачу на специальных сайтах - возьмём в пример CrackmesТак же программ для реверс энжиринга тоже уйма, тот же всеми знакомый Cheat engine. Вообще, это программа для обратной разработки, но она чаще всего используется у пользователя для накрутки игровой валюты где-нибудь GTA.
Cheat Engine
Дополнительные программы для реверс энжиринга:
IDA pro
Ghidra
x64dbg
И последний этап, практика:
- В качестве примера покажу, как выглядит обратная разработка в программе IDA Pro. Напишем код «Hello, World» на C++, скомпилируем его и попробуем расшифровать с помощью приложения.
Пишем наш код в среде Visual Studio Code
Открываем программу IDA Pro и видим первый экран. Здесь нажимаем кнопку «New», чтобы начать процесс дизассемблирования:
Дальше нужно загрузить файл в программу. На выбор есть два варианта - формат DLL или бинарный файл. У меня будет пример на файле DLL
Теперь вот как выглядит наш дизассемблированный файл. Можно поизучать его и понять, из каких элементов он вообще состоит.
Сначала мы попадаем на вкладку «IDA View-A». Это место, где находится код языка ассемблера нашей переведённой программы. Если приглядеться, то можно увидеть строчку lea rdx, _Val ; "Hello, World". Она показывает, что мы что-то делаем со строкой «Hello, World» - а точнее, вывести её в консоль. Но это очевидно для нас, потому что программа простая. Если бы тут был, скажем, код операционной системы Windows, или какой либо GTA V, то мы бы думали очень долго.
Теперь надо посмотреть что находится в других вкладках программы:
Вкладка «Hex View 1». Тут дизассемблированный код представлен в виде шестнадцатеричных - то есть понятных для компьютера - символов. Если понимать язык нулей и единиц, отсюда можно достать полезную информацию - например, найти повторяющиеся команды или какие-нибудь интересные данные.
Кстати, стоит обратить внимание на функции слева. Они тоже могут дать уйму полезной информации:
по этим функциям можно понять, какие системные вызовы делает программа. Правда, имена этих вызовов не вполне очевидны, поэтому часто приходится искать в интернете, зачем они нужны.
Следующая вкладка - «Structures».
Тут можно подробнее исследовать, как устроены структуры данных в программе. Например, здесь показано, какие классы вызываются, какие типы переменных они используют и какие исключения обрабатывают.
