ПОчему в PE-файле не отбрасывается секция с IMAGE_SCN_MEM_DISCARDABLE?

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 20 июн 2010.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Да, почему?

    ...Друзья! Вот здесь http://www.wasm.ru/article.php?article=green2red02 перечислены характеристики, которые может иметь каждая секция, и если одна из характеристик будет IMAGE_SCN_MEM_DISCARDABLE (0X02000000), то секция по загрузке файла отбросится


    Я изменяю секцию в hex-редакторе на такую характеристику. То есть секция кода была: 0X60000020, стала 0X62000020. Так, по логике вещей вообще эта программа выполняться не должна- раз эта секция отбрасывается!Но она очень даже неплохо выполнняется.

    Но, может, я чего не так делаю?
    Тогда смотрю всю эту муть в OllyDbg, вижу:
    Characteristik= CODE:DISCARDABLE:EXECUTE:READ

    Ага, всё-таки я угадал с написанием байта! Но секция не отбрасывается. Почему?
    (Пример с секцией кода я взял как самый иллюстративный. Не отбрасываются также и другие секции, например DATA)

    ...НАконец, нет отбрасывается, даже последняя секция по счёту в даннром исполяемом файле (секция ресурсов).
    ВСё это очень странно. Помогите пожалуйста! Спасибо.
     
  2. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    IMAGE_SCN_MEM_DISCARDABLE используется только в дровах (после инициализации дрова венда отбрасывает все DISCARDABLE секции для уменьшения расхода системной памяти).
     
  3. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Спасибо.
     
  4. Bazhan

    Bazhan Андрей

    Публикаций:
    0
    Регистрация:
    8 янв 2008
    Сообщения:
    71
    Адрес:
    Украина
    dermatolog
    неправильно, откройте спецификацию и почитайте
     
  5. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    684
    ага дерматолог прав просто в узермоде это не критично и потому анмапинг и не происходит а кернел памяти то не так уж чтобы много
     
  6. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    684
    малоли что в спеках написано, в реальной жисти всё иначе
     
  7. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Ну ладно, пусть этот флаг используется в драйверах, но если я своей властью его поставил, винда его рапознала... там вроде не написано драйвер он или нет! PE и всё тут.
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    смотря как подгружать образ.
    если подгружается во время выполнения CreateProcess() то это винда знает что это не драйвер :)
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    amvoz
    И что ? Кроме вольной "зелено-красной" интерпретации есть официальная спецификация PE, в которой черным по белому сказано - Section can be discarded as needed, т.е. не "отбрасывается", а может быть сброшена, если понадобиться. Т.е. указание этого флага "своей властью" - это не приказ винде отбросить секцию, а лишь разрешение сделать это, если винда сочтет нужным.
    А как уже говорили, в юзермоде такая необходимость практически никогда не возникает, т.к. если не указан флаг NOT_PAGED то секция является подкачиваемой и соотв-но, и загружается в физ.память только по необх-ти (постранично по мере обращения), и в любой момент м.б. выгружена из физ.памяти, если потребуется. Т.е. с точки зрения физ.памяти проблем нет, а на то, что секция занимает часть вирт.адресов юзерского процесса, винде вообще "наплевать" :)
     
  10. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    В 16-битной Windows атрибут сегмента DISCARDABLE говорил о том, что его содержимое можно не выгружать в своп, а прочитать из файла при необходимости (обычно комбинировался с PURE/SHAREABLE). Если я правильно понимаю, 32-битные и выше в этом смысле скорее смотрят на IMAGE_SCN_MEM_NOT_PAGED, а всё остальное — за счёт copy-on-write.
     
  11. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    ну у меня опыта маловато, сам я не смог к такому умозаключению прийти, спасибо. Так-то по идее какой-то лишний флаг. Действительно, все страницы и так волей винды туда-сюда кочуют между оперативной памятью и файлом подкачки...
     
  12. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Как это – "не отбрасывается"? А это тогда что? :)
    Код (Text):
    1. //
    2. // nomage.cpp
    3. //
    4. // Discardable sections are really respected for windows images!
    5. // [w7 x64, vc10 x32 environment].
    6. //
    7. // Compile: cl nomage.cpp /GS- /GL /link /entry:main
    8. //
    9. #pragma section(".nomage", read)
    10. #pragma comment(linker, "/section:.nomage,d!wer")
    11.  
    12. __declspec(allocate(".nomage"))
    13. volatile const int nomage = 101;
    14.  
    15. int main()
    16. {
    17.     return nomage;
    18. }
     
  13. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Sol_Ksacap,

    Чтение из нечитаемой секции — фокус?
     
  14. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Что это, я не знаю. А что значит "не отбрасывается", я пожалуй повторю, хотя вроде понятно всё объяснил

    В hex- редакторе добавляю к атрибутам секции флаг
    #define IMAGE_SCN_MEM_DISCARDABLE 0x02000000

    После чего открываю экзешник в отладчике и смотрю на память. Эта секция на месте.
     
  15. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    как сказали выше отбрасывается при надобности, в драйверах поведение точно такое
     
  16. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Да я уж понял, просто попросили уточнить понятие "не отбрасывается"...
     
  17. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    amvoz
    А вот скомпилировал бы указанный отрывок – ничего бы не увидел в отладчике. И экзешник бы стабильно падал при попытке прочитать единственную глобальную переменную.

    Но поскольку baldr быстро нас раскусил, можно считать, что фокус не удался. А это действительно просто фокус – несмотря на то, что секция ".nomage" изначально объявляется как читаемая, директива "/section:.nomage,d!wer" заставляет линкер выставить ей атрибут "discardable" и убрать атрибуты "readable", "writable", "executable" – т.е. сегмент попросту получает протекцию NO_ACCESS (и "discardable" не влияет на результат). Надо сказать, что такая интерпретация этой комбинации флагов не является единственной – например, 'editbin' для неё выставит секции "discardable", "readable", "executable", и уберёт "writable". Вот здесь слегка изменённый текст начального вхождения, вытащенного из очереди.
     
  18. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    Sol_Ksacap
    Человек задал конкретный вопрос про IMAGE_SCN_MEM_DISCARDABLE, а вы начинаете "показывать фокусы" с нечитаемыми секциями. Вам действительно нечем заняться что-ли?