Библиотека для работы с 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 не будет опубликован. Обязательные поля помечены *