Размер сегметна код и данных
Должны ли они быть кратны 512 для win32?
Надеюсь, я вас правильно понял.
в Win32 есть 4 сегмента которые полностью охватывают виртуальную память процесса.
1. Сегмент данных с DPL 3
2. Сегмент кода с DPL 3
3. Сегмент данных с DPL 0
4. Сегмент кода с DPL 0
и ещё несколько штук, но они почти не используются
изменить в user mode их нельзя. в kernel mode их изменить можно, вот только это повлечёт за собой BSOD
вопрос пожалуйста конкретнее.......
в Win32 есть 4 сегмента которые полностью охватывают виртуальную память процесса.
1. Сегмент данных с DPL 3
2. Сегмент кода с DPL 3
3. Сегмент данных с DPL 0
4. Сегмент кода с DPL 0
и ещё несколько штук, но они почти не используются
изменить в user mode их нельзя. в kernel mode их изменить можно, вот только это повлечёт за собой BSOD
вопрос пожалуйста конкретнее.......
Мне нужен физический размер
И я так понял exe не может быть меньше 1кб
Я забил в программе в 2кб поиск kernel32.dll, генерацию таблицы импорта, создание консоли, вывод текста туда, и ожидание нажатия Ctrl+C. Это я еще не оптимизировал ее по размеру, а так она где-то 1.3-1.5кб весила бы.
Это надо в ПЕ заголовке копаться или средствами ассемблера можно?
Пожалуй проще покопаться в заголовке PE и исправить нужные значения. Ручками обрезать очень быстро задолбаться можно, поэтому проще на каком-нибудь C или C++ прогу написать, тем более что в стандартных win32 заголовках описаны форматы таблиц PE и MZ (не помню точно где)
В Windows миниматьное выравнивание секций 512 байт, т.к. PE-формат предпологает заголовок, размер которого отнюдь не нулевой, то секция кода начнется как минимум с 512 байта и будет как минимум 512 байт. И того, минимальный размер - 1кб.
Конечно, можно выбросить нули, которые добивают секцию кода до 512 байт, но это будет нарушением формата PE-файлов и не все загрузчики его загрузят.
Т.о. минимальный валидный PE-файл может быть не менее 1кб.
P.S. А невалидный может быть и вовсе равен нулю. :D
Спецификация формата PE. Слыхали о такой?
http://www.microsoft.com/whdc/system/platform/firmware/PECOFFdwn.mspx?
FileAlignment
The alignment factor (in bytes) that is used to align the raw data of sections in the image file. The value should be a power of 2 between 512 and 64 K, inclusive. The default is 512. If the SectionAlignment is less than the architecture’s page size, then FileAlignment must match SectionAlignment.
We’re sorry, but we were unable to service your request
Если уж ссылаться на MS, то VS тоже они написали. Тогда что же получается MSVC++ генерит exe-шники для инвалидов?
PS: спасибо за пример :)
PS. Туплю, тоже скачал.
Мы вообще-то про PE-формат говорили. При чем тут твоя ось? Не вноси "путаницы понятий"
Ты собираешься писать программы для ОС Phantom-84 или под Windows?
Если под Windows и корректные приложения, то смотри спецификацию - 512 байт.
Спецификация - это не теория, а технический документ.
Знакомство читателя с PE-форматом не входит в нашу задачу, и предполагается, сто некоторый опыт работы с Пешками у него уже имеется. Существует множество описаний PE-формата, но среди них нет ни одного по-настоящему хорошего. Официальная спецификация (Microsoft Portable Executable and Common Object File Format Specification), написанная двусмысленным библейским языком, скорее напоминает сферического коня в вакууме, чем практическое руководство. Даже среди сотрудников Microsoft нет единого мнения по поводу того, как её толковать, и различные системные загрузчики ведут себя сильно неодинаково. Что же касается сторонних разработчиков, то здесь и вовсе царит полная неразбериха.
Структура PE-файла состоит из заголовка (header), страничного имиджа (image page) и необязательного оверлея (overlay). Представление PE-файла в памяти называется его виртуальным образом (virtual image), или просто образом, а на диске – файлом, или дисковым образом. Если не оговорено обратное, то под образом всегда понимается виртуальный образ
Дисковый файл и его виртуальный образ – это, как говорят в Одессе, две большие разницы.
Обратите внимание на выделенное жёлтым шрифтом, и посмотрите и обратите внимание на заголовок 3.4.2. Optional Header Windows-Specific Fields (Image Only)
Т.о. спецификации моя программа не противоречит.
Я на XP пробовал 16 и 32, работает нормально. Конкретных цифр я даже у Криса Касперски не нашёл. Думаю приемлемый способ - поставить виртуальную машину, на неё все возможные ОС, и тестить Пешки на них. Всё заработало – значит пойдёт.
В Windows NT существует недокументированная возможность отключения выравнивания, основанная на том, что загрузку прикладных исполняемых файлов/динамических библиотек и системных драйверов обрабатывает один и тот же загрузчик.
Если Section Alignment = File Alignment, то последнее может принимать любое значение, представляющее собой степень двойки (например, 20h).
…
Для создания невыровненных файлов можно воспользоваться линкером от Microsoft, задав ему ключ /ALIGN:32 совместно с ключём /DRIVER. Без ключа /DRIVER ключ /ALIGN будет проигнорирован, и линкер использует кратность выравнивания по умолчанию.
взято из книги:
Крис Касперски. Компьютерные вирусы изнутри и снаружи.
ЗЫ. Ещё у винды пару байт отбил. Пример весит 640 байт.
PS: Все эти ключеки и методы описаны в DDK/MSDN, и все, кто серьезно пишет драйвера под Windows, да и не только, о них знают.
выранивание 512 сделано для того чтобы секции в файле были выравнены на границу сектора
Ценность? В зависимости от сложности случая можно память серьезно сэкономить. Кроме того метод идеально подходит для уменьшения размера сдампнутых приложений
UPD: Нашел уже
А теперь стоит подумать еще раз, но уже головой.
---
Священные места недалеки,
Но нет дорог, ведущих к ним.
Если идти туда, куда укажут вам,
Найдете скользкий,
Покрытый мхом мост.
Вот только всякую дурь надоело читать, и задаватьцо вопросом, что же курит аффтар?
Да вы батенька, наверно не знаете, кто такой Крис Касперски... Книжки он вирусами назвал, чтобы читателей-чайников отсеять. Там освещены актуальные вопросы по безопасности.
Плюс есть рад последствий о которых здесь никто и думать не хочет или не может.
Ну так просвети. Возможно, это и снизит быстродействие (не тестировал), но тема не об этом, а об уплотнении.
И что это дает? уменьшение размеров на диске на Align * (SectionsCount - 1) в лучшем случае, и на несколько страничек в виртуальной памяти,
Создатели .NET и всякой подобной хрени наверно также и думали... А ещё мне интересно, что они курили, когда сиё творение производили.
А если серьёзно, мне пока не требуется минимальный размер, но мало ли кому надо будет.