Использовать esp для адресации массива

Тема в разделе "WASM.BEGINNERS", создана пользователем Adrax, 21 сен 2007.

  1. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Если esp = 0 при CPL = 3 (т.е. в user mode), то ничего страшного, т.к. для сохранения EFLAGS/CS/EIP используется стек обработчика прерывания, т.е. стек ядра.
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Great
    Вот тут я тоже не совсем понимаю. Точнее, я не знаю, что значит для отладчика First Chance/Second Chance.

    Возможно, FirstChance вызывается если при первом обходе цепочки обработчиков никто не согласился обработать исключение, а SecondChance когда обработчики вызываются повторно, в процессе раскрутки? Но это только предположение. Да и какой смысл в этом я не понимаю.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    в любом случае отладчик сперва получает какой-то шанс обработать исключение еще до выполнения всех обработчиков даже по первому разу.. не знаю как это называется, но это можно заметить.

    например так

    push handler
    push fs:[0]
    mov fs:[0], esp
    xor eax, eax
    mov [eax],eax

    отладчик сначала брякнется на mov [eax], eax и скажет мол access violation at 00401020 while writing to 00000000, а уж потом можно выбрать - pass to the program или что там еще.
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    кстати насчет использования стека ядра - ну тогда получается что iretd тоже использует стек ядра, так?
    а почему тогда работает такой код?

    pushf
    push cs
    push offset _1
    iretd
    _1:
     
  5. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Great
    Да, проверил, в обработчике вернул ExceptionContinueExecution, но отладчик поймал исключение раньше моего обработчика. М.б. он перехватывает что-то начиная с KiUserExceptionDispatcher?
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Mika0x65
    олька работает насколько я помню на DebugEvent-ах
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Great
    А что в нем иллегального? Выполняется iretd, процессор сравнивает CPL с CPL, который находится в стеке, в регистре cs, видит, что смены привилегий не произошло, извлекает из стека регистры, загружает их, и выполнение происходит дальше.
     
  8. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    просто наблюдение, следующий код в режиме ядра ведёт к багчеку 0x0000007f (UNEXPECTED_KERNEL_MODE_TRAP) :
    Код (Text):
    1.     __asm xor esp, esp
    2.     __debugbreak();
    значит всё равно ядро как-то обрабатывает такое исключение, значит используется другой стек ядерного обработчика, иначе был бы аппаратный еррор
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Mika0x65
    да, согласен что протупил.. не про то думал когда писал)
     
  10. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    rain
    Давно хотел провести такой эксперимент. А какой номер обработчика при этом вызывается? Я раньше думал, что будет #DF, но сейчас не уверен.
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Mika0x65
    надо посмотреть какой тип trap-а. вполне возможно что и double fault
     
  12. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    угу угадали 0x00000008, or Double Fault
     
  13. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    rain
    Но непонятно, как дальше идет работа со стеком? Уго ж, фактически, нет.
     
  14. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    во-во, вот это и мне не понятно =\
     
  15. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    n0name
    Тогда почему олли нормально отрабатывает такой код
    Код (Text):
    1. mov  edx,esp
    2. xor  esp,esp
    3. nop
    4. int3
    5. nop
    6. int 3
    7. nop
    8. mov  esp,edx
    9. int3
    10. ; mov  esp,some_buf
    11. ; push eax
    12. ; call [ExitProcess]
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    rain
    вероятно в обработчике Double Fault это предусмотрено и он пересоздается..
     
  17. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    тут спрашивали про first/second-chanse debug message. Ниже отрывок из руссиновича, он правда неуточняет насчёт стеков, но для общего развития прочитать стоит:
     
  18. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Если в ring-0 происходит исключение, обработчик которого тоже сидит в ring-0, то процессор пытается запихнуть адрес возврата и флаги в существующий стек. Если у него это не получается, а происходит снова исключение, получается Double Fault. А обработчик DF под виндой оформлен как отдельная задача, указан TSS, так что процессор делает task switch и использует новый стек, а он заведомо существует.
     
  19. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    diamond пасиб, это вы из своего опыта или вычитали где-то?
     
  20. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    rain Про общую обработку исключений - мануалы Интела, про #DF в винде - так показывает дамп IDT любым инструментом, #DF там один из очень немногих обработчиков, использующих собственную задачу.