Как разложить программу exe на составные части

Привет, хабровчане. В рамках курса «Reverse-Engineering. Basic» Александр Колесников (специалист по комплексной защите объектов информатизации) подготовил авторскую статью.

Также приглашаем всех желающих на открытый вебинар по теме «Эксплуатация уязвимостей в драйвере. Часть 1». Участники вебинара вместе с экспертом разберут уязвимости переполнения в драйверах и особенности разработки эксплойтов в режиме ядра.

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

Инструментарий и настройка ОС

Для тестов будем использовать виртуальную машину под управлением ОС Windows. Инструментарий будет содержать следующие приложения:

  • отладчик x64dbg;
  • установленный по умолчанию плагин x64dbg Scylla;
  • hiew Demo;

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

Программа Угадай число. Финальная сборка, создаём exe файл

  • uncompile6 проект, который позволяет разобрать байткод виртуальной машины Python;
  • pyinstallerExtractor инструмент для распаковки архива pyInstaller.

Общие методы снятия паковки

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

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

Что же от этого реверс-инженеру? Почему знать и уметь определять, что файл упакован? Приведу наглядный пример. Ниже приведен снимок файла, который не запакован:

И файл, который был пропущен через алгоритм UPX:

Изменения коснулись в этом случае двух основных точек исполняемого файла:

  1. Точка входа — в случае с упакованным файлом это начало алгоритма распаковки, настоящий алгоритм программы будет работать только после того, как будет распакован оригинальный файл;
  2. Код оригинального файла: теперь не найти паттернов, которые можно сразу разбирать как команды.
Читайте также:
Латех как вставить код программы

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

Запуск внешних программ, как запустить EXE на PHP

  1. Этап подготовки исполнения файла — загрузчик ОС настраивает окружение, загружает файл в оперативную память;
  2. Сохранение контекста — упаковщик сохраняет контекст исполнения файла (набор значений регистров общего назначения, которые были установлены загрузчиком ОС);
  3. Распаковка оригинального файла;
  4. Передача управления оригинальному файлу.

Все описанные выше этапы можно легко отследить в отладчике. Особенно может выделяться процедура сохранения контекста. Для нее в разных архитектурах могут быть использованы команды pushad/popad или множественное использование команды push . Поэтому всегда приложение трассируют до первого изменения регистра ESP/RSP, и ставят «Hardware Breakpoint» на адрес, который был помещен в регистр в первый раз. Второе обращение этому адресу будет в момент восстановления контекста, который заполнил загрузчик ОС. Без него приложение завершится с ошибкой.

Пример UPX

Попробуем с помощью отладчика найти оригинальную точку входа для приложения. Запечатлим оригинальную точку входа до упаковки UPX:

Как та же точка входа выглядит после упаковки:

Запустим отладчик и попробуем найти место сохранения контекста:

Ждем первого использования ESP — в отладчике при этом значение регистра подсветится красным цветом. Затем устанавливаем точку останова на адрес и просто запускаем приложение:

В результате попадаем на оригинальную точку входа:

Вот так просто, теперь используя плагин Scylla Hide можно сохранить результирующий файл на жесткий диск и продолжить его анализ.

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

Пример PyInstaller

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

Читайте также:
Настройка и установка антивирусных программ

Попробуем все же получить что-то читаемое. Создадим простое приложение на Python и упакуем с помощью PyInstaller. Исходный код приложения:

def main(): print(«Hello World!») if __name__ == ‘__main__’: main()

Установим пакет pyInstaller и создадим exe файл:

pip install pyinstaller pyinstaller -F hello.py #-F создать один файл

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

После выполнения команд выше, у вас должна создаться директория ./dist/test.exe . Откроем последовательно файл с помощью pyinstallerextractor и uncompile3 :

Наш скрипт находится в директории, которая создается в результате распаковки. Наименование файла должно соответствовать названию exe файла. В нашем случае это test.pyc . Откроем его в hiew :

Декомпиляция стандартными средствами невозможна, так как инструменты просто не умеют работать с байткодом Python. Применим специализированный инструмент — uncompile6 .

Таким образом можно снова получить исходный код.

Узнать подробнее о курсе «Reverse-Engineering. Basic».

Смотреть открытый вебинар по теме «Эксплуатация уязвимостей в драйвере. Часть 1».

Источник: temofeev.ru

Как разобрать exe`шник?

Доброе время суток дорогие товарищи!
Есть программа, которая выполняет алгоритмы по какому то неведомому для меня принципу, а именно, она делает действия либо по принципу A либо по принципу B. Не могу понять по какому именно, но нужно! появилась идея разобрать прогу на исходники и посмотреть в коде, а теперь вопрос, как же мне это сделать и возможно ли это вообще? если да, то посоветуйте инструменты, и поделитесь своим опытом.
Заранее всем огромного добра и счастья, а так же спасибо.

  • Вопрос задан более трёх лет назад
  • 876 просмотров

1 комментарий

Простой 1 комментарий

Adamos

Идея вредная. Задающему такие вопросы НИКОГДА не поможет то, что он думает, что ищет.
Просто потому, что для реверс-инжиниринга нужен значительный багаж IT-знаний и опыта, а его явно нет совсем.
Продолжайте мучить программу как черный ящик, выискивая закономерность между входом и выходом.
Других возможностей у вас нет.

Читайте также:
Какой программой сжимать видео без потери качества

Решения вопроса 0
Ответы на вопрос 4

Это называется реверс-инжиниринг и, если программа не фришная, уголовно наказуемо.
А даже если нет, видимого готового алгоритма, скорее всего, не даст.

Ответ написан более трёх лет назад
я бы все же попробовал, как это сделать с точки зрения опытного человека?

Есть достаточно много софта и Гугл наверняка его знает. Мои знания о нём устарели, наверное, лет на 10 :).

demon416nds

Разработчик на чем попало

сильно зависит от того на чем программа написана
но в общем плане это работа для отладчика/дизассемблера

Источник: qna.habr.com

Помогите «разложить на атомы» exe — файл!

Мне нужны позарез исходники (ну или документация) по разложению экзешника на составляющие. А именно: есть экзешник, написанный на VC++.Net, и надо написать прогу (на VC++ 6.0 или на VC++.Net) , которая смогла бы «прочитав» его выдать файл (*.txt or *.htm), в котором будут выписаны все функции и классы, которые использовались в экзешнике.

Отслеживать
2,954 3 3 золотых знака 24 24 серебряных знака 54 54 бронзовых знака
задан 3 янв 2013 в 16:03
712 3 3 золотых знака 17 17 серебряных знаков 52 52 бронзовых знака
Попробуйте утилиту nm из MinGW.
3 янв 2013 в 16:41

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Попробуйте через .NET Reflector, или ILSpy

Отслеживать
ответ дан 3 янв 2013 в 16:15
Niki-Timofe Niki-Timofe
2,954 3 3 золотых знака 24 24 серебряных знака 54 54 бронзовых знака
Сейчас попробую.
3 янв 2013 в 16:15

Возможно поможет частично программа resource hacker (reshack), картинки и иконки можно вытащить, иногда текстовые файлы и бд.

Отслеживать
ответ дан 3 янв 2013 в 16:12
1,727 4 4 золотых знака 25 25 серебряных знаков 45 45 бронзовых знаков
Мне надо вытащить код
3 янв 2013 в 16:14

  • .net
  • декомпиляция
    Важное на Мете

Похожие

Подписаться на ленту

Лента вопроса

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

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Источник: ru.stackoverflow.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru