какова разница между ret и add esp,4 / jmp dword ptr [esp-4] ?

Тема в разделе "WASM.NT.KERNEL", создана пользователем vladqq, 3 май 2010.

  1. vladqq

    vladqq New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2009
    Сообщения:
    69
    добрый день господа

    подскажите пожалуйста, какова разница между ret и add esp,4 + jmp dword ptr [esp-4] в кернел моде (за исключением того что add изменяет флаги)?

    в юзер моде работает нормально, в кернеле почему то вылазят странные глюки.
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    vladqq
    Память ниже границы стека(Esp) юзать нельзя, она не ваша и там может быть что угодно после прерывания к примеру.
     
  3. vladqq

    vladqq New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2009
    Сообщения:
    69
    тоесть между
    add esp,4
    и
    jmp dword ptr [esp-4]
    может быть вызвано прерывание которое будет юзать стек, который находится ниже текущего (для моего треда) значения esp ?
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    vladqq
    В ядре при прерываниях стек не переключается, так как CPL процедуры тотже самый(0). IRET-фрейм затрёт адрес возврата:
    Код (Text):
    1. [Esp - 3*4] xxxx    rEip
    2. [Esp - 2*4] xxxx    rCs
    3. [Esp - 4]   rEip    rEFlags
    4. [Esp]:      xxxx    xxxx
    Тогда после возврата на инструкцию jmp dword ptr [esp - 4] будет загружен rEFlags -> rEip, что есть переход вникуда и в лучшем случае возникнет #GP/#PF.
     
  5. vladqq

    vladqq New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2009
    Сообщения:
    69
    опа, спасибо большое! именно эта хрень и происходит. всё никак не мог понять откуда флаговый регистр появляется в eip.
    в юзер моде я так понимаю такое происходить не будет ?
     
  6. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    vladqq
    А куда оно нахрен денется? callback-функции на такое вполне способны.
     
  7. vladqq

    vladqq New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2009
    Сообщения:
    69
    ясно, всем тенкс за ответы!
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    CyberManiac
    А можно на этом по подробнее? Какие это callback-функции на это способны?
    AFAIK единственный вариант, когда ни с того ни с сего может потереться содержимое выше (меньше) esp, — это грязный инжект через SetThreadContext... ну и намеренная запись, конечно, но никто (особенно сама винда) этим обычно не занимается.
     
  9. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    l_inc
    А любые, которые будут вызываться в том же потоке.
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    CyberManiac
    А любые, которые будут вызываться в том же потоке, — это либо плановые вроде EnumWindows, либо доставляющие юзермодные APC, которые не будут исполняться, пока поток сам этого не захочет, войдя в alertable состояние.
    Поэтому связка add esp,4 + jmp dword ptr [esp-4] должна в юзермоде гарантированно исполняться правильно.
     
  11. vladqq

    vladqq New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2009
    Сообщения:
    69
    на практике так и происходит - в юзермоде я не заметил проблем, тестил долго. в кернеле же сразу вылез флаговый регистр в EIP.
     
  12. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    l_inc, мультимедийные таймеры по идее от желания потока не зависят.
     
  13. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    CyberManiac
    Для них отдельные потоки создаются. Либо они доставляют APC worker-потокам.
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    vladqq
    В юзермоде стек переключается при прерываниях на DPC-стек(хардварный из TSS).
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    l_inc
    Верно только для кода изолированного от калбэков и исключений, которые доставляются в контексте текущего процесса. Нельзя использовать стек ниже, чем текущая граница.
     
  16. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Вместо add esp,4 .... можно заюзать pop reg32, jmp reg32.