Библиотека для работы с PE-файлами (C++)

Выкладываю более-менее завершенную библиотеку для работы с Portable Executable (PE) файлами - PE Bliss.

Основные фичи библиотеки:
[+] Чтение 32-разрядных и 64-разрядных PE-файлов (PE, PE+) для Windows, возможность единообразной работы с обоими форматами
[+] Создание PE/PE+ образов с чистого листа
[+] Пересборка 32-разрядных и 64-разрядных PE-файлов
[+] Работа с директориями и заголовками
[+] Конвертирование адресов
[+] Чтение и редактирование секций PE-файла
[+] Чтение и редактирование таблицы импортов
[+] Чтение и редактирование таблицы экспортов
[+] Чтение и редактирование таблиц релокаций
[+] Чтение и редактирование ресурсов
[+] Чтение и редактирование TLS
[+] Чтение конфигурации образа (image config)
[+] Чтение базовой информации .NET
[+] Чтение информации о привязанном импорте
[+] Чтение директории исключений (только PE+)
[+] Чтение отладочной директории с расширенной информацией
[+] Вычисление энтропии
[+] Изменение файлового выравнивания
[+] Изменение базового адреса загрузки
[+] Работа с DOS Stub'ом и Rich overlay
[+] Высокоуровневое чтение ресурсов: картинки, иконки, курсоры, информация о версии, строковые таблицы, таблицы сообщений
[+] Высокоуровневое редактирование ресурсов: картинки, иконки, курсоры, информация о версии

Словом, все, что вы хотели сделать с PE, но боялись спросить, как. Весь код библиотеки снабжен обильными комментариями на английском языке. В проект включено 25 примеров работы с библиотекой, которые показывают, как работать с той или иной частью библиотеки (комментарии на русском языке). Имеются солюшены для MSVC++ 2008 и 2010. Справочной информации пока нет, возможно, соберусь ее как-нибудь написать.

Библиотека не использует WinAPI или другие библиотеки, только STL.

Библиотека и примеры собираются под Windows x86 и x64, но для того, чтобы работать с PE+, собирать под x64 необязательно. Библиотека не исполняет считываемые файлы, не маппит их в память, поэтому с ее помощью можно спокойно открывать подозрительные исполняемые файлы и работать с ними. Теперь собирается еще и под Linux.

Проект залит на code.google.com на случай возможных правок и улучшений, так как сейчас библиотека в стадии альфа-версии.

Репозиторий: http://code.google.com/p/portable-executable-library/
Скачать архив с сорсами версии 0.1.11 (годятся для сборки упаковщика по ману, который тут в блоге есть): ZIP
Скачать архив с последними сорсами (1.0.0): ZIP

Библиотека для работы с PE-файлами (C++): 43 комментария

    1. SVN больше по душе как Windows-разработчику. И уверен, что большинство будет все равно качать zip-архивы с исходниками.

  1. Ув. DX, просмотрев ваш сэмпл resource editor ожидал что смогу RAW ресурсы своего ехе редактировать. А там получилось, что нужно сохранять старую секцию rsrc и в новую писать. Меня интересует именно редактирование и\или добавление в старую rsrc. Например хочу сгенерить VersionInfo.

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

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

        1. Позвольте, а Ваша библиотека разве поддерживает LN и MUI файл?
          Ведь для PE только одно ограничение - нужна WinNT.

        2. MUI файлы - это тот-тоже РЕ-файл :)
          LN пока собо не искал, но думаю, что MS не станет изобретать велосипед и им окажется РЕ-файл тоже.

          В общем, для большенства тут тусующихся эти форматы врядли окажутся полезными. А вот для файлов exe и dll, они очень даже полезные - сам юзал неоднократно.
          Хотя очень не хватает того, что Вы в своей библиотеке назвали "Высокоуровневое редактирование ресурсов".

          В общем, библиотека очень даже хороша. Автору респект!

          1. Библиотека откроет, все, что имеет формат PE или PE+, от расширения файла, понятное дело, это не зависит :)
            Однако интересно, как эти WinAPI-функции добавляют толстые ресурсы в exe- и dll-файлы, ведь придется секцию расширять, а это может очень негативно сказаться на работоспособности бинарника. Или они новую секцию создают...

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

  2. ну это и понятно cave'a нет, стало быть расширить невозможно. меня интересует именно редактирование. пускай у нас есть пе файл с иконкой, версией инфо, диалогами и манифестом. мне нужно отредактировать все и допустим я вылезать за рамки предыдущих размеров ресурсов не буду. так же реально с вашей либой сделать?

    1. Реально, просто в функцию пересборки ресурсов нужно передать уже существующую секцию с ресурсами, и он разместит новые ресурсы в ней.

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

    1. Кодгенератор это уже совершенно другая тема и к PE не имеет никакого отношения, поэтому не хотелось бы :)
      Жабера нет, можно общаться тут или в ПМ на форуме (forum.kaimi.io)

  4. Приветствую. Спасибо за библиотеку. Небольшой багрепорт:

    Чтение ресурсов сыпется на многих файлах, в частности на Delphi 2010 приложениях точно.

    Слил с SVN, собрал resource_viewer.exe падает с ошибкой

    ---------------------------
    Microsoft Visual C++ Debug Library
    ---------------------------
    Debug Assertion Failed!

    Program: d:\Work\Git\ExeSplitter\EXE\resource_viewer.exe
    File: c:\program files (x86)\microsoft visual studio 10.0\vc\include\xstring
    Line: 167

    Expression: string iterator + offset out of range

    For information on how your program can cause an assertion
    failure, see the Visual C++ documentation on asserts.

    (Press Retry to debug the application)
    ---------------------------
    Прервать Повтор Пропустить
    ---------------------------

    Ссылка на пустое VCL приложение:
    http://rghost.ru/41906837

  5. А кто то встречал доки по работе с цифровой подписью? хочу написать аналог sign.exe .

    1. Фиг его знает, пока что руки не дошли. Багов там много, но пока что нет времени всё сделать нормально.

  6. Добрый день! Dx, подскажи как с помощью твоей библиотеки подредактировать импорт? Интересует удаление функций и последующая пересборка PE.
    Спасибо

    1. Есть похожий пример, где импорты добавляются:

      https://code.google.com/p/portable-executable-library/source/browse/trunk/samples/import_adder/main.cpp

      Можно точно так же, как в примере, запросить импорты через get_imported_functions, потом из полученного массива удалить ненужные, а потом пересобрать PE-файл с помощью rebuild_pe (опять-таки, как в примере).

  7. Как в примере:
    imports = image->get_imported_functions()

    imports[0] - это имя первой библиотеки! Как с нее выйти на функции из этой библиотеки? И есть ли там функция удаления?

    С пересборщиком я разобрался! Спасибо.

    1. Ну несложно же открыть соответствующий файл библиотеки и посмотреть:

      https://code.google.com/p/portable-executable-library/source/browse/trunk/pe_lib/pe_imports.h

      //Returns imported functions list with related libraries info
      const imported_functions_list get_imported_functions(const pe_base& pe);

      Вернет список библиотек, а каждая библиотека будет содержать список импортированных функций.

      Кстати, судя по image->get_imported_functions() ты используешь старую библиотеку pe_lib. Скачай pe_bliss 1.0: https://code.google.com/p/portable-executable-library/downloads/list

  8. Доброго дня уважаемый DX.
    Понравилась ваша библиотека PE Bliss.
    Но у вы столкнулся с такой ситуацией:
    Задача добавить элемент в таблицу импорта.
    Добавляю элемент как в примере но увы после данной процедуры EXE отказывается работать.
    Не все а именно данный скомпилирован на Borlan 6 c++ relis Debug.
    Смотрю отладчиком ошибка возникает при загрузке в момент попытки записи в старую секцию таблицу импорта. ImportDerictoryRVA указывает все таки на новую секцию.
    Старая секция не изменила атребутов инициализация и чтение.
    Куда копать даже ума не приложу возможно из-за дебаг релиза ???

  9. В ручную поставил атребуты старой секции импорта (idata) (init;read;write)
    все заработало.
    Теперь буду разбираться как с помощью вашей библиотеки сделать такую же операцию.
    Хотя в оригинальном файле стоят атребуты (init;read) и все работает.

    Полтегейст. Отличная библиотека как и пишут многие жаль мало документации.

    1. Библиотека во многом неочевидна, я в свободное время делаю новую версию, где и документация поподробнее, и использование более очевидно будет. Но пока ничего не готово.

    1. В эту версию библиотеки я ничего нового не коммичу. Постепенно делаю новую, но времени не очень много, поэтому она еще не готова. Когда будет что-то осмысленное, то выложу на гитхаб, да.

  10. Эта тема еще живая?
    При компиляции последней версии возникают ошибки здесь:
    memcpy(header_.Name, name.c_str(), std::min(name.length(), sizeof(header_.Name)));

    size_t: недопустимое использование этого типа в качестве выражения
    min: необъявленный идентификатор
    min: не является членом "std"
    memcpy: функция не принимает 2 аргументов

    1. Давно не поддерживал, на поддержку пока забил, хотя когда-то начал писать новую версию либы с продвинутыми возможностями. А ошибку можно исправить, если добавить #include <algorithm>, например.

    1. Планировал и даже начал делать, но пока что совсем нет времени продолжать. Думаю, что будет, но сроки пока не определены.

Добавить комментарий для Виктор Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *