Глюк в SoftIce

Тема в разделе "WASM.ASSEMBLER", создана пользователем cmd_prompt, 19 июн 2006.

  1. cmd_prompt

    cmd_prompt New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2006
    Сообщения:
    28
    Адрес:
    Ukraine, Donetsk
    Поробуйте откомпилить и запустить при активном Ic'е следующий код: (не забудьте i3here on прописать)



    .code



    start:



    assume FS:nothing



    push offset Msg ; SEH

    push FS:[0]

    mov FS:[0], esp



    int 3



    db 66h



    jmp @@1



    Msg:

    invoke MessageBox, 0, addr szMessage, 0, 0



    @@1:



    invoke ExitProcess, 0



    szMessage db "Hello!",0



    end start



    Как вы думаете, что произойдет? Ice будет показывать прыжок на @@1 в обход мессаджа, на самом деле префикс 66h обрежет адрес джампа до 2-х байт, врезультате переход будет осуществлен на недопустимый адрес (offset @@1 and 0FFFFh) и SEH передаст управление на метку Msg.
     
  2. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    это глюк не si, а конкретно его дизассемблера. Этот глюк вообще присущ многим дизассемблерам, которые 'забывают' усекать до 16 бит целевой адрес 16-битного перехода в 32-битном режиме.
     
  3. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    Только SEH здесь кривой, так как его вызов не заканчивается ret.
     
  4. cmd_prompt

    cmd_prompt New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2006
    Сообщения:
    28
    Адрес:
    Ukraine, Donetsk


    SEH кривой для краткости, так как ExitProcess освобождает все русурсы, в т. ч. уничтожает SEH, то проблем возникнуть не должно. Кто знает - поймёт, для новичков рекомендую почитать статью "Win32™ SEH изнутри".