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

Суббота, 8. Сентябрь 2012
Раздел: C/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

 Обсудить на форуме


Получать обновления на почту:     

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

  1. Спасибо за труд. Извиняюсь за глупый вопрос, но почему не GitHub?

    [Ответить]

    dx:

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

    [Ответить]


  2. itspeeow :

    VC2010 Express не поддерживает вложенные папки :(

    [Ответить]

    dx:

    Ну собери без папок, какая разница :)

    [Ответить]


  3. alex :

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

    [Ответить]

    dx:

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

    [Ответить]

    adfhdhdfs:

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

    [Ответить]

    BOBAH:

    см. BeginUpdateResource, UpdateResource, EndUpdateResource.

    [Ответить]

    dx:

    Только вот под никсами это работать не будет. А еще там обалдеть сколько ограничений

    [Ответить]

    BOBAH:

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

    BOBAH:

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

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

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

    dx:

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

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


  4. alex :

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

    [Ответить]

    dx:

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

    [Ответить]


  5. alex :

    дополню... вот интересно как делают ресхакер или ресторатор? они перезаписывают rsrc?

    [Ответить]

    dx:

    Не в курсе

    [Ответить]


  6. alex :

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

    [Ответить]

    dx:

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

    [Ответить]


  7. Виктор :

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

    Чтение ресурсов сыпется на многих файлах, в частности на 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

    [Ответить]

    Виктор:

    Извиняюсь, внезапно все заработало. Что-то я напутал

    [Ответить]

  8. Хорошая работа, но не хватает документации, пол ночи ковырял исходники :)

    [Ответить]


  9. Олександр :

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

    [Ответить]


  10. Василий :

    Код гавно, все тоже самое можно написать в 3 раза проще, оверхед дичайший!

    [Ответить]


  11. Guest :

    пиз#еть не мешки ворочать

    [Ответить]


  12. dnk :

    Когда ж будет либа новая? Нашел мелкий баг при добавлении ресурсов.

    [Ответить]

    dx:

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

    [Ответить]

    Kaimi:

    Хоть на гитхаб экспортни проект, там же быстро +)

    [Ответить]


  13. Guest :

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

    [Ответить]

    dx:

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

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

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

    [Ответить]


  14. Guest :

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

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

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

    [Ответить]

    dx:

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

    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

    [Ответить]


  15. Ivan :

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

    [Ответить]


  16. Ivan :

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

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

    [Ответить]

    dx:

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

    [Ответить]

  17. Google code на днях станет read-only, самое время нажать кнопку "Export to GitHub"

    [Ответить]

    dx:

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

    [Ответить]


  18. m :

    Hi
    Godot game engine developers want to use this library but they hesitate because of library's custom license : https://github.com/okamstudio/godot/pull/2518
    Can you somehow help them? For example by change license to a standard license or give them permission to using library officially.

    [Ответить]

    dx:

    Hi, I've answered to someone who asked about this by e-mail.

    [Ответить]


Оставьте ваш комментарий