Основы реверсинга, необходимые инструменты

Автор: Андрей Бирюков. 
Специально для Академии Кодебай

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

Конечно, в рамках четырех статей невозможно рассмотреть все аспекты обратной разработки, поэтому тем, кого заинтересует данная тема я предлагаю пройти обучение на нашем курсе “Реверсивный инжиниринг ПО под Windows”.

Зачем нужен реверсинг

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

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

Конечно, реверсить программы можно не только с благими целями. Злоумышленники тоже могут искать уязвимости в коде, для того, чтобы затем осуществлять атаки с помощью эксплуатации этих уязвимостей. Но если рассматривать представителей “светлой” стороны, то реверсивный инжиниринг требуется программистам, работающим с низкоуровневыми языками программирования (например, разработчикам драйверов).

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

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

А кроме того, читателю должно быть известно, что с 2025 года на объектах критической инфраструктуры не должно использоваться иностранное ПО, то есть в том числе и ОС Windows. В связи с этим есть острая необходимость по созданию аналогов различных решений под российские версии ОС Linux. И здесь технологии обратной разработки также очень востребованы, например для понимания работы различных промышленных протоколов, используемых в автоматизированных системах управления технологическими процессами.

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

Ассемблер и компиляторы

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

Итак, откомпилированное приложение представляет собой машинных кодов, которые понимает процессор. Однако для того, чтобы программистам было удобнее понимать машинные инструкции разработали язык ассемблера, который позволяет использовать более удобные для человека мнемонические (символьные) обозначения команд. Язык ассемблера — язык программирования "низкого уровня". Также существуют языки высокого уровня, такие как Си или Python. Эти языки гораздо удобнее для программирования, так как не требуют для выполнения той или иной команды написания большого количества кода. Однако, для выполнения программы на языке высокого уровня необходимо сначала перевести на язык ассемблера, чтобы компьютер их понял и смог исполнить. Таким образом, для того, чтобы понимать, как работает программа, реверсеру необходимо знать язык ассемблера.

Для написания программ на языке ассемблера нам потребуются компиляторы. Совершенно очевидно, что для того, чтобы научиться реверсингу необходимо уметь программировать на языке ассемблера. Кроме того, зачастую при анализе приложений возникает необходимость написания собственного кода. Так при исследовании приложений на переполнение буфера нам необходимо “скормить” уязвимому приложению произвольный код, который затем оно должно выполнить. Поэтому навык программирования на ассемблере реверсеру необходим.

Наиболее распространенным и что немаловажно бесплатным компилятором для 32 и 64 битной архитектуры является FASM (Flat Assembler). Скачать его можно со страницы проекта: https://flatassembler.net/.

Загружаем архив с последней версией. Никакая установка не требуется, просто распаковываем архив и запускаем файл fasmw.exe. Для проверки корректности работы компилятора откроем в папке, куда был распакован FASM каталог Examples, далее Hello и файл hello.asm.

; example of simplified Windows programming using complex macro features
include 'win32ax.inc' ; you can simply switch between win32ax, win32wx, win64ax and win64wx here
.code
  start:
        invoke MessageBox,HWND_DESKTOP,"May I introduce myself?",invoke GetCommandLine,MB_YESNO
        .if eax = IDYES
                invoke MessageBox,HWND_DESKTOP,"Hi! I'm the example program!","Hello!",MB_OK
        .endif
        invoke ExitProcess,0
.end start

Далее жмем Run и общаемся с диалоговыми окнами. Строго говоря, тот пример кода, который мы выполнили это не совсем чистый Ассемблер, здесь используются так называемые макросы – шаблоны для генерации кода. Один раз создав макрос, мы можем использовать его во многих местах в коде программы. Макросы существенно упрощают жизнь разработчикам, делая процесс программирования на ассемблере более приятным и простым, а код программы получается понятнее, более схожим с кодом на языках высокого уровня.

Однако, как мы увидим дальше, при реверсинге макросы не видны, поэтому представленный выше пример используется лишь для того, чтобы быстро и просто проверить корректность работы компилятора.

Помимо FASM существуют также другие компиляторы, такие как NASM, MASM и другие. Некоторые из них не поддерживают 64-битную архитектуру и давно не используются. На практике синтаксис написания кода может отличаться в зависимости используемого компилятора, однако при необходимости использование другого компилятора.

Отладчики и дизассемблеры

Основными инструментами реверс-инженера являются отладчик и дизассемблер. Разберемся чем эти инструменты отличаются друг от друга.

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

Дизассемблер - это транслятор, преобразующий машинный код, объектный файл или библиотечные модули в текст программы на языке ассемблера.

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

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

Самым известным дизассемблером является IDA – Interactive Disassembler. IDA Pro Disassembler — отличается исключительной гибкостью, наличием встроенного командного языка, поддерживает множество форматов исполняемых файлов для большого числа процессоров и операционных систем.

Для начала можно воспользоваться бесплатной редакцией IDA Free, которую можно загрузить по адресу https://hex-rays.com/ida-free/.

После установки запустим IDA Free, в появившемся окне выберем New и укажем наш файл hello.exe, который был получен в результате компиляции в FASM.

Программа hello.exe в IDA Free

В результате мы получили дизассемлированный вид нашего выполняемого файла.

Теперь поговорим об отладчике. В принципы в IDA тоже есть свой отладчик, но я предлагаю использовать x64dbg в качестве основного средства отладки. Этот отладчик является также бесплатным и работает как в 32 битной, так и в 64 битной архитектуре. Загрузить его можно со страницы https://x64dbg.com/.

После установки отладчик становится доступным при нажатии правой кнопки мыши на любом выполнимом файле. Выберем наш выполнимый файл hello.exe и после нажатия правой кнопки мыши выберем x64dbg.

В открывшемся окне с кодом необходимо один раз нажать Выполнить Иконка . Далее мы увидим как код программы разместился в памяти.

Код программы в памяти

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

Только виртуализация

Для решения крякмиксов можно использовать хостовую машину, так как они не представляют какой-либо угрозы. Однако для анализа различных подозрительных файлов, хакерских инструментов и вредоносов обязательно нужно использовать изолированную среду. Лучше всего использовать виртуальные машины, например Virtual Box или бесплатные редакции VMWare Workstation. При большом желании можно, конечно использовать контейнеры, но тогда необходимо позаботиться о сохранении данных.

В качестве рабочей ОС я обычно использую Windows 7. С одной стороны эта устаревшая ОС поддерживается большинством приложений, включая и вредоносные. С другой стороны, в ней нет “новейших механизмов защиты от Майкрософт” которые по факту только мешают отладке.

REMnux – швейцарский нож реверсера

Можно было бы еще довольно долго рассказывать о различных утилитах для анализа заголовков, энтропии, расшифровки обфусцированных файлов, а можно просто рекомендовать использовать готовый дистрибутив REMnux. Это дистрибутив ОС Linux на основе Ubuntu в котором уже установлено множество различных утилит для реверсинга. Да, приложения под Windows можно анализировать с помощью Linux.

Проще всего, загрузить готовую виртуальную машину в виде виртуального устройства (OVA) с сайта REMnux.org. При разборе крякми в следующих статьях мы будем использовать некоторые из утилит входящих в данный дистрибутив.

Заключение

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

В следующей статье мы разберем несколько crackme, двигаясь от простого к сложному, попутно рассмотрев основы программирования на ассемблере.

Телефон: +7 499 444 17 50 | 8 800 444 17 50 бесплатно по России | E-mail: school@codeby.email
Все курсы Партнерам Возврат Контакты