- Главная
- Блог
- Информационная безопасность
- Что такое реверс-инжиниринг
Что такое реверс-инжиниринг
Что такое реверс-инжиниринг?
Реверс инжиниринг - это процесс анализа скомпилированного бинарного файла с целью понять, как программа работает. Программисты, как правило, пишут программы на высокоуровневых языках программирования, таких как C++ или Visual Basic. Т.к. компьютер не может напрямую исполнить код такой программы, код, написанный программистом компилируется в код, непосредственно понятный процессору. Этот код называют машинным кодом. Машинный код тяжел для восприятия и понимания, поэтому реверс-инженеру в процессе его анализа часто требуется прилагать значительные умственные усилия.
В каких случаях реверс-инжиниринг может быть полезен?
Реверс-инжиниринг применятся во многих компьютерных областях, вот только несколько примеров такого применения:
- Сделать возможным взаимодействие с кодом, написанным не вами;
- Взлом платной программы, что бы бесплатно получить полную версию;
- Исследование вирусов и малвари;
- Нахождение и исправление ошибок в программах;
- Добавление функционала в существующее приложение.
В первом случае мы анализируем скомпилированную программу, к исходному коду которой у нас нет доступа, что бы понять, как с ней можно взаимодействовать и как можно использовать ее функции внутри свой программы.
Второй случай – взлом платных программ – является достаточно распространенным явлением. Его суть заключается в отключение ограничений, выполнение регистрации и другие вещи, которые позволяют использовать коммерческий софт бесплатно. Мы обсудим это более подробно.
Третий случай – анализ работы вирусов и малвари. Реверс-инженеринг требуется для таких задач, т.к. немного вирусописателей снабжают свои детища исходным кодом или какой-либо документацией :) Это довольно интересное направление, но оно требует большого количества знаний.
Четвертый случай – исправление ошибок в программах. В любых больших программных продуктах как правило содержатся ошибки и уязвимости и навыки реверс-инжиниринга могут сильно помочь в их поисках и устранении.
Последний случай из рассмотренных нами – добавление функционала в существующие приложения. Лично я думаю, что это довольно весело. Вам не нравится графика в каком-нибудь дизайнерском приложении? Измените ее. Хотите добавить пункт меню с новым функционалом в ваш любимый текстовой редактор? Добавьте. Хотите подшутить над коллегами и добавить всплывающие окна в Windows-калькулятор? Сделайте это. Мы также подробнее затронем этот вопрос позже.
Какие знания нам необходимы?
Как вы вероятно, догадаетесь, что бы быть эффективным реверс-инженером, требуется солидный багаж знаний. Но начать делать какие-то базовые вещи можно и без него. Для новичков требуется знание основ программирования (что такое оператор, что такое условие, цикл и т.д.). Также очень неплохо было бы быть знакомым с ассемблером и иметь базовое представление об архитектуре компьютера. На первых порах потребуется уделить некоторое время осваиванию инструментов, которые используются для реверс-инжиниринга. Эти инструменты оказывают большую помощь, но в свою очередь требуют знаний того, как их грамотно применять. Что бы прокачать навыки в реверс-инжиниринге как и везде требуется делать много практической работы – разбираться со снятием различных пакеров/протекторов/крипторов, изучать программы, написанные на различных языках программирования, обходить анти-отладочные приемы… список можно долго продолжать. В конце этого туториала я привел некоторые ссылки с полезными материалами. Если вы хотите стать хорошим реверс-инженером – требуется заниматься самообразованием.
Какие инструменты использовать?
В процессе реверс-инжиниринга используется множество различных инструментов. Многие их них заточены под какую-то конкретную задачу (снятие определенного упаковщика, например). Некоторые более универсальны. Инструменты можно классифицировать следующим образом:
1. Дизассемблеры
Дизассемблеры берут машинный код, представленный в бинарном формате и отображают его в более удобной для восприятия манере. Они также облегчают процесс идентификации функций, переменных и текстовых строк. Это делает код исполняемого файла более читабельный, нежели мы просто смотрели бы на набор единиц и нулей.
Существует довольно много дизассемблеров, и из них можно выбрать удобный именно для вас и ваших задач. Лично для меня самым лучшим выбором является IDA Pro (hex-rays.com). (Примечание переводчика: обратите также внимание на бесплатный, но мощный дизассемблер Ghidra (https://ghidra-sre.org/)).
2. Отладчики
Отладчики это важнейший инструмент для реверс-инженера. В чем-то их функционал пересекается с дизассемблерами: они также представляют бинарный код в более удобном для восприятия формате. Но помимо этого они также позволяют пошагово исполнять этот код, инструкция за инструкцией, и наблюдать за результатами. Это дает хорошее понимание того, как работает программа. Наконец, некоторые отладчики позволяют изменять некоторые инструкции в коде и потом мы можем еще раз запустить программу уже с этими изменениями. В качестве примера отладчиков можно назвать Windbg, Ollydbg, x64dbg. Лично я предпочитаю Ollydbg, если только не надо отлаживать код на уровне ядра операционной системы.
3. HEX-редакторы
Хекс-редакторы позволяют видеть бинарный код как таковой, а также изменять его. Они также предоставляют такую функцию как поиск определенного набора байтов в бинарном коде. Существует несколько неплохих хекс-редаторов и они по-большей части взаимозаменяемы. В данных туториалах мы обычно не будем прибегать к их использованию, но в некоторых ситуациях хекс-редакторы могут сослужить хорошую службу.
4. Редакторы ресурсов.
Каждый бинарный файл, который должен запускаться в операционной системе содержит в самом своем начале содержит информацию для операционной системы о том, как запускать и инициализировать программу. Там содержится такая информация как сколько памяти требуется данной программе, функции из каких DLL программа использует и т.д.
Для реверс-инженера такие бинарные структуры являются очень важными, поскольку позволяют многое понять об исполняемом файле. Также если вдруг возникнет необходимость изменить поведение программы, вам может понадобится модифицировать эти структуры. Большинство исполняемых файлов также содержит секцию ресурсов. В ней находятся графические изображения, окна меню, иконки и текстовые строки. С помощью редакторов ресурсов мы можем просматривать и менять эти вещи.
5. Системные мониторы
В процессе реверсинга какой-либо программы (особенно вредоносной) часто бывает необходимо узнать, какие изменения эта программа вносит в операционную систему. Создает ли она записи в реестре? Создает ли она текстовые файлы? Запускает ли она новый процессы? Ответы на эти вопросы помогают понять системные мониторы. Примерами таких программ являются procmon, regshot и process hacker.
6. Дополнительные инструменты
Существуют также полезные инструменты, которые не попали в приведенные выше категории. Например, различные скрипты, распаковщики, определители упаковщиков и т.д. Также полезно иметь доступ к документации по API-функциям вашей целевой операционной системы, поскольку программы как правило часто используют подобные функции и реверс-инженеру необходимо знать их назначение.
Давайте начнем прямо сейчас!
Несмотря на то, что мы начинаем с минимальными знаниями мы попробуем сделать что-нибудь практическое прямо в первом туториале. Скачайте себе редактор ресурсов XN Resource Editor. Он бесплатен. Как вы, скорее всего догадались, это программа позволяет просматривать, а также модифицировать ресурсы в исполняемых файлах. Можно делать довольно много вещей: менять название пунктов меню, иконки, графические изображения и т.д. Давайте попробуем.
Для начала запустите XN, нажмите на иконку для открытия файла и выберите файл калькулятора (Windows/System32/calc.exe). Слева вы должны увидеть список:
Вы видите, что в этом списке присутствует раздел Bitmap (графические изображение, которые содержит программа), Menu (пункты меню), String Table, Icon Group и т.д. Попробуйте покликать по этим разделам. Вы можете поменять что-нибудь, но лучше сохраните измененный вариант калькулятора в другом месте, что бы не затрагивать оригинал!
До встречи!
Дополнительные материалы
- С чего начать изучение реверс-инжиниринга;
- Assembly Language for X86 Processors - Хорошая книга для знакомства с ассемблером под x86;
- PE Format - Описание структуры исполняемых файлов под Windows;
- Windows Internals - Книга описывает внутреннее устройство операционной системы Windows;
- Tuts4you.com - Сайт с большим количеством туториалов по реверс-инжинирингу.