eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС
выпущен 4 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: lordbeast (+4 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Вопросы новичков —› Определить функцию потока
Посл.ответ Сообщение

Ранг: 99.6 (постоянный)
Статус: Участник

Создано: 19 мая 2014 20:56 New!
Цитата · Личное сообщение · #1

При старте до выхода на ОЕР в программе кроме основного запускаются и
другие потоки. Те, которые запускаются через CreateThread, я благополучно
нейтрализую. Но есть поток, обозначенный в окне "Т" OllyDbg как 7С810856,
который не выдаёт о себе информацию. Точка 7С810856 находится не далеко
от 7С81082F - начала CreateThread. На 7С810856 панель стека и окно "К"
приходят чистыми.
Может кто подскажет как найти функцию ThreadFunction для такого потока.
Заранее спасибо!


Ранг: 72.3 (постоянный)
Статус: Участник

Создано: 19 мая 2014 21:03 New!
Цитата · Личное сообщение · #2

ksol

KiUserApcDispatcher.


Ранг: 311.4 (мудрец)
Статус: Участник

Создано: 20 мая 2014 01:04 · Поправил: DenCoder New!
Цитата · Личное сообщение · #3

Другими словами - поставьте галочку в олли options-> Debugging -> Start -> TLS Callback

Тот способ, что предлагает Инде - выводит в самом первом случае только на процедуру инициализации, от начала которой долго трейсить


Ранг: 72.3 (постоянный)
Статус: Участник

Создано: 20 мая 2014 02:49 · Поправил: Dr0p New!
Цитата · Личное сообщение · #4

DenCoder

Что там трейсить.. ладно если не stdcall. А на x86 есть цепочка SFC. Тупо ентер жмём на стек в олли и все дела. Непосредственно загрузка юзер контекста происходит в NtContinue. Можно на этом остановиться и посмореть контекст. А гнилые методы, типо всяких нотифи - обычно бесполезно и я это даже никогда не рассматриваю и не юзаю.

Ранг: 99.6 (постоянный)
Статус: Участник

Создано: 20 мая 2014 17:10 New!
Цитата · Личное сообщение · #5

Dr0p, DenCoder
Спасибо за оперативный ответ!
Я посмотрел что вы сказали. TLS callback программа, вроде, не использует.
Установил ВР на этот АРС - диспетчер, зашёл в NtContinue(который у меня ZwContinue)
и встал совсем, т.к. не знаю, где взять адрес структуры CONTEXT. А дальше, и как из неё
выудить значение стека в момент запуска потока.


Ранг: 72.3 (постоянный)
Статус: Участник

Создано: 20 мая 2014 18:23 New!
Цитата · Личное сообщение · #6

ksol

На стеке:

Code:
  1. VOID
  2. KiUserApcDispatcher (
  3.     IN PVOID NormalContext,
  4.     IN PVOID SystemArgument1,
  5.     IN PVOID SystemArgument2,
  6.     IN PKNORMAL_ROUTINE NormalRoutine
  7.     );

Ранг: 99.6 (постоянный)
Статус: Участник

Создано: 21 мая 2014 17:50 New!
Цитата · Личное сообщение · #7

Теперь и до NtContinue не удаётся дойти:
Загружаю программу, ост. на System BP, устанавливаю BP KiUserApcDispatcher,
жму F9, встаёт на начало этого диспетчера. В панели кода теперь указан хэндл потока "7С810856"
и в окне "Т" добавился этот поток. Стек чистый, кроме одной строчки. На вершине стоит
ntdll.LdrInitializeThunk. А первые две инструкции от начала диспетчера загружают этот
инициализатор и программа виснет!


Ранг: 72.3 (постоянный)
Статус: Участник

Создано: 21 мая 2014 23:09 New!
Цитата · Личное сообщение · #8

ksol

> Теперь и до NtContinue не удаётся дойти

Ну есно, вам дали исходную точку для отладки.

> В панели кода теперь указан хэндл потока "7С810856"

Это глюки.

> LdrInitializeThunk

Это и есть стартап APC. Далее поток вызывает лодер, затем восстанавливает контекст в NtContinue.

Ранг: 99.6 (постоянный)
Статус: Участник

Создано: 22 мая 2014 12:52 New!
Цитата · Личное сообщение · #9

Dr0p
А сейчас доходит до NtContinue - через несколько запусков программа что-то меняет,
а потом возвращается к прежнему.
> В панели кода теперь указан хэндл потока "7С810856"

Это глюки.

Хэндл, конечно, другой - это я идентифицирую поток по адресу запускающей его
функции.
Dr0p , а вы не сможете сказать как найти адрес CONTEXT ,когда программа
стоит на breakpoint'e на KiUserApcDispatcher?


Ранг: 72.3 (постоянный)
Статус: Участник

Создано: 22 мая 2014 18:45 New!
Цитата · Личное сообщение · #10

ksol

Я же дал прото, первый аргумент. На стеке внизу находится. Сразу ставьте символы для нэйтива, это если надо глубоко в нотифи лазить. Если просто отследить тред - то достаточно NtContinue, там в регистрах стартап адрес. Если отладчик лагает с каким то тредом, то возмоно он скрыт от отладчика, либо в жтом треде по како то причине не произошёл останов. Механизмы отладки в олли весьма примитивны.

Ранг: 99.6 (постоянный)
Статус: Участник

Создано: 23 мая 2014 12:02 New!
Цитата · Личное сообщение · #11

Я же дал прото, первый аргумент. На стеке внизу находится.
стек вершина: LdrInitializeThunk
00000000
7C900000
00000000
00010017
дальше нули
Сразу ставьте символы для нэйтива
А это, как?
Механизмы отладки в олли весьма примитивны.
Иду надо?


Ранг: 72.3 (постоянный)
Статус: Участник

Создано: 23 мая 2014 13:27 New!
Цитата · Личное сообщение · #12

ksol

00010017 - это первое поле контекста.

Ранг: 99.6 (постоянный)
Статус: Участник

Создано: 23 мая 2014 18:28 New!
Цитата · Личное сообщение · #13

Dr0p
Спасибо!
Я запустил в OllyDbg свою программу, она тоже с несколькими потоками.
Задал тоже BP KiUserApcDispatcher. Получил тот же результат - такой же стек.
В дампе смотрел начиная от 10017, не нашел ничего похожего на подходящие
адреса, которые для своей программы мне известны. С этой структурой я столкнулся
впервые, и скорее всего, я не так её смотрю.
Поэтому вопросы по ней: расположение полей относительно её начала постоянно?,
поле FloatSave какое имеет размер?, адрес возврата EIP=10017+B8?
Зато в регистре EAX я вижу адрес ThreadFunction.

Ранг: 4.0 (гость)
Статус: Участник

Создано: 23 мая 2014 18:50 New!
Цитата · Личное сообщение · #14

ksol
в олли2 правой мышой - decode as structure - CONTEXT


Ранг: 1993.2 (!!!!)
Статус: Модератор
retired

Создано: 23 мая 2014 18:51 New!
Цитата · Личное сообщение · #15

Открой стандартные хедеры из сдк и изучи документированную структуру.
EIP по смещению 0xB8.

Ранг: 99.6 (постоянный)
Статус: Участник

Создано: 24 мая 2014 13:37 New!
Цитата · Личное сообщение · #16

Да с полями структуры я разобрался. Взял в VS C++ адрес от полей типа context.Eip и
нашел это смещение В8.
Не могу найти её начало! Значение 10017 вряд ли подходит на эту роль: расположено оно на
5-й строчке, а в определении функции контекст идёт 1-м параметром.
Собственно, на заголовок темы ответ уже найден - это регистр EAX.
Может быть как-то удастся ещё узнать и место запуска потока!?
 eXeL@B —› Вопросы новичков —› Определить функцию потока
Эта тема закрыта. Ответы больше не принимаются.

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS