Моделирование и анализ программного обеспечения Обратное проектирование. Дизассемблирование Обратное проектирование. Дизассемблирование Обратная разработка, или реверсивный инжиниринг, - это исследование программного обеспечения с целью изучения принципов его работы. Это может быть необходимо, когда исходный код не доступен, и мы имеем только откомпилированный выполняемый файл. Зачем нужен реверсинг? Код практически любого приложения может содержать ошибки. Самый простой способ исправить эти ошибки, это найти в исходном коде проблемную команду или функцию и внести соответствующие исправления в код. Но что делать, когда по тем или иным причинам исходный код нам не доступен? Например, если у нас имеется только откомпилированный выполнимый файл - артефакт. Результатом обратной разработки является построение детального алгоритма работы программы, а также выявление уязвимостей и других интересующих исследователя аспектов работы программного обеспечения. Как правило, обратная разработка применяется в тех случаях, когда на программное обеспечение отсутствует какая-либо документация и исходный код, и имеются только откомпилированные исполняемые файлы. Конечно, реверсить программы можно не только с благими целями. Злоумышленники тоже могут искать уязвимости в коде, для того, чтобы затем осуществлять атаки с помощью эксплуатации этих уязвимостей. Но если рассматривать представителей "светлой" стороны, то реверсивный инжиниринг требуется программистам, работающим с низкоуровневыми языками программирования (например, разработчикам драйверов). Также обратная разработка нужна тем, кто занимается поиском уязвимостей с целью улучшения защищенности программного обеспечения - багхантерам. Не стоит забывать, что вредоносный код это тоже программное обеспечение, и его также необходимо реверсить для выявления принципов заражения и для того, чтобы понять, как от них можно защищаться. Этим задачами занимаются вирусные аналитики. Кроме того, с 2025 года на объектах критической инфраструктуры не должно использоваться иностранное ПО, то есть в том числе и ОС Windows. В связи с этим есть острая необходимость по созданию аналогов различных решений под российские версии ОС Linux. И здесь технологии обратной разработки также очень востребованы, например, для понимания работы различных промышленных протоколов, используемых в автоматизированных системах управления технологическими процессами. Обратное проектирование. Дизассемблирование Инструменты для реверса приложения: Ассемблер Исходный код с помощью компилятора переводится в двоичный машинный код который выполняет процессор, машинный код человеку читать не удобно. Ассемблер представляет команды процессора в виде, доступном для чтения человеком. Язык ассемблера считается языком программирования низкого уровня в противовес высокоуровневым языкам, не привязанным к конкретной реализации вычислительной системы. Программы, написанные на языке ассемблера, однозначным образом переводятся в инструкции конкретного процессора и в большинстве случаев не могут быть перенесены без значительных изменений для запуска на машине с другой системой команд. Обратное проектирование. Дизассемблирование На данном примере показано как выглядит исходный код переведенный компилятором в машинный код и справа представлен все тот же код программы на языке ассемблера. В данном случае применяется ассемблер для процессора архитектуры x86-64. Разберем работу программы: Обратное проектирование. Дизассемблирование Команда MOV команда пересылки данных, которая пересылает один байт или слово данных из памяти в регистр, из регистра в память или из регистра в регистр Команда CMP сравнение двух операндов Команда END в ассемблере отмечает последнюю строку программы, которая будет обработана ассемблером. Кроме того, в ней указывается имя точки входа в программу — адрес, по которому операционная система передаст управление программе при ее запуске. Команда JMP это команда безусловного перехода в Ассемблере. Выполняет, соответственно, безусловный переход в указанное место. Есть множество вариантов данной директивы некоторые из них рассмотрены на следующем слайде. Обратное проектирование. Дизассемблирование Инструкция JL выполняет короткий переход, если первый операнд МЕНЬШЕ второго операнда при выполнении операции сравнения с помощью команды CMP. Команда JLE выполняет короткий переход, если первый операнд МЕНЬШЕ второго операнда или РАВЕН ему при выполнении операции сравнения с помощью команды CMP. Инструкция JNA в Ассемблере выполняет короткий переход, если первый операнд НЕ больше второго (то есть меньше или равен второму) при выполнении команды CMP. Инструкция JE выполняет короткий переход, если первый операнд РАВЕН второму операнду при выполнении операции сравнения с помощью команды CMP. Инструкция JB выполняет короткий переход, если первый операнд МЕНЬШЕ второго операнда при выполнении операции сравнения с помощью команды CMP. Инструкция JNL в Ассемблере выполняет короткий переход, если первый операнд НЕ меньше второго (то есть больше или равен второму) при выполнении команды CMP. Из-за того, что язык ассемблер трудноприменим для разработки объёмных программных комплексов, его используют для написания (в основном в участках кода) в ядрах ОС Windows или Linux (но небольшие), драйвера, загрузчики ОС, программное обеспечение для микроконтроллеров. Обратное проектирование. Дизассемблирование Отладчики и дизассемблеры Основными инструментами реверс-инженера являются отладчик и дизассемблер. Отладчик запускает целевую программу в контролируемых условиях, которые позволяют программисту отслеживать ее текущие операции и отслеживать изменения в компьютерных ресурсах (чаще всего областях памяти, используемых целевой программой или операционной системой компьютера), которые могут указывать на неисправность кода. Soft ICE устарел OllyDbg устарел так как поддерживается только x86 процессором Дизассемблер - это транслятор, преобразующий машинный код, объектный файл или библиотечные модули в текст программы на языке ассемблера. IDA Pro редакция Pro платная Free бесплатная, основное отличие это поддержка редакцией PRO большим количеством архитектур процессоров таких как cisc (x86-64 он же AMD64, x86) risc (ARM, CORTEX) Misc (процессоры применяются в роутерах) Vliw (Эльбрус 3) и тд. Порядка 87 архитектур. Обратное проектирование. Дизассемблирование Виртуализация При реверсе потенциально опасных программ или вирусов, что бы не заразить основную ОС применяют вертуализацию Обратное проектирование. Дизассемблирование Декомпиляторы Декомпиля́тор — это программа, транслирующая исполняемый модуль (полученный на выходе компилятора) в эквивалентный исходный код на языке программирования высокого уровня. Декомпиля́ция — процесс воссоздания исходного кода декомпилятором. PyInstaller Extractor Visual Studio Decompiler PE Explorer Disassembler Ghidra К примеру с помощью PyInstaller можно скомпелировать исходный код написанный на Python 3.xx в исполняемый файл .exe А с помощью скрипта PyInstallerExtractor декомпилировать исполняемый файл и получить исходный код на Python 3.