Значение EIP

Тема в разделе "WASM.ASSEMBLER", создана пользователем PaCHER, 25 мар 2006.

  1. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    Нужно получить значение регистра EIP любым методом кроме (E800000000 call XXXXXXXX) вообще не используя call.
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    PaCHER

    Через SEH:

    1. Установить обработчик SEH. (Сделать это позиционно-независимым методом накладно, если вообще возможно...)

    2. Справоцировать исключение (xor ecx,ecx div ecx)

    3. Достать EIP из контекста.
     
  3. netw0rm

    netw0rm New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2005
    Сообщения:
    78
    SEH. Там в контексте передаётся eip.

    ======

    добавлено:

    Я опоздал пока думал ;)
     
  4. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    PaCHER

    Команда pusha интересно че делает?
     
  5. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    EvilsInterrupt

    EIP она точно не push'ит.
     
  6. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    Quantum и netw0rm

    При SEH получается офигенная задержка.



    1 Способ: - Слежение за EIP

    Создать новый поток, который будет читать структуру CONTEXT другого.



    2 Способ: - Текущее значение EIP

    При старте программы EIP указывает на точку входа. Соответственно можно в любой момент времени прочитать EIP, указав метку:



    ;...

    _EIP: mov eax, offset _EIP

    ;...



    В eax сохраняется значение EIP. Так же метку можно кинуть куда угодно, чтобы прочитать EIP в другом месте.
     
  7. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852




    Это сработает только в том случае если у нас exe файл да еще загружен по таму адресу который по умолчанию вписал компалятор.



    А если у нас динамическая библиотека. И каждый раз грузится по свободным адресам то точка входа будет пересчитыватся.
     
  8. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    Вариации на тему



    BOOL GetThreadContext(

    HANDLE hThread,

    LPCONTEXT lpContext

    );

    вызовом из самого себя.
     
  9. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    А это практическая реализация:

    1) Создаем поток который будет вызывать GetThreadContext

    2) Свой поток зацикливаем на EIP - <EBFE JMP EIP>

    3) Тот который опрашивал изменяет EIP = EIP + 2 и передает в TLS значение EIP.

    4) Код после EIP получает значение своего EIP из TLS
     
  10. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Vasil

    Дасс, надо сначала было не полениться слазить в Юрова хотябы :)
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    PaCHER

    Не понятна постановка задачи.

    Если нужно определить EIP в своей проге, то ответ тривиальный - ставишь метку и просто грузишь ее адрес в регистр lea или mov. За dll беспокоиться нечего, т.к. все ссылки на адреса попадают в секцию релоков и автоматом пересчитываются загрузчиком

    Если же речь идет о внедрении кода в работающую прогу, то самый простой способ это ес-но call. Если хочется поизвращаться, то остается прерывать поток и читать CONTEXT или ломиться в TSS
     
  12. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    Bill_Prisoner

    А зачем зацикливать на EIP??? По моему нету смысла - просто остановить и все - leo прав!
     
  13. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Bill_Prisoner

    Последний твой пост - Рулез! :)))
     
  14. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    EvilsInterrupt

    Не учи меня читать :)
     
  15. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
    Можно еще через fpu, например заюзать fstenv, а в сохраненном блоке будет instruction pointer на последнюю выполненную fpu команду.
    Код (Text):
    1.  
    2. get_eip:  fldz
    3.           sub   esp, 28
    4.           fnstenv byte ptr [esp]
    5.           mov   ebp, [esp+12]   ;; ebp == offset get_eip
    6.           add   esp, 28
    7.  
     
  16. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Dr.Golova

    Спасибо!
     
  17. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852




    Собственно это и интересовало :) Спасибо.
     
  18. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    PaCHER



    тока в вирях лучше не юзать =)
     
  19. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    doctor_Ice

    Это почему?
     
  20. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
    > Это почему?



    Единственное что приходит в голову - на 286 работать не будет :)