Как узнать EIP потоков процесса? GetThreadContext не работает, несмотря на то, что замораживаю поток перед тем, как делаю GetThreadContext. В teb потока я тоже не нашел eip... Вообщем, "хелп ми", кто может.
так и есть, не сделал Cnt.ContextFlags:=CONTEXT_CONTROL; ant_man, tnx на худой конец сделаю через Int 2E
все равно не работает - всегда для любых потоков возвращает константу 7C90E514 на WinXP 32bit. Так как же узнать EIP из юзермода??? Или это невозможно? зы по адресу 7C90E514 находится KiFastSystemCallRet, т.е. команда ret что, если прочитать в стеке адрес возврата по ret и получить нормальный контекст?
Deader Есть у меня подозрение, что потоки просто спят на WaitFor{Single|Multiple}Object. Большую часть времени потоки бездельничают, ожидая событий ввода/вывода. Чтобы быть уверенным, что GetThreadContext работает, можно написать маленькую программу, крутящую бесконечный цикл, а потом взызвать GetThreadContext для ее потока, в котором крутится цикл. Тогда станет понятно.
Замораживать не обязательно. Не существует потока, запрашивающего контекст, вне т-фрейма. Mika0x65 Перед тем как заснуть они меняют кпл на нулевой, при этом сохраняется т-фрейм. Далее он доступен. Не возможно чтобы при корректных аргументах запрос контекста завершился не удачно(разумеется если прав хватает). ТС не понимает что есть нтстатус.
Написал программу, проверил. В 99% случаев GetThreadContext возвращает на фиг нужное значение из ntdll и очень редко - нормальный контекст. Получается, чтобы получить нормальный контекст, нужно в цикле делать GetThreadContext пока не прийдет значение из страничного образа ехе-шника, или сделать образ PAGE_GUARD и ловить исключения... только как-то эти способы, мягко выражаясь, некрасиво выглядят....
Сделайте в цикле проверку регистра Eax на ноль(для NtGetContextThread разумеется, извините но я забыл что можно виньапи юзать). В случае не нуля отрубите себе руки.
Значит вам нужно досконально изучить сей материал: http://www.wasm.ru/forum/viewtopic.php?pid=284176#p284176 А есчо корректно заполнить флаги для запроса контекста следует.
я пытаюсь получить контекст потока, который работает уже пол часа и за это время в нем наверняка успела выполниться вся инициализация) это уже давно проехали(см. в #4 Cnt.ContextFlags:=CONTEXT_CONTROL)
Хорошо, давайте дальше. Что делает поток ? Если он как вы говорите пол часа работает, то в контексте его может быть что угодно. Вы получаете текущий Eip(тогда понятно про KiFastSystemCallRet()). Что вам есчо нужно ? Мне какое то внутреннее чувство говорит что вы хотите получить стартап адрес виньапишный..
не, стартап я знаю. а нужно мне знать - в какой странице образа ехе-шника находится код, который поток выполняет в данный момент. другое дело, что почти всегда поток выполняет что-то из ntdll но это мне сильно на фиг нужно. получается, что getthreadcontext вроде как и работает, но с другой стороны, почти всегда пихает в eip бесполезное значение.
CONTEXT.Eip & NOT(X86_PAGE_SIZE - 1) Но это не обязательно екзе. Поток большую часть времени проводит в ядре. Если вам нужно знать откуда был вызов, то следует получить колстек, выполнив бектрейс. зы: корректная формулировка задачи в данном случае содержит сама в себе решение. Действительно - SFC содержит ссылки на адреса возврата.
sergegers Сей апи нет на x86. Есть RtlCaptureStackBackTrace, RtlCaptureStackContext и RtlWalkFrameChain(). Но я к примеру ниразу их не юзал в своих кодесах, мне больше нравится вручную. Они проверяют вхождение ссылок в диапазон модулей, что обычно не годно. Кстати в ядре есть годный функционал, см. ProcessHandleTracing и SystemStackTraceInformation.
я её не юзал, но хотел заюзать. она в DbgHelp.dll , а эти функции есть на x86 и x64 платформах. скорее всего её использует WinDbg