Использовать регистр ESP

Тема в разделе "WASM.ASSEMBLER", создана пользователем persicum, 7 авг 2007.

  1. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Работаю с четырьмя массивами, их нужно по быстрому и произвольно индексировать, регистров нормальных не хватает, для трех массивов использую базы ebp, esi, edi,
    ну а для четвертого использую esp.

    Типа mov eax, [esp + ecx*4]

    Перед запуском процедуры выполнил

    push esp...

    Шутка!!! =))) Заховал ESP в статическую ячейку, ну а потом ясен глаз восстановил...

    А теперь вопрос!
    Опасно ли такое нецелевое использование ESP для данных и для Винды в целом???
    На первый взгляд все работает...
     
  2. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    mov rEsp, esp
    [если здесь нет явного ображщения к стеку и вызова процедур, а так же переходов веущих за предел этого блока, то неопасно]
    mov esp,rEsp
     
  3. Agent666

    Agent666 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    98
    В ring0, если разрешены прерывания, то опасно.
     
  4. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    А когда они разрешены? (если не ковырять отладчиком уровня ядра)
    А моя прога просто пользовательская без всяких привелегий...

    И вообще, организацию разделения доступа в памяти представляю смутно,
    но наверное у каждой запущенной проги или процесса своя виртуальная вершина стека?
     
  5. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    У каждого потока
     
  6. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Вопрос стоит так, если прога на каком-нибудь участке явно не использует стек или вызов функций, то может ли Винда или другая ОС, или runtime-библиотека, или прерывания или системные процессы положить что-нибудь незаметно в стек?

    А сам я от ESP отказался. Просто слил два массива вместе и база у них теперь одна,
    а смещение заранее известно.

    Береженого бог бережет, сказала монашка про незаряженное ружье... =)))
     
  7. halyavin

    halyavin New Member

    Публикаций:
    0
    Регистрация:
    13 май 2005
    Сообщения:
    252
    Адрес:
    Russia
    Если возникнет исключение, то возникнут большие проблемы. С другой стороны, ты их все равно не перехватываешь, раз esp используешь...
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    При обработке прерывания используется стек.. если его не будет, то кранты )
     
  9. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Ну persicum сказал, что у него просто r3 прога, так что можно юзать ESP как угодно.
     
  10. sergh

    sergh New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    128
    Адрес:
    rsdn
    >> Вопрос стоит так, если прога на каком-нибудь участке явно не использует стек или вызов функций, то может ли Винда или другая ОС, или runtime-библиотека, или прерывания или системные процессы положить что-нибудь незаметно в стек?

    DOS может :) ОС защищённого режима - нет. "Незаметно" происходят только прерывания и исключения, в винде и всех прочих ОС защищённого режима они обрабатываются в ring0. При переключении и возврате из ring0 пользовательский стек не используется, используется стек ядра, к которому ты доступа не имеешь.

    Иначе любой пользователь, испортив свой стек, мог бы нарушить работу всей ОС.
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    sergh
    Ну.. надо конечно попробовать, но вряд ли исключение корректно обработается в ntdll.KiUserExceptionDispatcher если пользовательский стек разрушен. Скорее всего рухнет сам процесс и все..
     
  12. Ultrin Faern

    Ultrin Faern New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    170
    Так как esp будет указывать все-таки на рабочую область памяти, то все-таки поток не упадет, но вот данные для расчетов подпортятся.

    Кстати, вирусы любят пользоваться чужим стеком для своих нужд. :)

    Поэтому вопрос стоит так - насколько критичны результаты расчета?

    Я предлагаю сделать так:
    1) обьявить переменную
    2) использовать xchg для обмена значения регистра и переменной.
    Более тормознуто, зато безопасно.
     
  13. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Вот код, который показывает, использует ли Винда пользовательский стек.
    Стоял на голове, стучал по клаве, елозил крысой, закрывал-открывал форточки,
    вывод один - не использует, не портит!

    Код (Text):
    1. function TestStack:Cardinal;
    2. asm
    3.  push ebx // этого требует соглашение о регистрах
    4.  
    5.  mov ebx,$12345678
    6.  push ebx
    7.  pop ebx // теперь на -1 этаже стека - 12345678h
    8.  
    9.  mov edx,3 // внешний цикл, чтоб подольше было
    10. @L2:
    11.  
    12.   mov ecx,$FFFFFFFF // внутренний цикл
    13. @L1:
    14.   nop
    15.   nop
    16.   nop
    17.   nop
    18.   nop
    19.   loop @L1
    20.  
    21.  dec edx
    22.  jnz @L2
    23.  
    24.  xor eax,eax // возвращаем 0, если стек подпорчен
    25.  mov edx,1
    26.  cmp ebx,[esp-4]
    27.  cmove eax,edx // возвращаем 1, если все OK
    28.  
    29.  pop ebx
    30.  
    31. end;
    К искажениям очень критичны, а тормоза недопустимы.
    Как я уже сказал, проблему индексирования массивов я решил
    расположив их сплошняком в памяти, при этом один базовый регистр высвободился
    и от esp несмотря ни на что я отказался, обошелся одним базовым регистром для двух массивов,

    mov eax,[edi + ecx*4] - из первого массива
    add eax,[edi + ecx*4 + смещение ] - из второго массива
     
  14. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    persicum
    Ты не понял о чём тебе говорили про исключения. Ясно дело, что в твоём примере ничего не испортится. А вот если поставить seh изменить esp и вызвать исключение, то х.з. что получится. Кому не лень, тот проверит:) И, надеюсь, выложит результаты. Имхо Great прав, на счёт того, что процес рухнет.
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Проверил :)
    Простой пример на FASM:
    Код (Text):
    1. include 'win32ax.inc'
    2.  
    3. .code
    4.  
    5. ;
    6. ; Точка входа
    7. ;
    8.  
    9. start:
    10.         ; Ставим SEH обработчик
    11.         push handler
    12.         push dword [fs:0]
    13.         mov  dword [fs:0], esp
    14.  
    15.         ; Стираем ESP
    16.         xor  esp, esp
    17.  
    18.         ; Генерируем исключение. Будет вызван handler
    19.         xor  eax, eax
    20.         mov  eax, [eax]
    21.  
    22.         ; .. сюда полюбому уже не дойдем ..
    23.  
    24. ;
    25. ; SEH обработчик
    26. ;
    27.  
    28. handler:
    29.         ; Если Windows действительно насрать на ESP и она ставит свой, тогда этот код вызова MessageBox выполнится успешно
    30.         ; и мы увидим окошко. Если нет - возникнет исключение в SEH-обработчике (здесь) и программа вылетит без всяких предупреждений.
    31.         invoke MessageBox, HWND_DESKTOP, "Handler executed successfully", "SEH & ESP test", MB_ICONINFORMATION
    32.  
    33.         ; Если добрались до сюда - значит все ок.. завершаемся
    34.         invoke ExitProcess, 0
    35.  
    36. .end start
    Если закомментировать XOR ESP, ESP то месаж бокс показывается успешно, а если оставить - программа вылетает в результате того, что винда пытается использовать испорченный стек потока.
    Олька при выполнении MOV DWORD PTR EAX, [EAX] говорит что Debugged program was unable to process the exception.
    Бряк на KiUserExceptionDispatcher так и не сработал.
    Делаем выводы...
     
  16. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Кто сказал что сех на стеке обязан лежать?
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А какая разница? Я не про это говорю. Можно и не на стеке - я ESP порчу потом это раз, а два - от того, что я испорчу ESP, страницы по адресу [FS:0] никуда не денутся и обработчик можно вынуть будет винде спокойно.
     
  18. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Вообщето я наверное не прав. Кроме стека никак не получается зарегать обработчик.
     
  19. wasm_test

    wasm_test wasm test user

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

    Код (Text):
    1. .data
    2. se_member dd 0, handler
    3.  
    4. .code
    5.   mov eax, [fs:0]
    6.   mov [se_member], eax
    7.   mov dword [fs:0], se_member
    8.  
    9.  ....
    UPD: Упс... не выходит =) Видимо и правда только в стеке можно
     
  20. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Если в хрюше, то софтварный DEP рулит - [fs:0] должен указывать обязательно на стэк, а сам обработчик наоборот не должен лежать в стэке. Проверка осуществляется по TIB.StackBase\StackLimit, так что при желании можно и над ними поизвращаться ;)