Как узнать EIP?

Тема в разделе "WASM.WIN32", создана пользователем Deader, 31 июл 2011.

  1. Deader

    Deader New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    96
    Как узнать EIP потоков процесса? GetThreadContext не работает, несмотря на то, что замораживаю поток перед тем, как делаю GetThreadContext. В teb потока я тоже не нашел eip... Вообщем, "хелп ми", кто может.
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Это как это?
    Уверен, что правильно вызываешь?
     
  3. ant_man

    ant_man New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2004
    Сообщения:
    23
    наверняка структуру не проинициализировал :)

    не хочешь апи - пиши драйвер, будешь крутым.
     
  4. Deader

    Deader New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    96
    так и есть, не сделал Cnt.ContextFlags:=CONTEXT_CONTROL;
    ant_man, tnx
    на худой конец сделаю через Int 2E
     
  5. Deader

    Deader New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    96
    все равно не работает - всегда для любых потоков возвращает константу 7C90E514 на WinXP 32bit.
    Так как же узнать EIP из юзермода??? Или это невозможно?
    зы
    по адресу 7C90E514 находится KiFastSystemCallRet, т.е. команда ret
    что, если прочитать в стеке адрес возврата по ret и получить нормальный контекст?
     
  6. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Deader
    Есть у меня подозрение, что потоки просто спят на WaitFor{Single|Multiple}Object. Большую часть времени потоки бездельничают, ожидая событий ввода/вывода. Чтобы быть уверенным, что GetThreadContext работает, можно написать маленькую программу, крутящую бесконечный цикл, а потом взызвать GetThreadContext для ее потока, в котором крутится цикл. Тогда станет понятно.
     
  7. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Замораживать не обязательно. Не существует потока, запрашивающего контекст, вне т-фрейма.
    Mika0x65
    Перед тем как заснуть они меняют кпл на нулевой, при этом сохраняется т-фрейм. Далее он доступен.

    Не возможно чтобы при корректных аргументах запрос контекста завершился не удачно(разумеется если прав хватает). ТС не понимает что есть нтстатус.
     
  8. Deader

    Deader New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    96
    Написал программу, проверил. В 99% случаев GetThreadContext возвращает на фиг нужное значение из ntdll и очень редко - нормальный контекст.
    Получается, чтобы получить нормальный контекст, нужно в цикле делать GetThreadContext пока не прийдет значение из страничного образа ехе-шника, или сделать образ PAGE_GUARD и ловить исключения... только как-то эти способы, мягко выражаясь, некрасиво выглядят....
     
  9. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Сделайте в цикле проверку регистра Eax на ноль(для NtGetContextThread разумеется, извините но я забыл что можно виньапи юзать). В случае не нуля отрубите себе руки.
     
  10. Deader

    Deader New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    96
    тс видит, что после Int2Е в eax возвращается ноль, что означает status_success
     
  11. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Значит вам нужно досконально изучить сей материал:
    http://www.wasm.ru/forum/viewtopic.php?pid=284176#p284176
    А есчо корректно заполнить флаги для запроса контекста следует.
     
  12. Deader

    Deader New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    96
    я пытаюсь получить контекст потока, который работает уже пол часа и за это время в нем наверняка успела выполниться вся инициализация)

    это уже давно проехали(см. в #4 Cnt.ContextFlags:=CONTEXT_CONTROL)
     
  13. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Хорошо, давайте дальше. Что делает поток ?

    Если он как вы говорите пол часа работает, то в контексте его может быть что угодно. Вы получаете текущий Eip(тогда понятно про KiFastSystemCallRet()). Что вам есчо нужно ?
    Мне какое то внутреннее чувство говорит что вы хотите получить стартап адрес виньапишный..
     
  14. Deader

    Deader New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    96
    не, стартап я знаю. а нужно мне знать - в какой странице образа ехе-шника находится код, который поток выполняет в данный момент. другое дело, что почти всегда поток выполняет что-то из ntdll но это мне сильно на фиг нужно. получается, что getthreadcontext вроде как и работает, но с другой стороны, почти всегда пихает в eip бесполезное значение.
     
  15. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    CONTEXT.Eip & NOT(X86_PAGE_SIZE - 1)

    Но это не обязательно екзе. Поток большую часть времени проводит в ядре. Если вам нужно знать откуда был вызов, то следует получить колстек, выполнив бектрейс.

    зы: корректная формулировка задачи в данном случае содержит сама в себе решение. Действительно - SFC содержит ссылки на адреса возврата.
     
  16. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    действительно, сделайте стек трэйс (StackWalk64)
     
  17. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    sergegers
    Сей апи нет на x86. Есть RtlCaptureStackBackTrace, RtlCaptureStackContext и RtlWalkFrameChain(). Но я к примеру ниразу их не юзал в своих кодесах, мне больше нравится вручную. Они проверяют вхождение ссылок в диапазон модулей, что обычно не годно. Кстати в ядре есть годный функционал, см. ProcessHandleTracing и SystemStackTraceInformation.
     
  18. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    я её не юзал, но хотел заюзать. она в DbgHelp.dll , а эти функции есть на x86 и x64 платформах. скорее всего её использует WinDbg
     
  19. int2eh

    int2eh Alexander Leevy

    Публикаций:
    0
    Регистрация:
    19 авг 2007
    Сообщения:
    106
    Адрес:
    Москва
    Код (Text):
    1.     call label_eip
    2. label_eip:
    3.     pop eax
     
  20. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.449
    Адрес:
    Россия
    А ты как замораживаешь? Останавливаешь?