Использую регистры Dr0..Dr7 в 64 разрядном режиме. Все работает, только при чтении CONTEXT Dr6 Всегда читается нулями?? EXCEPTION_SINGLE_STEP срабатывает нормально, но нет индикации B0..B3 в Dr6. Кто сталкивался??
Естественно, при остановленном потоке (привилегия отладки) вручную изменяются Dr7,Dr0..Dr3, поток продолжается, выполняется прерывание отладки.например EXCEPTION_SINGLE_STEP. в НУЖНОМ месте, а Dr6 = 0, Dr7 и Dr0..Dr3 содержат правильную информацию,как, и Rip В win32 все нормально.
vitokop, Почему ты сам сурки не хочешь посмотреть и нужно это делать за тебя ?? wrk-v1.2\base\ntos\ke\amd64\except.c KxContextToKframes() см далее всюду зануляется dr6. Код (Text): // Set debug register state if specified. // if ((ContextFlags & CONTEXT_DEBUG_REGISTERS) == CONTEXT_DEBUG_REGISTERS) { // // Set the debug registers DR0, DR1, DR2, DR3, DR6, and DR7. // TrapFrame->Dr0 = SANITIZE_DRADDR(ContextRecord->Dr0, PreviousMode); TrapFrame->Dr1 = SANITIZE_DRADDR(ContextRecord->Dr1, PreviousMode); TrapFrame->Dr2 = SANITIZE_DRADDR(ContextRecord->Dr2, PreviousMode); TrapFrame->Dr3 = SANITIZE_DRADDR(ContextRecord->Dr3, PreviousMode); TrapFrame->Dr6 = 0; TrapFrame->Dr7 = SANITIZE_DR7(ContextRecord->Dr7, PreviousMode); TrapFrame->LastBranchToRip = ContextRecord->LastBranchToRip; TrapFrame->LastBranchFromRip = ContextRecord->LastBranchFromRip; TrapFrame->LastExceptionToRip = ContextRecord->LastExceptionToRip; TrapFrame->LastExceptionFromRip = ContextRecord->LastExceptionFromRip; if (PreviousMode != KernelMode) { KeGetCurrentThread()->Header.DebugActive = (BOOLEAN)((TrapFrame->Dr7 & DR7_ACTIVE) != 0); } } return XmmSaveArea; } Смотри ссылки KeContextToKframes() на 64: Код (Text): ;++ ; ; VOID ; KeContextToKframes ( ; IN OUT PKTRAP_FRAME TrapFrame, ; IN OUT PKEXCEPTION_FRAME ExceptionFrame, ; IN PCONTEXT ContextRecord, ; IN ULONG ContextFlags, ; IN KPROCESSOR_MODE PreviousMode ; ) ; ; Routine Description: ; ; This function saves the current non-volatile XMM state, performs a ; context to kernel frames operation, then restores the non-volatile ; XMM state. ; ; Arguments: ; ; TrapFrame (rcx) - Supplies a pointer to a trap frame that receives the ; volatile context from the context record. ; ; ExceptionFrame (rdx) - Supplies a pointer to an exception frame that ; receives the nonvolatile context from the context record. ; ; ContextRecord (r8) - Supplies a pointer to a context frame that contains ; the context that is to be copied into the trap and exception frames. ; ; ContextFlags (r9) - Supplies the set of flags that specify which parts ; of the context frame are to be copied into the trap and exception ; frames. ; ; PreviousMode (32[rsp]) - Supplies the processor mode for which the ; exception and trap frames are being built. ; ; Return Value: ; ; None. ; ;-- KfFrame struct P1Home dq ? ; parameter home addresses P2Home dq ? ; P3Home dq ? ; P4Home dq ? ; P5Home dq ? ; OldIrql dd ? ; previous IRQL Fill1 dd ? ; fill SavedXmm6 db 16 dup (?) ; saved nonvolatile floating registers SavedXmm7 db 16 dup (?) ; SavedXmm8 db 16 dup (?) ; SavedXmm9 db 16 dup (?) ; SavedXmm10 db 16 dup (?) ; SavedXmm11 db 16 dup (?) ; SavedXmm12 db 16 dup (?) ; SavedXmm13 db 16 dup (?) ; SavedXmm14 db 16 dup (?) ; SavedXmm15 db 16 dup (?) ; Fill2 dq ? ; fill KfFrame ends NESTED_ENTRY KeContextToKframes, _TEXT$00 alloc_stack (sizeof KfFrame) ; allocate stack frame save_xmm128 xmm6, KfFrame.SavedXmm6 ; save nonvolatile floating registers save_xmm128 xmm7, KfFrame.SavedXmm7 ; save_xmm128 xmm8, KfFrame.SavedXmm8 ; save_xmm128 xmm9, KfFrame.SavedXmm9 ; save_xmm128 xmm10, KfFrame.SavedXmm10 ; save_xmm128 xmm11, KfFrame.SavedXmm11 ; save_xmm128 xmm12, KfFrame.SavedXmm12 ; save_xmm128 xmm13, KfFrame.SavedXmm13 ; save_xmm128 xmm14, KfFrame.SavedXmm14 ; save_xmm128 xmm15, KfFrame.SavedXmm15 ; END_PROLOGUE mov rax, cr8 ; get current IRQL mov KfFrame.OldIrql[rsp], eax ; save current IRQL cmp eax, APC_LEVEL ; check if above or equal to APC level jae short KfCS10 ; if ae, above or equal APC level mov eax, APC_LEVEL ; raise IRQL to APC level mov cr8, rax ; KfCS10: mov r10, (5 * 8) + (sizeof KfFrame)[rsp] ; get parameter 5 mov KfFrame.P5Home[rsp], r10 ; set parameter 5 mov rax, dr7 ; access debug register call KxContextToKframes ; perform a context to kernel frames Смотрим далее: Код (Text): ;++ ; ; KiRestoreProcessorControlState ( ; VOID ; ); ; ; Routine Description: ; ; This routine restores the control state of the current processor. ; ; Arguments: ; ; ProcessorState (rcx) - Supplies a pointer to a processor state structure. ; ; Return Value: ; ; None. ; ;-- LEAF_ENTRY KiRestoreProcessorControlState, _TEXT$00 mov rax, PsCr0[rcx] ; restore processor control registers mov cr0, rax ; mov rax, PsCr3[rcx] ; mov cr3, rax ; mov rax, PsCr4[rcx] ; mov cr4, rax ; mov rax, PsCr8[rcx] ; mov cr8, rax ; lgdt fword ptr PsGdtr[rcx] ; restore GDTR lidt fword ptr PsIdtr[rcx] ; restore IDTR ; ; Force the TSS descriptor into a non-busy state so no fault will occur when ; TR is loaded. ; movzx eax, word ptr PsTr[rcx] ; get TSS selector add rax, PsGdtr + 2[rcx] ; compute TSS GDT entry address and byte ptr 5[rax], NOT 2 ; clear busy bit ltr word ptr PsTr[rcx] ; restore TR xor eax, eax ; load a NULL selector into the ldt lldt ax ; ldmxcsr dword ptr PsMxCsr[rcx] ; restore XMM control/status ; ; Restore debug control state. ; xor edx, edx ; restore debug registers mov dr7, rdx ; mov rax, PsKernelDr0[rcx] ; mov rdx, PsKernelDr1[rcx] ; mov dr0, rax ; mov dr1, rdx ; mov rax, PsKernelDr2[rcx] ; mov rdx, PsKernelDr3[rcx] ; mov dr2, rax ; mov dr3, rdx ; mov rdx, PsKernelDr7[rcx] ; xor eax, eax ; mov dr6, rax ; mov dr7, rdx ; Наеверно он и должен зануляться. KeCtxTo/FromKF() отличаются 32/64. Это отображения ядерного фрейм(состояния процессора) на юзер. В 32 есть сегментные поправки в основном, но зачем такое в 64 я хз. Поищи эти ссылки по суркам, как ядро читает из него дебаг события и почему зануляет.
благодарю согласно всем мануалам Intel и AMD Dr6 обязан индицировать выполнение условий Dr7 and Dr0..Dr3 (в AMD даже до Dr15) следовательно, это отсебятина мелкомягких.. Посмотрю на старой WinXP 64 и разных Linux 64 мда, пишут всякое и индицируют Dr6... вгоняют в когнитивный дисонанс.. http://x86asm.net/articles/debugging-in-amd64-64-bit-mode-in-theory/
vitokop, Так а причём там линукс и железо. Фишка нт, я не знаю подробности как там с отображением cpu-state(T-frame"), просто никогда небыло нужно писать отладчик есчо и под 64. И врядле это уже нужно, любой софт это запалит и завершится. Про ловушки уже все давно забыли.
..мда, ХЗ... 1. добился индикации Dr6 игнорируем FirstChance=1 для ExceptionCode = $000006BA ExceptionCode = $0000071A LOAD_DLL_DEBUG_EVENT base=00007FFBFE0E0000 C:\Windows\System32\imm32.dll ExceptionCode = $80000004 424 GetHandle OK ReadContext EXCEPTION_SINGLE_STEP DR6 = 00000000FFFF0FF1 DR7 = 0000000000000405 DR0 = 00000000007A6140 DR1 = 00000000007A616E DR2 = 0000000000000000 DR3 = 0000000000000000 Rip = 00000000007A6140 ................................................... OK ReadContext EXCEPTION_SINGLE_STEP DR6 = 00000000FFFF0FF2 DR7 = 0000000000000404 DR0 = 0000000000000000 DR1 = 00000000007A616E DR2 = 0000000000000000 DR3 = 0000000000000000 Rip = 00000000007A616E 2. Также имеем: OUTPUT_DEBUG_STRING_EVENT onecore\com\combase\dcomrem\security.cxx(3057)\combase.dll!00007FFBFE2595AC: (caller: 00007FFBECFA823E) ReturnHr(1) tid(3e0) 80010117 Не удается получить доступ к контексту вызова после завершения вызова. OUTPUT_DEBUG_STRING_EVENT onecore\com\combase\objact\dllcache.cxx(2127)\combase.dll!00007FFBFE33341C: (caller: 00007FFBFE24D33A) ReturnHr(2) tid(24c4) 8007045A Произошел сбой в программе инициализации библиотеки динамической компоновки (DLL).
vitokop, Короче чувак ты запутался сам тк полный нуби и запутал остальных зачем я ядро смотрел. Статусные коды https://docs.microsoft.com/en-us/op...ms-erref/596a1078-e883-4972-9bbc-49e60bebca55 ExceptionCode = $000006BA ExceptionCode = $0000071A - в системе не существуют. У тебя какой то в приложении левый модуль фильтрации стоит, не удивительно почему после танцев с бубном таки контекст получен. Такой бред: Тут не прокатит. Иди в комерс с таким вопросом.
как бы корректнее.... A priori, разработчик (Microsoft) не обязан декларировать и документировать коды ( индуса или китайца, стряпающих кол(д) ОС ) , на которые приложение (application, отладчик) обязан отвечать по идеологии Microsoft,например, в отладчике - DBG_EXCEPTION_NOT_HANDLED (не ведаю , о светлейший!!) Какое кому дело, что там за ширмочкой Проблемы индейцев шерифа не волнуют Приведенные OUTPUT_DEBUG_STRING_EVENT являются реакцией плохо-хорошо(?) разрабатываемой системы совместимости Microsoft в Windows 10 при попытке установить оную для конкретного приложения из ранних OC Microsoft или инструментов (компиляторов) и их детищ, рожденных в "темные века" до Windows 10 Что они и делают, взывая к следующему разработчику, возможно, русскому, правящему "индуса" (без обид)
vitokop, > не обязан декларировать и документировать коды Обязан, без них обработка событий невозможна. Ссылка выше. > Приведенные OUTPUT_DEBUG_STRING_EVENT являются реакцией плохо-хорошо(?) разрабатываемой системы совместимости Код (Text): #define EXCEPTION_DEBUG_EVENT 1 #define CREATE_THREAD_DEBUG_EVENT 2 #define CREATE_PROCESS_DEBUG_EVENT 3 #define EXIT_THREAD_DEBUG_EVENT 4 #define EXIT_PROCESS_DEBUG_EVENT 5 #define LOAD_DLL_DEBUG_EVENT 6 #define UNLOAD_DLL_DEBUG_EVENT 7 #define OUTPUT_DEBUG_STRING_EVENT 8 #define RIP_EVENT 9 Для тебя это плохо, тк ты даже не понимаешь разницу между статусным кодом исключения и отладочным событием. Это не связанные между собой вещи, кури матчасть https://wasm.in/threads/oshibki-v-polzovatelskom-rezhime.20412/
смотри внимательней: EXCEPTION_DEBUG_EVENT = TDebugEvent.dwDebugEventCode = 1 TDebugEvent.dwDebugEventCode = 1 приведенные мной и тобой коды Статусные коды https://docs.microsoft.com/en-us/op...ms-erref/596a1078-e883-4972-9bbc-49e60bebca55 суть: TDebugEvent.Exception.ExceptionRecord.ExceptionCode - не обязаны декларировать ВСЕ!! Разбирайся, если, возможно, ни разу не писал простейший отладчик --- Сообщение объединено, 13 мар 2021 --- И напоследок я скажу: Indy! Что будет, если система передаст в порт отладки dwDebugEventCode > 9 (> RIP_EVENT ) ? Повлияет ли это на работу отладчика (и его проектирование) и приложения, и, если да, то как??
А по сути? мда... Столкнулся с ОЧЕНЬ большой программой, множеством DLL, порядка десяти драйверов под W 7 64 так вот под отладкой со всеми выкрутасами скрыть, выкидывала дополнительно dwDebugEventCode = 11,13,19 (xm..простые числа) стандартные отладчики, естественно, пропускали но программа переходила в защиту и выдавала фортеля пришлось переключиться на debug-registers c последующими танцами получения контекста.. вот пример еще одной защиты ( драйвер порта отладки???) мда... никогда не переходите на личности, well-Known-школота....
vitokop, что вы считаете должен изучить человек и в какой последовательности, что бы брать такие высоты? А главное, до какой глубины?
> TDebugEvent.Exception.ExceptionRecord.ExceptionCode - не обязаны декларировать ВСЕ!! > Разбирайся, если, возможно, ни разу не писал простейший отладчик Вот это да жесть конечно. Чувак походу что то попутал. У меня новость для тебя - отладчик давно уже deprecated.