![]() |
eXeL@B —› Программирование —› Hardware breakpoints |
Посл.ответ | Сообщение |
|
Создано: 07 июня 2009 19:15 · Поправил: SVIN95 · Личное сообщение · #1 Пишу отладчик, использующий Debug API. Сейчас прикручиваю HW BP. Проверяю работу дебаггера на PETools.exe. Тут проблема возникла. Ставлю HW бряк на 0x00424667, запускаю отлаживаемую прогу. Ее выполнение прервалось по адресу 0x00424667, на который я ставил железный бряк. Все правильно. Теперь удаляю эту точку останова (обнуляю Dr0 и Dr7). Требуется продолжить выполнение программы. А вот не получается! Вечный EXCEPTION_SINGLE_STEP! т.е невозможно продолжить выполнение программы с адреса останова. Но я же обнулил Dr0 и Dr7... Почему бряк все еще действует? P.S. Вычитал на васме что разрешение на такое продолжение, без повторной генерации исключения, даёт флаг RF (бит 16) регистра EFLAGS Делаю так: Code:
Не помогает... Все-равно вечный EXCEPTION_SINGLE_STEP ![]() Может кто подскажет? ![]() |
|
Создано: 07 июня 2009 20:22 · Личное сообщение · #2 |
|
Создано: 07 июня 2009 21:25 · Поправил: SVIN95 · Личное сообщение · #3 Archer пишет: Код в студию, во-первых. Приведу отрывки. Установка бряка: Code:
Удаление бряка: Code:
[i]Archer пишет: Во-вторых, когда ставишь контекст с обнулёнными бряками, уверен, что флаг дебаг_регистров там стоит Code:
Archer пишет: Уверен, что ТФ не взведён? Трассировку пока не реализовывал, TF мне пока не нужен. ![]() |
|
Создано: 07 июня 2009 21:57 · Личное сообщение · #4 Да весь код смотреть надо, костылей много. GetThreadContext(ProcInfo.hThread, &Context); Context.ContextFlags = CONTEXT_DEBUG_REGISTERS; Накой так? Сначала флаг надо, потом читать. Почему EXCEPTION_NOT_HANDLED = TRUE; и вообще, что это такое? Context.Dr7 = 0; неправильно, ибо зануляешь все сразу. Ставить контекст у неспящего потока тоже зло, тут непонятно, как оно. Короче, взял бы погуглил. И не говори, что нет нигде такого кода. ![]() |
|
Создано: 07 июня 2009 22:11 · Личное сообщение · #5 приведу куски из своего старого проекта: Code:
----- [nice coder and reverser] ![]() |
|
Создано: 07 июня 2009 22:24 · Личное сообщение · #6 Archer пишет: GetThreadContext(ProcInfo.hThread, &Context);Context.ContextFlags = CONTEXT_DEBUG_REGISTERS;Накой так? Сначала флаг надо, потом читать. Накосячил, поправил. Archer пишет: Почему EXCEPTION_NOT_HANDLED = TRUE; и вообще, что это такое? Если TRUE, продолжение выполнения проги начнется с ContinueDebugEvent(ProcInfo.dwProcessId, ProcInfo.dwThreadId, DBG_EXCEPTION_NOT_HANDLED). Если после удаления железного бряка продолжить выполнение проги с WaitForDebugEvent, будет вечно висеть. Archer пишет: Context.Dr7 = 0; неправильно, ибо зануляешь все сразу. Поправлю. Archer пишет: Ставить контекст у неспящего потока тоже зло, тут непонятно, как оно. Зачем усыплять поток, если прога находится под отладкой? Или не важно? Archer пишет: Короче, взял бы погуглил Уже гуглил - только 2 статьи. Одна на хакере - только описание отладочных регистров. Другая на васме - EXCEPTION_SINGLE_STEP (#DB exception) обрабатывается с помощью VectoredExceptionHandler, а не с помощью отладчика. Кстати, железный бряк срабатывает норм. А вот продолжить выполнение проги после удаления т/о не получается. ![]() |
|
Создано: 07 июня 2009 23:07 · Личное сообщение · #7 |
|
Создано: 08 июня 2009 15:10 · Личное сообщение · #8 Да вон рядом тема есть - Anti-Anpackers tricks, там рассказывается, как использовать отладочные регистры, а более подробно, можно прочитать "Об упаковщиках в последний раз" - там описывается, как Telock использует отладочные регистры, чтоб выполнять самотрассировку. ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 08 июня 2009 15:48 · Поправил: SVIN95 · Личное сообщение · #9 |
|
Создано: 08 июня 2009 18:31 · Личное сообщение · #10 А выше ты читал? Уверен, что статус хандлед? Оказалось, что ни разу не так. Добавлю ещё, что не уверен, что RF флаг выставится правильно. Если почитать ман интела, скажем, он глаголит, что команда popfd этот флаг не ставит. Походу, только через iretd его можно выставить. Как его винда ставит-хз, поэтому может и не работать. Да и установка бряка косяк тоже, биты в ДР7 надо тыкать не всегда как 0х101, а соответственно номеру регистра и типу бряка. Читай ман интела, в общем. ![]() |
|
Создано: 09 июня 2009 00:27 · Личное сообщение · #11 |
|
Создано: 09 июня 2009 14:00 · Поправил: ARCHANGEL · Личное сообщение · #12 |
|
Создано: 09 июня 2009 14:59 · Личное сообщение · #13 |
![]() |
eXeL@B —› Программирование —› Hardware breakpoints |