На днях завершил крупный коммерческий проект, только собирался потратить вырученные средства на покупку очередного ноутбука Alienware и поездку на Гавайи, как ко мне в гости зашел Каями (с нехарактерно расширенными зрачками) и сказал, чтобы я что-нибудь написал в блог, дескать не солидно как-то ничего не запостить перед Новым Годом. Сам-то он якобы занят, но я подозреваю, чем он на самом деле занимается. В общем, его просьбу я выполнил. Каями, судя по всему, остался доволен и в ответ на ссылку на пост скинул мне в аську скриншот статы какой-то партнерки. Так что он тоже едет на Гавайи! Поэтому в ближайшие пару недель новых постов можно, пожалуй, не ждать.
Итак, выкладываю упаковщик PE-файлов собственного производства. Исходники самого упаковщика на C++ и стаба распаковщика на MASM32 в комплекте. Все с комментариями на английском языке. Привереды и не умеющие переводить технические тексты идут вон из комментариев к посту! Про PE-формат я цикл статей завершу когда-нибудь, а пока ловите хотя бы это, на остальное времени нет. Самое основное в упаковщике - это файл main.cpp размером 51 кб (лень было разбивать) и unpacker.asm. unpacker.cpp - это стаб распаковщика в скомпилированном виде (его исходник, соответственно, в unpacker.asm). Используется немного библиотек из boost.
Возможности упаковщика:
[+] Поддержка exe, dll-файлов. Драйвера (sys-файлы) не упаковываются.
[+] Дерьмовая степень сжатия, так как используются RtlCompressBuffer / RtlDecompressBuffer - чисто ради примера. Кроме того, упаковывается каждая секция отдельно, не слепляются вместе, как это делает UPX, это тоже влияет на степень сжатия.
[+] Поддержка экспортов (по ординалу, по имени, а также форвардов в другие dll).
[+] Само собой, поддержка импортов (по ординалу и по имени).
[+] Поддержка и умение упаковывать секцию ресурсов (из нее перемещаются иконки, информация о версии и манифест, так что упакованный файл внешне ничем не отличается от оригинала).
[+] Поддержка релокаций (фиксапов / перемещаемых элементов / назовите их как хотите).
[+] Изменение выравнивания файла.
[+] Возможность упаковки только конкретных секций
[+] Поддержка TLS (локальная память потока) (кроме TLS callbacks, которые ни один компилятор не умеет делать, насколько мне известно).
[+] Удаление rich overlay'а от Visual C++.
[+] Возможность упаковки PE-заголовка в DOS-заголовок.
[+] Поддержка бинарников Visual C++, Borland C++/Delphi, MinGW, MASM32 (другое не проверялось, но, скорее всего, тоже заработает).
Упаковщик поддерживает только PE32.
Пример использования:
pack.exe test_exe.exe
Дополнительные опции командной строки:
1 2 3 4 5 6 7 8 9 |
Simple Packer by DX: -o [ --out-file ] arg Output file name -i [ --add-import ] Add fake import table to packed image -r [ --pack-rsrc ] arg (=1) Pack .rsrc section (image resources) -m [ --move-icons ] arg (=1) Move application icons to new .rsrc -s [ --pack-sections ] arg Explicit sections name(s) to pack -a [ --file-align ] arg (=512) Packed file alignment -d [ --strip-dos ] arg (=0) Strip DOS headers -f [ --force ] Force packing of possibly incorrect binaries |
-o - позволяет задать имя запакованного файла. По умолчанию оно собирается из имени оригинального файла и слова "packed".
-i - если задана эта опция, в запакованный бинарник будет добавлена директория импорта, состоящая из одного импорта. Дело в том, что старым версиям Windows (например, XP) иногда может не нравиться отсутствие импортов у исполняемого файла. По умолчанию запакованный файл директории импорта не имеет.
-s - позволяет задать список имен секций, которые должны быть упакованы. По умолчанию пакуются все секции файла. Использование: -s .text .data
-r - позволяет включить/отключить упаковку секции ресурсов. Если у бинарника много места занимают иконки, то иногда выгоднее ее не паковать. Использование: -r 0 или -r 1.
-a - позволяет задать файловое выравнивание запакованного бинарника. Использование: -a 1024. По умолчанию это 512 (минимальное).
-d - позволяет включить опцию обрезки DOS-заголовков (поверх их будет записан PE-заголовок). По умолчанию выключена, так как на результирующий размер не влияет. Использование: -d 0 или -d 1.
-f - если задана данная опция, будет паковаться любое говно, которое вы подсунете упаковщику (дрова, .NET-бинарники, уже запакованные ранее файлы и т.д.), но результат, скорее всего, будет неработоспособным.
-m - опция включает/отключает перемещение иконок из директории ресурсов (если она пакуется) в секцию ресурсов упаковщика. По умолчанию включено, но можно отключать для файлов DLL, имеющих в ресурсах какие-то иконки - размер будет меньше. Использование: -m 0 или -m 1.
Любители няшных графических свистелок и перделок идут в лес за грибами.
Если вы дочитали до этого места, в комментариях отвечу на любые вопросы о работе упаковщика.
А вот и сам пакер с исходниками: Скачать!
UPDATE от 27.12.2011: Добавлена опция командной строки -i, добавлен вывод предупреждения, если файл имеет оверлей.
UPDATE от 28.12.2011: Добавлена опция командной строки -m.
Есть мысли на создание 4 квеста?
Неа. По-моему, это уже исчерпало себя.
Ну почему же? Что-нибудь трехмерное (на движке HL2, чтобы самому не делать) было бы вполне себе...
Делай теперь ты, а я буду придумывать задания :)
Можно на разных движках реализовать, есть со встроенным скриптовым языком для AI, вот TES: Oblivion - там и диалоги есть(говорят вроде новая вышла. Хотя, имхо, в 3D не так интересно будет
Судя по всему, людям максимально интересна обычная консоль, выдающая сразу задания. В третий квест гораздо меньше людей играло.
А в каком интересно? Просто консоль - конечно круто и имеет некий плюс, т.к. играется в целом через браузер, но как-то избито что ли...
Несколько лет назад у меня была мечта - написать полиморфный упаковщик. Полиморфный движок написал, а вот до упаковщика руки так и не дошли (учеба, работа, ...). По-моему было бы просто охренительно прикрутить мой полиморфный движок к твоему упаковщику. Для этого потребуется лишь немного переписать код unpacker.asm. Мне кажется, у тебя это получится быстрее и лучше, чем у меня. Если заинтересован - пиши на afiskon гаф gmail.com.
Ну попробуйте)
Полиморфный упаковщик? Я слышал о полиморфных крипторах и о простых упаковщиках, а такого термина, как "полиморфный упаковщик", не встречал :)
Времени сейчас нет такое делать, если есть желание поковыряться - все исходники я выложил. Сложность еще в том, что код базонезависимым должен быть, так как он может оказаться по любому виртуальному адресу загружен. Хотя можно для обычного базозависимого написать релокации, но это, пожалуй, еще более занудно.
Упаковщик немного обновлен. Описание в посте.
А говорили, что не занимаетесь скамерцией..
Конкретную цитату на этот счет в студию, желательно с авторством
Первый абзац данной статьи.
Цитату про отсутствие коммерции и про точное определение. Т.к. лично я не считаю коммерцией ситуацию, когда, например, d_x просит меня что-то написать и предлагает за это деньги.
Ну например твой же пост "почему я не люблю программировать". Как-то слабо вяжется с партнерками.
Впрочем,это совсем не мое дело и ес-но, у меня никаких претензий нет. Просто удивило как-то. Не в обиду, если что.
Так если ведем речь обо мне, то в чем скамерция то? Партнерки - окей, но весь мой доход на них обычно, либо за счет рефа, либо за счет поиска способа накрутки партнерки.
По секрету - больше верь всяким эпичным вступлениям.))
С Новым Годом! Хорошо отдохнуть!
Как сделать, чтобы пакер сохранял overlay?
Это невозможно. При упаковке физические смещения меняются.
А возможно его как то отрезать? и "пришить" намето после упаковки?
C:\pack>pack.exe setup.exe
Packing setup.exe...
Calculating entropy... (0.98296)
Error: The file has been probably already compressed!
Дай угадаю: ты пакуешь инсталлятор? Молодца!
Тебе же пакер ясно сказал: нечего тут и паковать, энтропия зашкаливает, бинарь уже упакован.
Пакуя через форс, вылазит ошибка при запуске: Package Corrupted, скорее всего теряется overlay ;(
Вот и нужно вырезать каким то способом overlay зааковать и все остальное и вернуь его :)
Я уже сказал, что без переписывания самого инсталлятора (или как минимум его детального изучения) это невозможно.
Не неси хуйню, если не знаешь.
И да, повторюсь, что степень сжатия будет почти нулевой. Инсталляторы и так пакуют свои файлы.
Это не инсталятор, а его подобие, setup.exe из лога - это только пример. Меня не особо интересует степень сжатия, интересует кое что другое ;)
Если интересует криптование, то проще пройтись по бинарнику криптором, который сохраняет физические размеры секций и не режет в результате этого оверлей. Упаковщик точно для такого не подойдет.
С чего бы это ХР не нравились РЕ без импорта?
Почему выравнивание 512 минимальное?
По оверлею: многие ехе читают оверлей не по смещению, а по размеру оверлея отнимая от EOF, такчто прикрутить оверлей через 16-ричный редактор и вероятно будет работать.
Прошу прощения, XP нравится без импорта, не нравится, вроде бы, 2000 или NT... А XP не любит таблицы экспорта, содержащие форварды.
Про выравнивание минимальное - читай доки.
Если Section Alignment == File Alignment, то последнее может принимать любое значение, представляющее собой степень двойки (например, 20h).
А ты попробуй, сделай Section alignment 20h и File alignment 20h. Убедишься, что загрузчик обругает тебя.
Предлагаю выложить пруф в виде файла с Section Alignment = File Alignment = 512< , причем, чтобы файл корректно отрабатывал как на XP, так и на 7
Сделал, пруф: http://www.sendspace.com/file/j892ph
http://s47.radikal.ru/i115/1201/1e/b3adacdbd261.png
Файл корректно работает на х86 ОС.
Win 7: http://s018.radikal.ru/i511/1201/3c/4ba18f97583d.png
Win XP: http://s016.radikal.ru/i334/1201/4d/72b389eb64be.png
Win 2k: http://s018.radikal.ru/i527/1201/74/ea46cb5bd813.png
А на x64 не запускается.
а показать нам всем пример упаковки\шифровки sys файлов не вариант или хотябы лоадер для них?
С дровами не возился никогда, поэтому вряд ли :)
Ок, пробую собрать пакер, юзаю VC2008
скачал boost, положил туда 3 файла, но компановщик как будто их не видит
fatal error C1083: Не удается открыть файл include: boost/scoped_array.hpp: No such file or directory
boost/scoped_array.hpp
boost/foreach.hpp>
boost/program_options.hpp
также и у меня лежит
с boost'ом разобрался, но если есть возможность, выложите плз сами файлы проекта.
Плюсую, выложите пожалуйста файлы проекта.
Как поднять степень сжатия до уровня Upack?
неплохо так сжимает ;)
на входе 94кб, "сжал" и получилось 103кб)
peid выдал
MPEG Layer II/III music file *
спасибо посмеялся
Интересная и хорошая работа. Вот только вместе с исходниками принято прилагать файл проекта или хотя бы список библиотек, а то гадать приходиться что да как компилировать.
А тут в блоге есть целый цикл статей по написанию собственного упаковщика, со всеми либами и проектами на каждый шаг.
хороший код
Антивирус касперского бедалага испугался упакованный файл оставлять: Trojan.Win32.Crypt.cuq обнаружил
Здравствуйте, могли бы кинуть исходник ?
Вообще-то, ссылка на исходник находится в конце публикации.
Распаковщика я так понимаю нет?
Берешь какой-нибудь QuickUnpack и распаковываешь, если руками не хочется.
Или же сделать распаковщик из исходников, там уже почти готовый код, просто распаковывает в память, а не в файл.
@Kaimi, @dx, видимо я совсем плох, но ни одним распаковщиком не осилил http://rghost.ru/6R2X6TW8V,подскажите как с такими справляться.
sendspace.com/file/z0jnul
Спасибо тебе мил человек!!
Бибилотека для работы с winpe хорошая