Сейчас на форуме: (+7 невидимых)

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

Ранг: 102.0 (ветеран), 18thx
Активность: 0.070.02
Статус: Участник

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

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




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

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

ksol

KiUserApcDispatcher.




Ранг: 324.3 (мудрец), 221thx
Активность: 0.480.37
Статус: Участник

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

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

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

-----
IZ.RU





Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

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

DenCoder

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



Ранг: 102.0 (ветеран), 18thx
Активность: 0.070.02
Статус: Участник

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

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




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 20 мая 2014 18:23
· Личное сообщение · #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.     );




Ранг: 102.0 (ветеран), 18thx
Активность: 0.070.02
Статус: Участник

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

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




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

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

ksol

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

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

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

Это глюки.

> LdrInitializeThunk

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



Ранг: 102.0 (ветеран), 18thx
Активность: 0.070.02
Статус: Участник

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

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

Это глюки.

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




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

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

ksol

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



Ранг: 102.0 (ветеран), 18thx
Активность: 0.070.02
Статус: Участник

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

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




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

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

ksol

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



Ранг: 102.0 (ветеран), 18thx
Активность: 0.070.02
Статус: Участник

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

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



Ранг: 4.0 (гость), 2thx
Активность: 0.010
Статус: Участник

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

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




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

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

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



Ранг: 102.0 (ветеран), 18thx
Активность: 0.070.02
Статус: Участник

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

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


 eXeL@B —› Вопросы новичков —› Определить функцию потока
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати