Анонс проекта
Возможно, раздел выбран не совсем корректно, но здесь имею возможность модерировать тему, что для меня в данном случае является важным.
Сутью проекта является разработка EXE-упаковщика, основанного на технологии, отличной от используемой в общеизвестных аналогах (upx, ASProtect, yoda и т.п.).
Начну с рассмотрения технологии примененной в этих упаковщиках.
Технология основана на деталях формата PE. Как известно (если не известно, настоятельно рекомендую ознакомиться), в PE-файлах секции обладают двумя характеристиками – физической топологией и логической. Под физической понимается местоположение (смещение относительно начала файла) и размер секции в файле. Под логической – местоположение (смещение относительно базового адреса) и размер секции в памяти. При этом величины не совпадают. Т.о. есть возможность физически сжать секцию и поместить её в файл, при этом меняются физические характеристики, а логические остаются неизменными. При загрузке файла, загрузчик выделяет место под секции согласно логическим характеристикам и помещает туда сжатые данные из секций. После этого запускается распаковщик, который находится в дополнительно созданной (конечно же незапакованной) секции, и он распаковывает данные остальных секций, благо места для них выделено достаточно. Более подробную информацию, можно свободно найти в Интернете, а устройство upx и yoda, вообще, изучить по открытым исходным кодам.
Какие минусы есть у такого подхода?
1. Не все секции можно безболезненно сжимать, например секцию ресурсов (почему, можно найти в Интернете).
2. Различные хитрости, оптимизации и искажения формата PE в исходном файле могут привести к неработоспособности сжатой версии (для опыта я сжал с помощью upx исполняемый файл игры GTA и он перестал работать).
3. Есть и другие минусы и минусики, о которых сейчас и не вспомню.
Теперь о новом подходе (претендую если не на авторстве самой технологии, то уж точно на уникальности её применения).
Подход основан на полной подмене образа исполняемого файла в памяти. Т.е. в кратце: загружается распаковщик с упакованной программой (как единое целое), распаковщик разворачивает образ упакованного приложения и подменяет им в памяти образ запущенной программы, т.е. образ распаковщика (самого себя).
Плюсы:
1. Сжимаем весь оригинальный файл как есть, не задумываясь об его содержимом, а не по секциям.
2. Нет никаких махинаций с оригинальным файлом, т.о. все хитрости, нюансы реализации остаются неизменными.
Сложности:
1. Код распаковщика должен быть naked, т.е. не использует RTL, но это условие есть и в вышерассмотренных упаковщиках. Это приводит к реализации необходимой функциональности RTL самому.
2. Код распаковщика должен быть перемещаемым, т.е. он должен корректно работать при любом расположении в памяти.
3. Код завязан на внутреннее устройство Windows, поэтому является менее надежным и требует апробации на всех целевых платформах.
В настоящий момент реализовано экспериментальная версия, способная работать с EXE-файлами, но с некоторыми ограничениями, например, адрес загрузки EXE должен быть 0x400000,- это наиболее часто используемый базовый адрес для EXE (ещё встречаются с базовым адресом 0x1000000).
Дополнительные возможности, предоставляемые технологией:
1. Технология позволяет упаковывать в один EXE не только исходный EXE, но ещё и некоторый набор вспомогательных DLL !!!
Т.о. может быть решена проблема «таскания за собой» необходимых DLL.
2. Кроме DLL в перспективе можно упаковывать и файлы-данные, например, можно упаковать воедино видео файл и его просмоторщик.
Но на первом этапе я бы сфокусировался на функциональности аналогичной ASProtect.
Что необходимо сделать?
Есть технические мелочи, которые надо доделать, а именно:
1. Реализовать возможность упаковки EXE-файлов с различными базовыми адресами.
2. Сейчас упакованная программа не имеет иконки, а по идее у неё должна быть иконка, как у исходного EXE. Т.о. надо научиться выдирать иконку из одного EXE и прикручивать её к другому.
3. Разобраться с различными методами упаковки и определить оптимальный (я попробовал два: minilzo и ucl применяемый в upx). Причем сейчас упаковывается один файл, но надо продумать момент, когда их будет несколько (EXE + DLLs). В дальнейшем надо придумать способ потоковой распаковки для файлов данных, чтоб распаковывать файлы с данными участками по мере необходимости, а не целиком. Но это дело далекого будущего.
Есть принципиальные исследовательские задачи:
1. ASProtect хорош тем, что предоставляет возможность создания trial и shareware, т.е. ограничивает использование по времени, запрашивает лицензионный ключ и т.п. Необходимо изучить этот вопрос с целью реализации подобной функциональности в нашем упаковщике. При этом надо учесть варианты различного взлома, которым подвержен ASProtect, и исключить их в нашем продукте.
2. В продолжении первого пункта, необходимо обеспечить защиту как кода распаковщика, так и упакованного EXE. Т.е. ввести криптование, обнаружение отладчиков и т.п. Это так же есть в ASProtect, значит актуально и для нас, но у нас должно быть лучше.
3. Создание простого и удобного GUI. Особенно это актуально для варианта, когда кроме EXE в упаковку будут включаться и доп. файлы.
В процессе разработки так же стоит продумать над коммерческой составляющей проекта, а именно:
1) как позиционировать себя на рынке;
2) собирать информацию о проблемах в аналогичных продуктах, не допускать их у себя и построить на этом рекламу (их минусы – это наши плюсы);
3) ориентироваться на сопряжение с новыми технологиями, т.е. выяснить будет ли работать работать с .NET приложениями, будет ли работать на Windows Vista. И придумать, как заставить работать.
Я предлагаю одному - двум программистам заняться любыми из перечисленных задач, в идеале всеми (последовательно), но по предварительному сговору.
А для начала заняться «техничесой мелочью» № 2 и исследовательскими задачами по обеспечению защиты и реализации триальщины. Для их решения на начальном этапе нет необходимости в предоставлении уже проделанной мною работы, т.о. я сохраняю свои интересы, а люди выясняют, на сколько им это интересно. При успешном сотрудничестве и положительных результатах мы объединяем наши усилия и наработки, на определенных условиях и соглашениях о неразглашении.
Для начала, думаю, достаточно. Отвечу на любые вопросы. Можно обсудить детально формат результата первого этапа деятельности, объем работы и сроки. Право выбора участников и организацию процесса я оставляю за собой.
Хочу обратить внимание, что перечисленное выше само по себе представляет ценность.
P.S. Я не заинтересован в затягивании процесса обсуждения, поэтому через неделю-полторы безрезультатности я закрываю тему и, скорее всего, удаляю её.
но если надо чтобы пакер был хорошим и быстрым и базонезависимым то надо писать его на ASM
И прежде всё же вникнуть в тему.
Для интересующихся: проект реализуется на C++. Используется Win32 API, NativeAPI, много андока. Т.е. проект весьма непростой и интересный с технологической точки зрения.
Приложил пробную версию.
Параметры командной строки:
packer.exe исходный.exe упакованный.exe
Это всего лишь пробная версия, так что многого от неё не ждите (что-то работать будет, а что-то нет).
Привожу статистику по размерам оригинальных и упакованных файлов:
IEXPLORE.EXE 93184 43521 НЕ ЗАПУСТИЛОСЬ :(
spyxx.exe 507904 169473 в 3 раза
ThunderBird.exe 7551077 3632641 в 2,1 раза
ICQLite.exe 3145308 1384449 в 2,3 раза
winamp.exe 1075200 437249 в 2,5 раза
quake4.exe 4857856 1629185 НЕ ЗАПУСТИЛОСЬ :(
вот думал куда задавать в личку или здесь, решил что здесь лучше. хотелось бы прояснить для себя некоторые моменты данного проекта и предложенной технологии.
[quote=Green]Сутью проекта является разработка EXE-упаковщика, основанного на технологии, отличной от используемой в общеизвестных аналогах (upx, ASProtect, yoda и т.п.).[/quote]
так что же это все-таки будет протектор с возможностью упаковки или упаковщик с антиотладочными примочками(+ антидамп)? или еще что-то? поскольку для позиционирования на рынке надо, наверное, определиться.
[quote=Green]2. Различные хитрости, оптимизации и искажения формата PE в исходном файле могут привести к неработоспособности сжатой версии (для опыта я сжал с помощью upx исполняемый файл игры GTA и он перестал работать).[/quote]
честное слово ни разу с таким не встречался, чтобы после упаковки exe(еще ничем не пожатый) не запустился. кстати минус известных упаковщиков в том, что они либо отказываются паковать уже запакованный каким то другим пакером файл либо пакуют, но он потом не запускается. отсюда вопрос: будет ли реализована в данном проекте такая возможность("двойного пакования" файла) или нет?
[quote=Green]Разобраться с различными методами упаковки и определить оптимальный (я попробовал два: minilzo и ucl применяемый в upx)[/quote]
а какой метод используется в приведенной демке? если конечно не секрет.
[quote=Green]Дополнительные возможности, предоставляемые технологией:
1. Технология позволяет упаковывать в один EXE не только исходный EXE, но ещё и некоторый набор вспомогательных DLL !!!
Т.о. может быть решена проблема «таскания за собой» необходимых DLL.
[/quote]
в том, что возможно будет упаковать в один EXE файл еще и длл, исходя из предложенной технологии, - понятно, но как это будет выглядеть при распаковке? длл будут распаковываться на жесткий диск, а та часть, что является EXE, будет распакована и ей подменят в памяти образ запущенной программы?
[quote=Green]В продолжении первого пункта, необходимо обеспечить защиту как кода распаковщика, так и упакованного EXE. Т.е. ввести криптование, обнаружение отладчиков и т.п.[/quote]
привязку к оборудованию тоже? и еще, вроде антиотладочных приемов довольно много, но большинство известны, так вот, предполагается ли в предложенной тобой исследовательской работе нахождение новых методов?
[quote=Green]2. Сейчас упакованная программа не имеет иконки, а по идее у неё должна быть иконка, как у исходного EXE. Т.о. надо научиться выдирать иконку из одного EXE и прикручивать её к другому.[/quote]
если в упакованном файле еще добавится секция ресурсов - это надеюсь не критично? потому как без неё вроде в этом вопросе никуда.
Собственно все. Заранее благодарен за ответы на мои возможно не самые удачные вопросы.
P.S. проект действительно интересный.
так что же это все-таки будет протектор с возможностью упаковки или упаковщик с антиотладочными примочками(+ антидамп)? или еще что-то? поскольку для позиционирования на рынке надо, наверное, определиться.
Думаю, это не принципиально. Единственный актуальный момент - это то, что все защитные примочки увеличивают размер.
Поэтому, в крайнем случае можно сделать, как у ASP,- два продукта отличающиеся только наличием защитной (и триальной) функциональностью.
честное слово ни разу с таким не встречался, чтобы после упаковки exe(еще ничем не пожатый) не запустился.
Я ведь не был голословным, привел конкретный пример - GTA.exe.
кстати минус известных упаковщиков в том, что они либо отказываются паковать уже запакованный каким то другим пакером файл либо пакуют, но он потом не запускается. отсюда вопрос: будет ли реализована в данном проекте такая возможность("двойного пакования" файла) или нет?
Как уже говорил, мой упаковщик пакует EXE как есть, без манипуляций с содержимым, поэтому ему всё равно, что паковать. В принципе, можно немного доработать, и он сможет создавать упакованные DLL. Такого ещё не было, чтоб DLL распаковывалась сама при загрузке. :)
а какой метод используется в приведенной демке? если конечно не секрет.
Не секрет. ucl, но без оптимизирующей фильтрации.
в том, что возможно будет упаковать в один EXE файл еще и длл, исходя из предложенной технологии, - понятно, но как это будет выглядеть при распаковке? длл будут распаковываться на жесткий диск, а та часть, что является EXE, будет распакована и ей подменят в памяти образ запущенной программы?
Тогда какой в этом смысл?
Всё распаковывается в памяти! На диске лежит один упакованный файл.
привязку к оборудованию тоже? и еще, вроде антиотладочных приемов довольно много, но большинство известны, так вот, предполагается ли в предложенной тобой исследовательской работе нахождение новых методов?
Я пока не разбирался в методах, знаю о существовании некоторых.
Поэтому и предлагаю кому-нибудь проделать работу по изучению и исследованию вопроса. Это касается, как изучения и совершенствования известных, так и нахождение новых методов. Единственное условие - обозримость сроков.
Опять же, эта работа является весомой сама по себе, даже без привязки к упаковщику. Результаты можно использовать в других программных продуктах, подготовить научный труд по этому вопросу и т.д.
если в упакованном файле еще добавится секция ресурсов - это надеюсь не критично? потому как без неё вроде в этом вопросе никуда.
Да, конечно, секция ресурсов появится, но там будет одна лишь иконка.
Наличие иконки (сл-но и секции) может быть опционально.
Собственно все. Заранее благодарен за ответы на мои возможно не самые удачные вопросы.
P.S. проект действительно интересный.
Вопросы отличные. Спасибо за проявленный интерес.
Меня больше беспокоит судьба своего упаковщика. Жаль если так и будет пылиться. Он и так уже валяется в репозитории где-то с полгода. Причем не один... :(
Все вопросы и предложения в приват.