Пишем упаковщик по шагам. Шаг 11. Интерфейс командной строки. Финальная версия.
Предыдущий шаг здесь.
Появилась новая версия библиотеки для работы с PE-файлами (0.1.9). Никакие баги там поправлены не были, был добавлен функционал, который упаковщик не использует, так что ваше дело, перекачивать ее или нет :)
В этом шаге мы запилим нашему упаковщику хороший интерфейс командной строки. Я возьму вариант из старого упаковщика и модифицирую его.
Сперва нам потребуется собранная библиотека Boost. Если вы разбирали предыдущие шаги, то она уже должна у вас быть. Если вы ее еще не собрали, то поясню, как это делается. Например, вы распаковали архив с библиотекой в директорию C:\boost. Заходим в эту директорию и запускаем файл bootstrap.bat. Через какое-то время в той же директории появится файл bjam.exe. Запустим консоль (cmd) и перейдем в директорию C:\boost с помощью команды cd. Наберем команду
bjam variant=debug link=static threading=multi runtime-link=static |
и подождем, пока соберется debug-вариант со статической линковкой, а затем наберем
bjam variant=release link=static threading=multi runtime-link=static |
и соберем аналогично release-вариант. Boost собран, и можно переходить к упаковщику (проект simple_pe_packer). В файл main.cpp добавим два include:
#include <boost/program_options.hpp>#include <boost/timer.hpp> |
Первый необходим для реализации интерфейса командной строки, второй мы используем для подсчета времени упаковки файла. Заменим строки
//Говорим пользователю, как использовать наш упаковщик//На текущем шаге никаких опций упаковки не будет, просто//необходимо будет запускать упаковщик, передав через командную строку//имя файла, который мы хотим упаковатьif(argc !=2){ std::cout<<"Usage: simple_pe_packer.exe PE_FILE"<< std::endl;return0;} |
на такие:
//Чтобы не писать всегда полное имя неймспейсаnamespace po = boost::program_options; //Таймер будет считать, сколько времени//ушло на упаковку файла boost::timer pack_timer; //Принудительная упаковка - будет упакован даже//потенциально некорректный файлbool force_mode =false;//Перепаковывать ли ресурсыbool repack_resources;//Перепаковывать ли директорию конфигурации загрузкиbool rebuild_load_config;//Обрезать ли DOS-заголовокbool strip_dos_headers;//Файловое выравнивание после упаковкиunsignedlong file_alignment; //Путь к исходному файлу std::string input_file_name;//Путь для упакованного файла std::string output_file_name; //Создаем описание опций po::options_description visible_options("DXPack Packer 1.0\nCommand Line Options"); try{//Создаем список допустимых опций//Добавляем для них дефолтовые значения (не для всех) po::options_description cmdline; //out-file,o - значит, что имя опции "--out-file"//и короткий ее псевдоним "-o" visible_options.add_options()("out-file,o", po::value<std::string>(&output_file_name), "Output file name")("file-align,a", po::value<unsignedlong>(&file_alignment)->default_value(512), "Packed file alignment")("strip-dos,s", po::value<bool>(&strip_dos_headers)->default_value(true), "Strip DOS headers")("repack-res,r", po::value<bool>(&repack_resources)->default_value(true), "Repack resources")("build-load-config,l", po::value<bool>(&rebuild_load_config)->default_value(true), "Rebuild Load Config directory")("force,f", "Force packing of possibly incorrect binaries"); cmdline.add(visible_options);//Скрытая опция - имя файла для упаковки cmdline.add_options()("image", po::value<std::string>(&input_file_name), "PE image to pack"); //Безымянная (имя файла для упаковки должно стоять на первой позиции) po::positional_options_description desc_pos; desc_pos.add("image", 1); //Парсим командную строку po::variables_map vm; po::store(po::command_line_parser(argc, argv). options(cmdline).positional(desc_pos).run(), vm); po::notify(vm); //Если не указан путь к исходному файлуif(input_file_name.empty())throw std::runtime_error("No input file specified"); //Если указан режим принудительной упаковкиif(vm.count("force")){ std::cout<<"Force mode is active!"<< std::endl; force_mode =true;}}catch(const std::exception& e){//Если что-то пошло не так - выведем описание опций std::cout<< e.what()<< std::endl<< std::endl; std::cout<< visible_options << std::endl;system("pause");return0;} |
Не буду подробно описывать этот кусок кода, скажу лишь, что здесь мы удобно и просто с помощью библиотеки 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
Также рекомендую почитать
Обсудить на форуме
Источник: http://feedproxy.google.com/~r/kaimi/dev/~3/DG6TdodPu9E/
Дайджест новых статей по интернет-маркетингу на ваш email
Новые статьи и публикации
- 2024-04-17 » 23 сервиса для эффективного экспресс-аудита любого сайта
- 2024-04-08 » Яндекс переходит на новую версию Wordstat
- 2024-04-08 » Яндекс интегрировал в свой облачный сервис эмпатичную нейросеть
- 2024-04-08 » Новая версия нейросети Claude превзошла по мощности аналоги Google и OpenAI
- 2024-04-08 » Как пользоваться GPT 4 и Claude бесплатно и без VPN
- 2024-03-13 » Стратегии SEO на 2024 год
- 2024-03-13 » Как использовать анимацию с помощью JavaScript-библиотеки GSAP
- 2024-03-13 » Использование GSAP 3 для веб-анимации
- 2024-03-13 » Cогласование топографической съёмки с эксплуатирующими организациями
- 2024-02-19 » Теряются лиды? Как настроить сквозную аналитику
- 2024-02-17 » Мерч и IT: на что обратить внимание в 2024 году
- 2024-02-16 » Копируем с RSync: основные примеры синхронизации файлов
- 2024-02-15 » Лучшие noCode AI платформы для создания диалоговых ботов
- 2024-02-14 » Факторы ранжирования Google 2024 — исследование Semrush
- 2024-02-12 » Перенос сайта на другой хостинг
- 2024-02-05 » В России сформирован реестр хостинг-провайдеров
- 2024-02-04 » Использование SSH для подключения к удаленному серверу Ubuntu
- 2024-02-03 » Подключаемся к серверу за NAT при помощи туннеля SSH. Простая и понятная инструкция
- 2024-02-02 » Настройка CI/CD для Gitlab-репозитория: схемы и гайд по шагам
- 2024-02-01 » GitLab CI Pipeline. Запуск сценария через SSH на удаленном сервере
- 2024-01-29 » Introduction to GitLab’s CI/CD for Continuous Deployments
- 2024-01-26 » Настройка GitLab CI/CD
- 2024-01-25 » Установка shell gitlab runner
- 2024-01-25 » Установка и регистрация gitlab-runner в docker контейнере
- 2024-01-25 » Переменные Gitlab-Ci
- 2024-01-25 » Настройка CI/CD в GitLab для синхронизации проекта с веб-серверами
- 2024-01-25 » Копирование файлов scp
- 2024-01-21 » Бездепозитные бонусы от казино: обзор условий и правил использования
- 2024-01-18 » Современная обработка ошибок в PHP
- 2024-01-18 » Пример шаблона проектирования MVC в PHP
Самый лучший человек тот, который живет преимущественно своими мыслями и чужими чувствами, самый худший сорт человека - который живет чужими мыслями и своими чувствами. Из различных сочетаний этих четырех основ, мотивов деятельности - все различие людей. Люди, живущие только своими чувствами, - это звери. Толстой Лев Николаевич - (1828-1910) - великий русский писатель. Его творчество оказало огромное влияние на мировую литературу |
Мы создаем сайты, которые работают! Профессионально обслуживаем и продвигаем их , а также по всей России и ближнему зарубежью с 2006 года!
Как мы работаем
Заявка
Позвоните или оставьте заявку на сайте.
Консультация
Обсуждаем что именно Вам нужно и помогаем определить как это лучше сделать!
Договор
Заключаем договор на оказание услуг, в котором прописаны условия и обязанности обеих сторон.
Выполнение работ
Непосредственно оказание требующихся услуг и работ по вашему заданию.
Поддержка
Сдача выполненых работ, последующие корректировки и поддержка при необходимости.