Да, почему? ...Друзья! Вот здесь http://www.wasm.ru/article.php?article=green2red02 перечислены характеристики, которые может иметь каждая секция, и если одна из характеристик будет IMAGE_SCN_MEM_DISCARDABLE (0X02000000), то секция по загрузке файла отбросится Я изменяю секцию в hex-редакторе на такую характеристику. То есть секция кода была: 0X60000020, стала 0X62000020. Так, по логике вещей вообще эта программа выполняться не должна- раз эта секция отбрасывается!Но она очень даже неплохо выполнняется. Но, может, я чего не так делаю? Тогда смотрю всю эту муть в OllyDbg, вижу: Characteristik= CODE:DISCARDABLE:EXECUTE:READ Ага, всё-таки я угадал с написанием байта! Но секция не отбрасывается. Почему? (Пример с секцией кода я взял как самый иллюстративный. Не отбрасываются также и другие секции, например DATA) ...НАконец, нет отбрасывается, даже последняя секция по счёту в даннром исполяемом файле (секция ресурсов). ВСё это очень странно. Помогите пожалуйста! Спасибо.
IMAGE_SCN_MEM_DISCARDABLE используется только в дровах (после инициализации дрова венда отбрасывает все DISCARDABLE секции для уменьшения расхода системной памяти).
ага дерматолог прав просто в узермоде это не критично и потому анмапинг и не происходит а кернел памяти то не так уж чтобы много
Ну ладно, пусть этот флаг используется в драйверах, но если я своей властью его поставил, винда его рапознала... там вроде не написано драйвер он или нет! PE и всё тут.
смотря как подгружать образ. если подгружается во время выполнения CreateProcess() то это винда знает что это не драйвер
amvoz И что ? Кроме вольной "зелено-красной" интерпретации есть официальная спецификация PE, в которой черным по белому сказано - Section can be discarded as needed, т.е. не "отбрасывается", а может быть сброшена, если понадобиться. Т.е. указание этого флага "своей властью" - это не приказ винде отбросить секцию, а лишь разрешение сделать это, если винда сочтет нужным. А как уже говорили, в юзермоде такая необходимость практически никогда не возникает, т.к. если не указан флаг NOT_PAGED то секция является подкачиваемой и соотв-но, и загружается в физ.память только по необх-ти (постранично по мере обращения), и в любой момент м.б. выгружена из физ.памяти, если потребуется. Т.е. с точки зрения физ.памяти проблем нет, а на то, что секция занимает часть вирт.адресов юзерского процесса, винде вообще "наплевать"
В 16-битной Windows атрибут сегмента DISCARDABLE говорил о том, что его содержимое можно не выгружать в своп, а прочитать из файла при необходимости (обычно комбинировался с PURE/SHAREABLE). Если я правильно понимаю, 32-битные и выше в этом смысле скорее смотрят на IMAGE_SCN_MEM_NOT_PAGED, а всё остальное — за счёт copy-on-write.
ну у меня опыта маловато, сам я не смог к такому умозаключению прийти, спасибо. Так-то по идее какой-то лишний флаг. Действительно, все страницы и так волей винды туда-сюда кочуют между оперативной памятью и файлом подкачки...
Как это – "не отбрасывается"? А это тогда что? Код (Text): // // nomage.cpp // // Discardable sections are really respected for windows images! // [w7 x64, vc10 x32 environment]. // // Compile: cl nomage.cpp /GS- /GL /link /entry:main // #pragma section(".nomage", read) #pragma comment(linker, "/section:.nomage,d!wer") __declspec(allocate(".nomage")) volatile const int nomage = 101; int main() { return nomage; }
Что это, я не знаю. А что значит "не отбрасывается", я пожалуй повторю, хотя вроде понятно всё объяснил В hex- редакторе добавляю к атрибутам секции флаг #define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 После чего открываю экзешник в отладчике и смотрю на память. Эта секция на месте.
amvoz А вот скомпилировал бы указанный отрывок – ничего бы не увидел в отладчике. И экзешник бы стабильно падал при попытке прочитать единственную глобальную переменную. Но поскольку baldr быстро нас раскусил, можно считать, что фокус не удался. А это действительно просто фокус – несмотря на то, что секция ".nomage" изначально объявляется как читаемая, директива "/section:.nomage,d!wer" заставляет линкер выставить ей атрибут "discardable" и убрать атрибуты "readable", "writable", "executable" – т.е. сегмент попросту получает протекцию NO_ACCESS (и "discardable" не влияет на результат). Надо сказать, что такая интерпретация этой комбинации флагов не является единственной – например, 'editbin' для неё выставит секции "discardable", "readable", "executable", и уберёт "writable". Вот здесь слегка изменённый текст начального вхождения, вытащенного из очереди.
Sol_Ksacap Человек задал конкретный вопрос про IMAGE_SCN_MEM_DISCARDABLE, а вы начинаете "показывать фокусы" с нечитаемыми секциями. Вам действительно нечем заняться что-ли?