Добрый день. Интересует следующий вопрос: Насколько сильно при упаковке можно извращаться с секцией ресурсов? Пример: я упаковываю секцию ресурсов, размещаю упакованные данные в конце оригинальной секции и забиваю начало оригинальной секции .rsrc нулями. Упаковываю ТОЛЬКО секцию ресурсов. Заголовок PE не трогаю, все данные о ресурсах оставляю как и были. При запуске распаковываю ресурсы по нужному адресу и передаю управление на OEP. В ХР никаких проблем с этим не было. В 98-х же проблемы возникают, причем зачастую непонятные. В связи с этим и интересует как работа загрузчика с секций ресурсов, так и наиболее полное описание возможных манипуляций и ошибок при работе с ресурсами при упаковке. Конкретно, почему могут происходить ошибки при упаковке секции ресурсов (включая их дерево и т.д.)
Для защиты ресурсов я использовал несколько необычный метод. Секцию ресурсов в защищенном файле убирал полностью, а сами ресурсы хранил в своем собственном формате. К загрузчику добавляется часть, перехватывающая все апи работающие с ресурсами и обеспечивающая прозрачную работу с ресурсами для защищенного файла. В дампе при этом ресурсов совсем не оказывается, что сильно затрудяет распаковку (хотя есть обходные методы). Правда под 9x я ничего такого не делал, проверено только под NT.
MoonShiner Думаю правильно не секцией, а директорией, т.к. для ресурсов не обязательна отдельная секция, как и не обязательно имя .rsrc И дело в том, что ресурсы используются не только самой программой, а и всеми explorer оболочками, если ты упакуешь иконку или версию, то никто их не увидит (одно из правил, если имеется RT_VERSION то для её отображения директория должна располагатся в начале секции) Если это тебе не надо, то можешь все упаковать, а до оригинально EP главное правильно восстановить (в заботу лоадера проверка ресурсов не входит) з.ы. и поиск по форуму в конце концов ... тема заезджена, иначе давай конкретные вопросы
Секция-директория, это малоинтересно... Имя .rsrc же обязательно для 9х в некоторых случаях. Экспорт и импорт компиляторы пока пихают куда только могут, а ресурсы в большинстве случаев все-таки целиком сосредоточены в .rsrc-секции. Это я знаю. Про затирание иконок я тоже знаю и меня это мало волнует. Смысл в том, что винда не грузит некоторые файлы с запакованными ресурсами если этот "архив" так и кинуть в начало оригинальной секции ресурсов, забив остаток после архива нулями. Т.е. сам загрузчик проверяет валидность ресурсов и каким-то образом использует их при создании образа в памяти? Нужна инфа по ресурсам и работе с ними загрузчика.
> Для защиты ресурсов я использовал несколько необычный метод. Скорее кривой, а не необычный - пропадут иконки, стили под XP, а про всяческие TYPELIB и REGISTRY даже говорить не приходится.
MoonShiner Как раз для NT+ хотя не буду утверждать, судя по форумам у некоторых файлы с переименованной .rsrc работающие на 9x не пашут в XP
> Нужна инфа по ресурсам и работе с ними загрузчика. Если интерес с точки зрения ниписания пакера, то для 100% совместимости нужно оставить нетронутыми все директории ресурсов, а запаковывать только raw данные, пропуская естесно тайплибы, манифесты, иконки и пр., коии можно например свалить в другую секцию, или положыть до пожатых данных после.
Asterix Буду рад если вспомнишь каких, я только видел ".rsrc" в oleaut32.dll (что описано в UPX'е), воможно это имеет значение для VB'шных прог, но ниразу не встречал из-за этого глюков (ну кроме некоторых дебильных редакторов ресурсов ищущих их по имени секции MoonShiner Ещё работу лоадера можно "наглядно" посмотреть в ollydbg
Dr.Golova Те ресурсы которые должны быть видны, копируются в выходной файл в неизменном виде, тоесть все иконки и стили сохраняются. А те ресурсы в которые лезть незачем, тоесть диалоги и.т.д. будут защищены. И восстановить их будет куда сложнее, чем просто снять дамп.
MoonShiner Давай потестим так, вот прога без имени .rsrc и набитая мусором, если она у кого-то не запустится значит вина действительно лоадера Код (Text): ;================================================= format pe gui include '%fasminc%\win32a.inc' ;================================================= data resource message db 'resource garbage',0 entry $ invoke MessageBox,0,message,message,0 invoke ExitProcess,0 data import library kernel32,'kernel32.dll',\ user32,'user32.dll' include '%fasminc%\apia\kernel32.inc' include '%fasminc%\apia\user32.inc' end data end data ;================================================= 1890835895__rsrc.exe
От блин, у меня как раз Win2k SP4 %) На NT4.0 должно работать, другие значит что-то проверяют, интересно а чего вдруг Unknown file format? PE то правильный, по спецификации ... Хотя XP может манифест ищет, а 98-я чего?