Сейчас на форуме: tyns777, zds, JustLife (+4 невидимых)

 eXeL@B —› Программирование —› Отладочный цикл и Single Step.
Посл.ответ Сообщение

Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 24 февраля 2010 01:00
· Личное сообщение · #1

Есть мой трейсер, который пошагово выполняет поток другого процесса. Поток выполняется до конца а потом уходит вглубь винды на удаление собственно самого потока. Так вот я продолжаю делать single step в надежде что придет таки EXIT_THREAD_DEBUG_EVENT, а он не приходит и отладочный цикл повисает после очередного ContinueDebugEvent в недрах ntdll. Почему не приходит EXIT_THREAD_DEBUG_EVENT?
Как вообще следует определять конец функции потока? Брейкпоинт ставить в BaseThreadInitThunk чтобы ловить когда выйдет из функции потока?

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 24 февраля 2010 01:32
· Личное сообщение · #2

Сообщение должно доставляться, наверно в коде ошибки.



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 27 февраля 2010 08:46
· Личное сообщение · #3

ответ на вопрос "как правильно" так и не получил. Выкрутился тем что поставил брейкпоинт на RtlExitUserThread()

-----
Реверсивная инженерия - написание кода идентичного натуральному





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 28 февраля 2010 03:16
· Личное сообщение · #4

Hexxx пишет:
отладочный цикл повисает после очередного ContinueDebugEvent в недрах ntdll

А какой DEBUG EVENT приходит последним? Ну, перед зависанием?

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 28 февраля 2010 12:42 · Поправил: Clerk
· Личное сообщение · #5

Hexxx
Может у вас поток один ?
Code:
  1.             if (LastThread) {
  2.                 DbgkExitProcess (Process->ExitStatus);
  3.             } else {
  4.                 DbgkExitThread (ExitStatus);
  5.             }





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 28 февраля 2010 18:54
· Личное сообщение · #6

Hexxx пишет:
Есть мой трейсер
А этот трейсер приоритет своего процесса, случайно, не поднимал?

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 01 марта 2010 10:11
· Личное сообщение · #7

Clerk пишет:
Может у вас поток один ?

не, как минимум три.

ARCHANGEL пишет:
А этот трейсер приоритет своего процесса, случайно, не поднимал?

приоритет не трогал.

ARCHANGEL пишет:
А какой DEBUG EVENT приходит последним? Ну, перед зависанием?

щас посмотрю...

-----
Реверсивная инженерия - написание кода идентичного натуральному




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

Создано: 01 марта 2010 10:41
· Личное сообщение · #8

Ты просто уходишь в глубь ntdll, вот и нету сообщения,
тебе надо поставить "особый" бряк на выход из функции потока.

При создании нового потока в отлачик передано будет сообщение, затем ты выставишь бряк на первую инструкцию поточной функции, а по срабатыванию прерывания из стека извлечешь адрес возрата из функции из потока (где необходимо закончить выставления инт3 или тф флага), ЗАДАЧА РЕШЕНА,

Второй случай когда поток, уже работает, тут немного сложнее, ни когда не задучывался как реализовать останов отладчика, но можно сделать так: по-любому для конкретной версии операционной системы адрес вызова поточной функции один и тот же, можешь посмотреть и статически забить себе для разных версий ОС. Но это не красивый способ, нужно подумать как можно реализовать "красиво" эту задачу.

По - любому после этого придет сообщение отладчику об завершении потока.



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 01 марта 2010 10:55
· Личное сообщение · #9

Hexxx
> не, как минимум три.
Если поток последний, то при завершении его сообщение не доставляется. Если не последний, то ядро должно доставлять сообщения о завершении потока. Лог снимите с сообщений.



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

Создано: 01 марта 2010 11:19
· Личное сообщение · #10

С Clerk-ом согласен последний поток не выдает сообщения об окончании потока, а сразу выдает сообщение о завершении процесса.



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 01 марта 2010 15:44 · Поправил: Clerk
· Личное сообщение · #11

Mag_3d
Ну сурцы ведь есть
В таком случае достаточно для решения этой проблемы ждать на описателе обьекта(NtWaitForMultipleObjects etc.).



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 02 марта 2010 16:52
· Личное сообщение · #12

Mag_3d пишет:
Ты просто уходишь в глубь ntdll, вот и нету сообщения,тебе надо поставить "особый" бряк на выход из функции потока.

Уходит естественно, но я думал что должно же все равно событие прийти. Но подозреваю что именно из-за трейс флага оно и не может прийти.

Выкрутился тем самым "особым" бряком.

-----
Реверсивная инженерия - написание кода идентичного натуральному



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