Print This Post Пишем упаковщик по шагам. Шаг 11. Интерфейс командной строки. Финальная версия.

Четверг, 4. Октябрь 2012
Раздел: C/C++, Windows, Для новичков, автор:

Предыдущий шаг здесь.

Появилась новая версия библиотеки для работы с PE-файлами (0.1.9). Никакие баги там поправлены не были, был добавлен функционал, который упаковщик не использует, так что ваше дело, перекачивать ее или нет :)

В этом шаге мы запилим нашему упаковщику хороший интерфейс командной строки. Я возьму вариант из старого упаковщика и модифицирую его.

Сперва нам потребуется собранная библиотека Boost. Если вы разбирали предыдущие шаги, то она уже должна у вас быть. Если вы ее еще не собрали, то поясню, как это делается. Например, вы распаковали архив с библиотекой в директорию C:\boost. Заходим в эту директорию и запускаем файл bootstrap.bat. Через какое-то время в той же директории появится файл bjam.exe. Запустим консоль (cmd) и перейдем в директорию C:\boost с помощью команды cd. Наберем команду

и подождем, пока соберется debug-вариант со статической линковкой, а затем наберем

и соберем аналогично release-вариант. Boost собран, и можно переходить к упаковщику (проект simple_pe_packer). В файл main.cpp добавим два include:

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

на такие:

Не буду подробно описывать этот кусок кода, скажу лишь, что здесь мы удобно и просто с помощью библиотеки boost::program_options обрабатываем командную строку нашего упаковщика. Все опции, доступные через командную строку (bool force_mode, bool repack_resources, bool rebuild_load_config, bool strip_dos_headers, unsigned long file_alignmen, std::string input_file_name, std::string output_file_name), я рассовал в исходник упаковщика, и не буду пояснять, что именно изменилось, так как по мелочам поменялись многие части кода. Кроме того, в конце исходника я сделал вывод затраченного на упаковку времени, просчитанного с помощью библиотеки boost::timer. Все изменения вы, как всегда, сможете оценить, скачав полный солюшен упаковщика.

Пожалуй, эту версию упаковщика уже можно назвать законченной. Да, он создает подозрительные импорты и, возможно, имеет еще какие-то недостатки, однако он полностью работоспособен, поддерживает то, чего некоторые другие упаковщики не умеют (например, TLS с коллбэками или перепаковку конфигурации загрузки) и имеет интерфейс командной строки. Поэтому помимо полного исходного кода я выложу и exe-файл упаковщика, вдруг кому-то пригодится. На этом я закрываю цикл статей про написание упаковщика.

Полный солюшен для этого шага: own-packer-step-11
Упаковщик в собранном виде (EXE): DXPack.zip

UPD: версия с исправленной ошибкой здесь

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


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

Комментариев: 49 к “Пишем упаковщик по шагам. Шаг 11. Интерфейс командной строки. Финальная версия.”


  1. BOBAH2 :

    А что мешает мне быть Indy или BOBAHом и хвалить самого себя?

    [Ответить]


  2. Александр :

    А что нужно изменить, чтобы добавить еще 1 секцию, а то пишет, что недостаточно места для TLS?

    [Ответить]

    dx:

    Хотелось бы посмотреть на пример бинарника, для которого выдается такая ошибка

    [Ответить]


  3. Александр :

    Как исправить оффсетрасположения сигнатуры?

    Он был до репака: 00000110, а стал 00000010

    [Ответить]

    dx:

    Какой именно сигнатуры? Пакер с нуля пересобирает PE-файл по сути, расположения заголовков могут поменяться в том числе.

    [Ответить]


  4. Александр :

    С этими проблемами вроде разобрался, хорошая библиотека получилась. Спасибо большое. У меня такой вопрос, как можно в реалтайме сломать библиотеку импорта и спрятать оригинальную точку входа?

    [Ответить]

    dx:

    Библиотека не поддерживает работу с бинарником, загруженным в память, к сожалению (а новая версия библиотеки, в которой я такую возмможность предусмотрел, еще не готова). Поэтому скорее всего придется вручную всё делать.

    [Ответить]


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