С какого адреса нас вызвали?

Тема в разделе "WASM.BEGINNERS", создана пользователем Flasher, 12 мар 2009.

  1. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Есть код
    Код (Text):
    1. 1. call MyDispatcher
    2. 2. ret
    3. 3.
    4. 4. MyDispatcher proc
    5. 5.
    6. 6. MyDispatcher endp
    Как из моей процедуры получить адрес строки 1. ? Т.е. адрес вызова моей процедуры.
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Пора открыть для себя слово 'stack'?
     
  3. qwertyui

    qwertyui New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2009
    Сообщения:
    28
    в процедуре напиши mov eax,[esp] тоесть возьми из стека адрес возврата и все
     
  4. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Спасибо.
    Не зря же я в beginners запостился :))
     
  5. _int2e_

    _int2e_ New Member

    Публикаций:
    0
    Регистрация:
    1 мар 2009
    Сообщения:
    124
    Это если в процедуре локальных нет )
    А иначе у нас фрейм, тобто такой вот кодес

    т.е. в зависимости от наличия локальных, либо
    mov eax, [esp] ;при остуствии
    либо
    mov eax, [ebp+4] ;при наличии
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Для перехватов часто используется не Jmp, а Call. Именно чтобы в стеке был сохранён адрес перехвата(для его контороля)..
     
  7. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Своего рода защиту мучу, чтоб мою процедуру не могли юзать с других мест.
    Что-т на подобие этого:
    Код (Text):
    1. start:
    2.          call MyDisp
    3.          ret
    4.  
    5. MyDisp proc
    6.         mov eax,[esp]
    7.         sub eax,5
    8.         mov ecx,offset start
    9.         cmp eax,ecx
    10.         jne _exit
    11. ; ----
    12. ; ----
    13. ; ----
    14. _exit:
    15.         ret
    16. MyDisp endp
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    _int2e_
    У автора топика перехват модификацией первой инструкции функции, если есть пролог обычно вторую его инструкцию заменяют на короткий Jmp(если рядом есть свободное место), либо весь пролог на Jmp near, тоесть Ebp есчо не перезагружается.