Использование стека под буфер ...

Тема в разделе "WASM.WIN32", создана пользователем dermatolog, 29 май 2006.

Статус темы:
Закрыта.
  1. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    В стеке есть некий буфер с указателем ниже ESP (нгапример ESP-0x100). Вопрос - может ли ядро при каких либо ситуациях запортить мне этот буфер (в том числе и при передаче управления другой ветке в моем приложении)?
     
  2. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    bpm на этот буфер и посмотреть, кто этот гад?
     
  3. dermatolog

    dermatolog Member

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

    P.S. Вопрос наверное нужно было адресовать к знатокам ядра - всегда ли ядро переключает стек при своей работе или все-таки может "гадить" в стек текущего процесса.
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Это могут сделать вызываемые подпрограммы. Выделяй место под буфер как обычно: sub esp,0x100. Тогда они будут использовать esp >= esp-0x101 (имеется ввиду оригинальный esp), если только корректны.
     
  5. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    2 IceStudent:

    Вопрос был задан конкретно про ядро.
     
  6. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    я делаю так и сбоев пока не наблюдалось

    lea eax, [esp-(4096+sizeof.UntocheableData)]

    StdAlign eax, 4096

    mov eax, d_w_p [eax+UntocheableData.Some]





    macro StdAlign arg1, arg2

    {

    add arg1, arg2

    and arg1, -arg2

    }
     
  7. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    2 doctor_Ice:

    в RING3 скорее всего в стек никто не лазит, а вот в RING0 уже ХЗ.
     
  8. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    dermatolog



    я думаю на практике можно выяснить безопасную глубину...спустится вниз на пару страниц и обьявить ее неприсутствующей.
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    dermatolog

    А подпрограммы в стеке действуют по другим принципам?
     
  10. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    2 IceStudent:

    Если ты не понял вопроса, то лучше ничего не отвечать :))
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    dermatolog

    с иллюстрацией в виде кода было бы понятнее
     
  12. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    dermatolog

    Смысл вопроса не совсем понятен.

    Чтобы надежно использовать буфер ниже esp ты по любому должен быть уверен, что на данном куске кода никакие штатные и нештатные вызовы API либо невозможны (нет явных вызовов и невозможны исключения), либо они заведомо не затирают данный участок стека. И если ты чего то не предусмотришь, то какая фиг разница в каком кольце произойдет затирание твоего буфера :))

    Хотя если оно произойдет, то ИМХО в ринг3, т.к. мелкософты не зря упрятали ядро подальше и "гадить" где попало не станут, т.к. это нарушение принципов защиты и безопасности - наверное о таких "гадостях" можно только мечтать, к сожалению ;))
     
  13. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"




    Ядро не может, так как оно имеет свой стек, а вот вызываемые апи могут запросто. Если твой код не использует апи и не герерирует исключений, то проблем не будет.
     
  14. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    Задача состоит в следующем:

    Процедура представляет собой код без всяких CALL и API. На этапе выполнения кода я сам контролирую, чтобы ESP не "наезжала" на мой буфер. Т.е. при выполнении кода, который работает с буфером я полностью гарантирую его целостность . Возникающие исключения возможно будут портить его, но мне это уже не важно, т.к. в обработчике исключений будет "создаваться" новый буфер в стеке с указателем ниже вершины. Вопрос состоит только в том, что могут ли возникнуть ситуации (не зависимо в RING3 выпоняется этот код или в RING0) при которых в мой стек будет кто-то писать?



    2 Ms Rem:

    А если мой код работает на уровне RING0 (например это драйвер), то при при его работе точно известно что в его стек винда ничего не пишет при каких либо ситуациях ?
     
  15. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    P.S. Такой буфер мне нужен только для того, чтобы лишний раз не дергать выделение/высвобождение памяти, поэтому как раз и возник вопрос в том, чтобы использовать область стека под это дело.
     
  16. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"


    В этом случае винда будет в него писать контекст потока при входе в обработчик прерывания, в него будут писать dpc и apc прерывающие поток, так что скорее всего твой буфер затреться.
     
  17. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    Пасиба
     
  18. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine


    А стандартно выделять память в стеке религия
    не позволяет?
     
  19. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    dermatolog

    Раз 10, кажется, уже сказали, что никто в этот буфер гадить не будет. А есть ли уверенность, что esp - x вообще указывает на валидный адрес в памяти?
     
  20. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    dermatolog



    Т.е. Я понимаю примерно так твой вопрос:



    1. Ты получаешь управление на 0 кольце и пытаешся выделить память в стеке. => До передаче управления вызывавшей программы стек полностью в твоем распоряжении => Ошибка в твоем коде.

    ДА ПОМНИ КАЖДЫЙ СОЗДАНЫЙ ПОТОК ИМЕТ СВОЙ КОНТЕКСт ПРОЦЕССОРА И СВОЙ esp, поэтому если твоя вторая ветка программы новый поток, то имеено он может изменять стек.



    т.к. в обработчике исключений будет "создаваться" новый буфер в стеке с указателем ниже вершины.

    Выражение не совсем верно. Если исключение(прерывание) произошло в ring3, то esp будет загружено из TSS, и под Windows это одно и тоже значение.



    Подкачка и выделение памяти при обработке аппаратного прерывания не работает.



    2. Ты получаешь управление на 0 кольцо, что-то делаешь и выделяешь память в стеке и передаешь управление пользовательскому режиму, ожидая что в следующий раз тебе предоставят доступ к памяти в стеке из предидущего раза.

    В этом случае в стеке данные не сохраняются.
     
Статус темы:
Закрыта.