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

 eXeL@B —› Программирование —› Вопрос по Debug API
Посл.ответ Сообщение


Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 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





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 16 марта 2011 14:35
· Личное сообщение · #2

CREATE_PROCESS_DEBUG_EVENT : ;
EXCEPTION_DEBUG_EVENT : ;
EXIT_PROCESS_DEBUG_EVENT : ;

-----
От многой мудрости много скорби, и умножающий знание умножает печаль





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 16 марта 2011 14:40
· Личное сообщение · #3

ajax что то я не понял, что это значит. Если по твоему объяснять, то вот лог:

Code:
  1. Process created [ImageBase: 0x00400000]
  2. Load dll [ImageBase: 0x7C900000]
  3. Load dll [ImageBase: 0x7C800000]
  4. Load dll [ImageBase: 0x77110000]
  5. Load dll [ImageBase: 0x77DC0000]
  6. Load dll [ImageBase: 0x77E70000]
  7. Load dll [ImageBase: 0x77FE0000]
  8. Load dll [ImageBase: 0x77F10000]
  9. Load dll [ImageBase: 0x7E360000]
  10. Load dll [ImageBase: 0x77C00000]
  11. Load dll [ImageBase: 0x774D0000]
  12. Load dll [ImageBase: 0x76350000]
  13. Load dll [ImageBase: 0x77BF0000]
  14. Load dll [ImageBase: 0x773C0000]
  15. Load dll [ImageBase: 0x77F60000]
  16. DebugBreak occured [Address: 0x7C90120E] <- Нужно обработать
  17. Load dll [ImageBase: 0x6D590000]
  18. Thread created [StartAddress: 0x7C8106E9]
  19. Load dll [ImageBase: 0x6D020000]
  20. Thread created [StartAddress: 0x7C8106E9]
  21. Load dll [ImageBase: 0x76360000]
  22. Load dll [ImageBase: 0x746E0000]
  23. Load dll [ImageBase: 0x5B260000]
  24. Thread terminated [ExitCode: 0x00000000]
  25. Thread terminated [ExitCode: 0x00000000]
  26. Process terminated [ExitCode: 0x00000000]


Если лог изменится так:
Code:
  1. Process created [ImageBase: 0x00400000]
  2. Load dll [ImageBase: 0x7C900000]
  3. Load dll [ImageBase: 0x7C800000]
  4. Load dll [ImageBase: 0x77110000]
  5. Load dll [ImageBase: 0x77DC0000]
  6. DebugBreak occured [Address: 0x7C90120E] <- нужно пропустить
  7. Load dll [ImageBase: 0x77E70000]
  8. Load dll [ImageBase: 0x77FE0000]
  9. Load dll [ImageBase: 0x77F10000]
  10. Load dll [ImageBase: 0x7E360000]
  11. Load dll [ImageBase: 0x77C00000]
  12. DebugBreak occured [Address: 0x7C90120E] <- нужно пропустить
  13. Load dll [ImageBase: 0x774D0000]
  14. Load dll [ImageBase: 0x76350000]
  15. Load dll [ImageBase: 0x77BF0000]
  16. Load dll [ImageBase: 0x773C0000]
  17. Load dll [ImageBase: 0x77F60000]
  18. DebugBreak occured [Address: 0x7C90120E] <- нужно обработать
  19. Load dll [ImageBase: 0x6D590000]
  20. Thread created [StartAddress: 0x7C8106E9]
  21. Load dll [ImageBase: 0x6D020000]
  22. Thread created [StartAddress: 0x7C8106E9]
  23. Load dll [ImageBase: 0x76360000]
  24. Load dll [ImageBase: 0x746E0000]
  25. Load dll [ImageBase: 0x5B260000]
  26. Thread terminated [ExitCode: 0x00000000]
  27. Thread terminated [ExitCode: 0x00000000]
  28. Process terminated [ExitCode: 0x00000000]


Как мне узнать, что первые 2 исключения нужно пропустить?

-----
Yann Tiersen best and do not fuck




Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 16 марта 2011 14:49
· Личное сообщение · #4

if(de.dwDebugEventCode == EXCEPTION_DEBUG_EVENT && de.u.Exception.ExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT)
ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
else
ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_EXCEPTION_NOT_HANDLED);




Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 16 марта 2011 15:34
· Личное сообщение · #5

> система дергает DebugBreak апи
На первый раз ставишь свои бряки. На следующих вызовах (переменную глобальную введи) проверяешь EIP уже через getthreadcontext(), свое или не свое. Очень давно с этим занимался, деталей могу не помнить. И если понял вопрос правильно

-----
От многой мудрости много скорби, и умножающий знание умножает печаль





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 16 марта 2011 17:32
· Личное сообщение · #6

Блин как реализовывать я знаю, у меня полноценное ядро написано, с int 3 бряками, Hardware бряками, memory бряками, трассировкой с условиями и без... Мне чисто теория была интересна.

В общем разобрался. Оказывается винда сама всё делает за кодера. Если грузится DLL и на DLLMain вызывается DebugBreak, то винда преждевременно вызывает свой DebugBreak и только потом DebugBreak из DLL, ну а дальше продолжает грузить остальные библиотеки и больше DebugBreak не вызывает. Не ожидал если честно такой умной реакции от MS.

-----
Yann Tiersen best and do not fuck





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 16 марта 2011 17:42
· Личное сообщение · #7

Такой еще вопрос, перемещается ли база системных библиотек kernel32.dll и ntdll.dll на win7 с включеной рандомизацией адресов?

-----
Yann Tiersen best and do not fuck




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

Создано: 16 марта 2011 17:46
· Личное сообщение · #8

PE_Kill пишет:
Такой еще вопрос, перемещается ли база системных библиотек kernel32.dll и ntdll.dll на win7 с включеной рандомизацией адресов?


Только в пределах одной сессии, тоесть после ребута будет другая база.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 16 марта 2011 18:17
· Личное сообщение · #9

Ну т.е. и ntdll.dll тоже перемещается?

-----
Yann Tiersen best and do not fuck





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

Создано: 16 марта 2011 18:48
· Личное сообщение · #10

После ребута нтдлл тоже сползёт, как и все либы. Но у разных процессов одной сессии база нтдлл одна. Не совсем представляю, как отладчику может помешать смена базы при ребуте. Разве что если базу совсем железно захардкодить, но это непохек.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 16 марта 2011 20:21
· Личное сообщение · #11

А понял, т.е. если в моем процессе база ntdll: 7C0000 то и во всех других процессах в системе база ntdll:7C0000? Ну а после перезагрузки она другая, но для всех процессов одинаковая, так?

-----
Yann Tiersen best and do not fuck





Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 16 марта 2011 20:53
· Личное сообщение · #12

Так. Недавно кто-то писал что в ntdll есть адреса колбеков из ядра, поэтому она не перемещается в пределах сессии.




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

Создано: 16 марта 2011 21:20
· Личное сообщение · #13

Я писал, так и есть, типа KiUserExceptionDispatcher, ...ApcDispatcher и тд, туда управление из ядра приходит при разных событиях. Поэтому база одинакова для всех процессов. Возможно, в 7 они такую явную костыльность чуть облегчили, я хз, явно исследовал на это только хр. Но в пределах сессии во всех НТ база нтдлл для всех процессов одна, да.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 16 марта 2011 21:37
· Личное сообщение · #14

Добил я проблему, которую описывал в первом посте. Всё оказалось еще проще. Винда сначала грузит процесс и создает тред, потом грузит все необходимые DLL, потом дергает DebugBreak и ТОЛЬКО ПОТОМ обрабатывает DLLMain загруженных DLL, ну и идет на EP процесса. Отсюда следует что проблемы то и нет.

-----
Yann Tiersen best and do not fuck




Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 22 апреля 2011 17:46
· Личное сообщение · #15

Как понимать в описаниях параметров API [in], [out]




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

Создано: 22 апреля 2011 18:26 · Поправил: DenCoder
· Личное сообщение · #16

nikolay1940trof, ну настолько не знать основ и даже английского. Ох...

--> in <--

--> out <--

_____________
Вообще, вопросы для новичков для этого есть. А такой вопрос предполагает гораздо больше. Считай с нуля все придется объяснять. Кто хочет, берите шефство. ТС тему не закрыл - может ему еще надо, но это не значит, что сюда можно писать, увидев знакомое слово!

-----
IZ.RU




Ранг: 196.0 (ветеран), 72thx
Активность: 0.140.02
Статус: Участник

Создано: 22 апреля 2011 18:28
· Личное сообщение · #17

nikolay1940trof пишет:
Как понимать в описаниях параметров API [in], [out]

in - входной параметр (например путь к файлу для чтения или записи)
out - выходной параметр (например в WriteFile- количество записанных байт)



Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 23 апреля 2011 01:42 · Поправил: Модератор
· Личное сообщение · #18

Спсибо понял

От модератора: для спасибо тут отдельная кнопка есть, пользуйся



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

Создано: 14 сентября 2012 11:07 · Поправил: Veliant
· Личное сообщение · #19

Не хочу создавать новую тему, поэтому задам вопрос тут.

Пишу трейсер на Debug api, процесс создаю только с параметром DEBUG_PROCESS, т.е. хочу получать события и от дочерних процессов.
Имею следующую проблему - если главный отлаживаемый процесс создает дочерний замороженный процесс, инжектит в него и отпускает дальше, а сам закрывается то получаю картину вроде такой:
Code:
  1.  [pid:00000424]: Create process
  2.  [pid:00000424]: Exception code:80000003 on addr:77f767cd
  3.  [pid:00000394]: Create thread tid:00000444
  4.  [pid:00000394]: Exception code:80000003 on addr:77f767cd
  5.  [pid:00000424]: Exit process
  6.  [pid:00000440]: Create process
  7.  [pid:00000440]: Exception code:80000003 on addr:77f767cd

как видно евента о создании процесса с pid 394 не приходит, да и вообще каких либо евентов от 394 больше не получаю. В чем прикол?

Ставлю TF в этом потоке - приходит single_step, и с какими бы правами ни открывал поток - dr регистры не читает. CONTEXT_DEBUG_REGISTERS прописан



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 14 сентября 2012 18:37
· Личное сообщение · #20

PeKill пишет:
ТОЛЬКО ПОТОМ обрабатывает DLLMain загруженных DLL
Исключение:kernel32. Отрабатывает после ntdll и перед DbgBreak. У мну так.
Veliant
PID 440 олькой(обычным дбг) открывается?



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

Создано: 14 сентября 2012 20:18
· Личное сообщение · #21

Откуда взялся поток выяснил, почему он с отдельным pid пока не смотрел. Осталось бы решить почему на single_step нельзя прочесть dr регистры, независимо от того с какими параметрами открыт поток, и флаги структуры


 eXeL@B —› Программирование —› Вопрос по Debug API
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати