Как узнать EIP?

Discussion in 'WASM.WIN32' started by Deader, Jul 31, 2011.

  1. Deader

    Deader New Member

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

    x64 New Member

    Blog Posts:
    0
    Это как это?
    Уверен, что правильно вызываешь?
     
  3. ant_man

    ant_man New Member

    Blog Posts:
    0
    наверняка структуру не проинициализировал :)

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

    Deader New Member

    Blog Posts:
    0
    так и есть, не сделал Cnt.ContextFlags:=CONTEXT_CONTROL;
    ant_man, tnx
    на худой конец сделаю через Int 2E
     
  5. Deader

    Deader New Member

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

    Mika0x65 New Member

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

    Malfoy New Member

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

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

    Deader New Member

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

    Malfoy New Member

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

    Deader New Member

    Blog Posts:
    0
    тс видит, что после Int2Е в eax возвращается ноль, что означает status_success
     
  11. Malfoy

    Malfoy New Member

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

    Deader New Member

    Blog Posts:
    0
    я пытаюсь получить контекст потока, который работает уже пол часа и за это время в нем наверняка успела выполниться вся инициализация)

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

    Malfoy New Member

    Blog Posts:
    0
    Хорошо, давайте дальше. Что делает поток ?

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

    Deader New Member

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

    Malfoy New Member

    Blog Posts:
    0
    CONTEXT.Eip & NOT(X86_PAGE_SIZE - 1)

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

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

    sergegers New Member

    Blog Posts:
    0
    действительно, сделайте стек трэйс (StackWalk64)
     
  17. Malfoy

    Malfoy New Member

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

    sergegers New Member

    Blog Posts:
    0
    я её не юзал, но хотел заюзать. она в DbgHelp.dll , а эти функции есть на x86 и x64 платформах. скорее всего её использует WinDbg
     
  19. int2eh

    int2eh Alexander Leevy

    Blog Posts:
    0
    Code (Text):
    1.     call label_eip
    2. label_eip:
    3.     pop eax
     
  20. yashechka

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

    Blog Posts:
    90
    А ты как замораживаешь? Останавливаешь?