Сейчас на форуме: zds (+6 невидимых) |
![]() |
eXeL@B —› Программирование —› Вопрос по Debug API |
Посл.ответ | Сообщение |
|
Создано: 16 марта 2011 14:28 · Личное сообщение · #1 Переписываю сейчас свое отладочное ядро, решил сделать всё по уму, как MSDN рекомендует и т.д. Так вот собственно появилась проблема. После полной загрузки образа и настройки его импорта, система дергает DebugBreak апи, что является банальным int 3. При этом отладчик должен отчитаться системе, что это исключение он обработал, иначе ExitProcess(0x80000003). Теперь вопрос: Как определить, что DebugBreak вызывала именно система? Ведь до DebugBreak загружаются все библиотеки из импорта, и в одной из них на DLLMain может быть вызов: try DebugBreak; debugger_detected := True; except debugger_detected := False; end; Адрес исключения будет системный, по каким то признакам не поймешь система это вызвала или библиотека. Что скажите? ----- Yann Tiersen best and do not fuck ![]() |
|
Создано: 16 марта 2011 14:35 · Личное сообщение · #2 |
|
Создано: 16 марта 2011 14:40 · Личное сообщение · #3 ajax что то я не понял, что это значит. Если по твоему объяснять, то вот лог: Code:
Если лог изменится так: Code:
Как мне узнать, что первые 2 исключения нужно пропустить? ----- Yann Tiersen best and do not fuck ![]() |
|
Создано: 16 марта 2011 14:49 · Личное сообщение · #4 |
|
Создано: 16 марта 2011 15:34 · Личное сообщение · #5 > система дергает DebugBreak апи На первый раз ставишь свои бряки. На следующих вызовах (переменную глобальную введи) проверяешь EIP уже через getthreadcontext(), свое или не свое. Очень давно с этим занимался, деталей могу не помнить. И если понял вопрос правильно ![]() ----- От многой мудрости много скорби, и умножающий знание умножает печаль ![]() |
|
Создано: 16 марта 2011 17:32 · Личное сообщение · #6 Блин как реализовывать я знаю, у меня полноценное ядро написано, с int 3 бряками, Hardware бряками, memory бряками, трассировкой с условиями и без... Мне чисто теория была интересна. В общем разобрался. Оказывается винда сама всё делает за кодера. Если грузится DLL и на DLLMain вызывается DebugBreak, то винда преждевременно вызывает свой DebugBreak и только потом DebugBreak из DLL, ну а дальше продолжает грузить остальные библиотеки и больше DebugBreak не вызывает. Не ожидал если честно такой умной реакции от MS. ----- Yann Tiersen best and do not fuck ![]() |
|
Создано: 16 марта 2011 17:42 · Личное сообщение · #7 |
|
Создано: 16 марта 2011 17:46 · Личное сообщение · #8 |
|
Создано: 16 марта 2011 18:17 · Личное сообщение · #9 |
|
Создано: 16 марта 2011 18:48 · Личное сообщение · #10 |
|
Создано: 16 марта 2011 20:21 · Личное сообщение · #11 |
|
Создано: 16 марта 2011 20:53 · Личное сообщение · #12 |
|
Создано: 16 марта 2011 21:20 · Личное сообщение · #13 Я писал, так и есть, типа KiUserExceptionDispatcher, ...ApcDispatcher и тд, туда управление из ядра приходит при разных событиях. Поэтому база одинакова для всех процессов. Возможно, в 7 они такую явную костыльность чуть облегчили, я хз, явно исследовал на это только хр. Но в пределах сессии во всех НТ база нтдлл для всех процессов одна, да. ![]() |
|
Создано: 16 марта 2011 21:37 · Личное сообщение · #14 Добил я проблему, которую описывал в первом посте. Всё оказалось еще проще. Винда сначала грузит процесс и создает тред, потом грузит все необходимые DLL, потом дергает DebugBreak и ТОЛЬКО ПОТОМ обрабатывает DLLMain загруженных DLL, ну и идет на EP процесса. Отсюда следует что проблемы то и нет. ----- Yann Tiersen best and do not fuck ![]() |
|
Создано: 22 апреля 2011 17:46 · Личное сообщение · #15 |
|
Создано: 22 апреля 2011 18:26 · Поправил: DenCoder · Личное сообщение · #16 nikolay1940trof, ну настолько не знать основ и даже английского. Ох... ![]() _____________ Вообще, вопросы для новичков для этого есть. А такой вопрос предполагает гораздо больше. Считай с нуля все придется объяснять. Кто хочет, берите шефство. ТС тему не закрыл - может ему еще надо, но это не значит, что сюда можно писать, увидев знакомое слово! ----- IZ.RU ![]() |
|
Создано: 22 апреля 2011 18:28 · Личное сообщение · #17 |
|
Создано: 23 апреля 2011 01:42 · Поправил: Модератор · Личное сообщение · #18 |
|
Создано: 14 сентября 2012 11:07 · Поправил: Veliant · Личное сообщение · #19 Не хочу создавать новую тему, поэтому задам вопрос тут. Пишу трейсер на Debug api, процесс создаю только с параметром DEBUG_PROCESS, т.е. хочу получать события и от дочерних процессов. Имею следующую проблему - если главный отлаживаемый процесс создает дочерний замороженный процесс, инжектит в него и отпускает дальше, а сам закрывается то получаю картину вроде такой: Code:
как видно евента о создании процесса с pid 394 не приходит, да и вообще каких либо евентов от 394 больше не получаю. В чем прикол? Ставлю TF в этом потоке - приходит single_step, и с какими бы правами ни открывал поток - dr регистры не читает. CONTEXT_DEBUG_REGISTERS прописан ![]() |
![]() Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 14 сентября 2012 18:37 · Личное сообщение · #20 |
|
Создано: 14 сентября 2012 20:18 · Личное сообщение · #21 |
![]() |
eXeL@B —› Программирование —› Вопрос по Debug API |