Отладочные регистры в 64 режиме

Тема в разделе "WASM.X64", создана пользователем vitokop, 10 мар 2021.

  1. vitokop

    vitokop Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    39
    Использую регистры Dr0..Dr7 в 64 разрядном режиме.
    Все работает, только при чтении CONTEXT Dr6 Всегда читается нулями??
    EXCEPTION_SINGLE_STEP срабатывает нормально, но нет индикации
    B0..B3 в Dr6.
    Кто сталкивался??
     
  2. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    KeContextFromKframes: if ((TrapFrame->Dr7 & DR7_ACTIVE) != 0) {

    Или проще говоря:

    vt 2009
     
  3. vitokop

    vitokop Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    39
    Естественно, при остановленном потоке (привилегия отладки) вручную изменяются Dr7,Dr0..Dr3, поток продолжается, выполняется
    прерывание отладки.например EXCEPTION_SINGLE_STEP. в НУЖНОМ месте, а Dr6 = 0,
    Dr7 и Dr0..Dr3 содержат правильную информацию,как, и Rip
    В win32 все нормально.
     
  4. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    vitokop,

    Почему ты сам сурки не хочешь посмотреть и нужно это делать за тебя ??

    wrk-v1.2\base\ntos\ke\amd64\except.c

    KxContextToKframes() см далее всюду зануляется dr6.

    Код (Text):
    1.     // Set debug register state if specified.
    2.     //
    3.  
    4.     if ((ContextFlags & CONTEXT_DEBUG_REGISTERS) == CONTEXT_DEBUG_REGISTERS) {
    5.  
    6.         //
    7.         // Set the debug registers DR0, DR1, DR2, DR3, DR6, and DR7.
    8.         //
    9.  
    10.         TrapFrame->Dr0 = SANITIZE_DRADDR(ContextRecord->Dr0, PreviousMode);
    11.         TrapFrame->Dr1 = SANITIZE_DRADDR(ContextRecord->Dr1, PreviousMode);
    12.         TrapFrame->Dr2 = SANITIZE_DRADDR(ContextRecord->Dr2, PreviousMode);
    13.         TrapFrame->Dr3 = SANITIZE_DRADDR(ContextRecord->Dr3, PreviousMode);
    14.         TrapFrame->Dr6 = 0;
    15.         TrapFrame->Dr7 = SANITIZE_DR7(ContextRecord->Dr7, PreviousMode);
    16.         TrapFrame->LastBranchToRip = ContextRecord->LastBranchToRip;
    17.         TrapFrame->LastBranchFromRip = ContextRecord->LastBranchFromRip;
    18.         TrapFrame->LastExceptionToRip = ContextRecord->LastExceptionToRip;
    19.         TrapFrame->LastExceptionFromRip = ContextRecord->LastExceptionFromRip;
    20.         if (PreviousMode != KernelMode) {
    21.             KeGetCurrentThread()->Header.DebugActive =
    22.                                 (BOOLEAN)((TrapFrame->Dr7 & DR7_ACTIVE) != 0);
    23.         }
    24.     }
    25.  
    26.     return XmmSaveArea;
    27. }
    Смотри ссылки KeContextToKframes() на 64:

    Код (Text):
    1. ;++
    2. ;
    3. ; VOID
    4. ; KeContextToKframes (
    5. ;     IN OUT PKTRAP_FRAME TrapFrame,
    6. ;     IN OUT PKEXCEPTION_FRAME ExceptionFrame,
    7. ;     IN PCONTEXT ContextRecord,
    8. ;     IN ULONG ContextFlags,
    9. ;     IN KPROCESSOR_MODE PreviousMode
    10. ;     )
    11. ;
    12. ; Routine Description:
    13. ;
    14. ;    This function saves the current non-volatile XMM state, performs a
    15. ;    context to kernel frames operation, then restores the non-volatile
    16. ;    XMM state.
    17. ;
    18. ; Arguments:
    19. ;
    20. ;    TrapFrame (rcx) - Supplies a pointer to a trap frame that receives the
    21. ;        volatile context from the context record.
    22. ;
    23. ;    ExceptionFrame (rdx) - Supplies a pointer to an exception frame that
    24. ;        receives the nonvolatile context from the context record.
    25. ;
    26. ;    ContextRecord (r8) - Supplies a pointer to a context frame that contains
    27. ;        the context that is to be copied into the trap and exception frames.
    28. ;
    29. ;    ContextFlags (r9) - Supplies the set of flags that specify which parts
    30. ;        of the context frame are to be copied into the trap and exception
    31. ;        frames.
    32. ;
    33. ;    PreviousMode (32[rsp]) - Supplies the processor mode for which the
    34. ;        exception and trap frames are being built.
    35. ;
    36. ; Return Value:
    37. ;
    38. ;    None.
    39. ;
    40. ;--
    41.  
    42. KfFrame struct
    43.         P1Home  dq ?                    ; parameter home addresses
    44.         P2Home  dq ?                    ;
    45.         P3Home  dq ?                    ;
    46.         P4Home  dq ?                    ;
    47.         P5Home  dq ?                    ;
    48.         OldIrql dd ?                    ; previous IRQL
    49.         Fill1   dd ?                    ; fill
    50.         SavedXmm6 db 16 dup (?)         ; saved nonvolatile floating registers
    51.         SavedXmm7 db 16 dup (?)         ;
    52.         SavedXmm8 db 16 dup (?)         ;
    53.         SavedXmm9 db 16 dup (?)         ;
    54.         SavedXmm10 db 16 dup (?)        ;
    55.         SavedXmm11 db 16 dup (?)        ;
    56.         SavedXmm12 db 16 dup (?)        ;
    57.         SavedXmm13 db 16 dup (?)        ;
    58.         SavedXmm14 db 16 dup (?)        ;
    59.         SavedXmm15 db 16 dup (?)        ;
    60.         Fill2   dq ?                    ; fill
    61. KfFrame ends
    62.  
    63.         NESTED_ENTRY KeContextToKframes, _TEXT$00
    64.  
    65.         alloc_stack (sizeof KfFrame)    ; allocate stack frame
    66.         save_xmm128 xmm6, KfFrame.SavedXmm6 ; save nonvolatile floating registers
    67.         save_xmm128 xmm7, KfFrame.SavedXmm7 ;
    68.         save_xmm128 xmm8, KfFrame.SavedXmm8 ;
    69.         save_xmm128 xmm9, KfFrame.SavedXmm9 ;
    70.         save_xmm128 xmm10, KfFrame.SavedXmm10 ;
    71.         save_xmm128 xmm11, KfFrame.SavedXmm11 ;
    72.         save_xmm128 xmm12, KfFrame.SavedXmm12 ;
    73.         save_xmm128 xmm13, KfFrame.SavedXmm13 ;
    74.         save_xmm128 xmm14, KfFrame.SavedXmm14 ;
    75.         save_xmm128 xmm15, KfFrame.SavedXmm15 ;
    76.  
    77.         END_PROLOGUE
    78.  
    79.         mov     rax, cr8                ; get current IRQL
    80.         mov     KfFrame.OldIrql[rsp], eax ; save current IRQL
    81.         cmp     eax, APC_LEVEL          ; check if above or equal to APC level
    82.         jae     short KfCS10            ; if ae, above or equal APC level
    83.         mov     eax, APC_LEVEL          ; raise IRQL to APC level
    84.         mov     cr8, rax                ;
    85. KfCS10: mov     r10, (5 * 8) + (sizeof KfFrame)[rsp] ; get parameter 5
    86.         mov     KfFrame.P5Home[rsp], r10 ; set parameter 5
    87.         mov     rax, dr7                ; access debug register
    88.         call    KxContextToKframes      ; perform a context to kernel frames
    Смотрим далее:

    Код (Text):
    1.  
    2. ;++
    3. ;
    4. ; KiRestoreProcessorControlState (
    5. ;  VOID
    6. ;  );
    7. ;
    8. ; Routine Description:
    9. ;
    10. ;  This routine restores the control state of the current processor.
    11. ;
    12. ; Arguments:
    13. ;
    14. ;  ProcessorState (rcx) - Supplies a pointer to a processor state structure.
    15. ;
    16. ; Return Value:
    17. ;
    18. ;  None.
    19. ;
    20. ;--
    21.   LEAF_ENTRY KiRestoreProcessorControlState, _TEXT$00
    22.   mov  rax, PsCr0[rcx]  ; restore processor control registers
    23.   mov  cr0, rax  ;
    24.   mov  rax, PsCr3[rcx]  ;
    25.   mov  cr3, rax  ;
    26.   mov  rax, PsCr4[rcx]  ;
    27.   mov  cr4, rax  ;
    28.   mov  rax, PsCr8[rcx]  ;
    29.   mov  cr8, rax  ;
    30.   lgdt  fword ptr PsGdtr[rcx]  ; restore GDTR
    31.   lidt  fword ptr PsIdtr[rcx]  ; restore IDTR
    32. ;
    33. ; Force the TSS descriptor into a non-busy state so no fault will occur when
    34. ; TR is loaded.
    35. ;
    36.  movzx eax, word ptr PsTr[rcx] ; get TSS selector
    37.  add rax, PsGdtr + 2[rcx] ; compute TSS GDT entry address
    38.  and byte ptr 5[rax], NOT 2  ; clear busy bit
    39.   ltr  word ptr PsTr[rcx]  ; restore TR
    40.  xor  eax, eax  ; load a NULL selector into the ldt
    41.  lldt ax  ;
    42.   ldmxcsr dword ptr PsMxCsr[rcx]  ; restore XMM control/status
    43. ;
    44. ; Restore debug control state.
    45. ;
    46.   xor  edx, edx  ; restore debug registers
    47.   mov  dr7, rdx  ;
    48.   mov  rax, PsKernelDr0[rcx]  ;
    49.   mov  rdx, PsKernelDr1[rcx]  ;
    50.   mov  dr0, rax  ;
    51.   mov  dr1, rdx  ;
    52.   mov  rax, PsKernelDr2[rcx]  ;
    53.   mov  rdx, PsKernelDr3[rcx]  ;
    54.   mov  dr2, rax  ;
    55.   mov  dr3, rdx  ;
    56.   mov  rdx, PsKernelDr7[rcx]  ;
    57.   xor  eax, eax  ;
    58.   mov  dr6, rax  ;
    59.   mov  dr7, rdx  ;
    60.  
    Наеверно он и должен зануляться. KeCtxTo/FromKF() отличаются 32/64. Это отображения ядерного фрейм(состояния процессора) на юзер. В 32 есть сегментные поправки в основном, но зачем такое в 64 я хз. Поищи эти ссылки по суркам, как ядро читает из него дебаг события и почему зануляет.
     
  5. vitokop

    vitokop Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    39
    благодарю
    согласно всем мануалам 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/
     
    Последнее редактирование модератором: 12 мар 2021
  6. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    vitokop,

    Так а причём там линукс и железо. Фишка нт, я не знаю подробности как там с отображением cpu-state(T-frame"), просто никогда небыло нужно писать отладчик есчо и под 64. И врядле это уже нужно, любой софт это запалит и завершится. Про ловушки уже все давно забыли.
     
  7. vitokop

    vitokop Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    39
    ..мда, ХЗ...

    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).
     
  8. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    vitokop,

    Короче чувак ты запутался сам тк полный нуби и запутал остальных зачем я ядро смотрел. Статусные коды https://docs.microsoft.com/en-us/op...ms-erref/596a1078-e883-4972-9bbc-49e60bebca55

    ExceptionCode = $000006BA
    ExceptionCode = $0000071A

    - в системе не существуют.

    У тебя какой то в приложении левый модуль фильтрации стоит, не удивительно почему после танцев с бубном таки контекст получен.

    Такой бред:

    Тут не прокатит. Иди в комерс с таким вопросом.
     
  9. vitokop

    vitokop Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    39
    как бы корректнее....

    A priori, разработчик (Microsoft) не обязан декларировать и документировать
    коды ( индуса или китайца, стряпающих кол(д) ОС ) , на которые приложение (application, отладчик) обязан отвечать
    по идеологии Microsoft,например, в отладчике - DBG_EXCEPTION_NOT_HANDLED (не ведаю , о светлейший!!)

    Какое кому дело, что там за ширмочкой
    Проблемы индейцев шерифа не волнуют

    Приведенные OUTPUT_DEBUG_STRING_EVENT являются реакцией плохо-хорошо(?) разрабатываемой системы совместимости
    Microsoft в Windows 10 при попытке установить оную для конкретного приложения из ранних OC Microsoft или
    инструментов (компиляторов) и их детищ, рожденных в "темные века" до Windows 10
    Что они и делают, взывая к следующему разработчику, возможно, русскому, правящему "индуса" (без обид)
     
  10. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    vitokop,

    > не обязан декларировать и документировать коды

    Обязан, без них обработка событий невозможна. Ссылка выше.

    > Приведенные OUTPUT_DEBUG_STRING_EVENT являются реакцией плохо-хорошо(?) разрабатываемой системы совместимости

    Код (Text):
    1. #define EXCEPTION_DEBUG_EVENT       1
    2. #define CREATE_THREAD_DEBUG_EVENT   2
    3. #define CREATE_PROCESS_DEBUG_EVENT  3
    4. #define EXIT_THREAD_DEBUG_EVENT     4
    5. #define EXIT_PROCESS_DEBUG_EVENT    5
    6. #define LOAD_DLL_DEBUG_EVENT        6
    7. #define UNLOAD_DLL_DEBUG_EVENT      7
    8. #define OUTPUT_DEBUG_STRING_EVENT   8
    9. #define RIP_EVENT                   9
    Для тебя это плохо, тк ты даже не понимаешь разницу между статусным кодом исключения и отладочным событием. Это не связанные между собой вещи, кури матчасть https://wasm.in/threads/oshibki-v-polzovatelskom-rezhime.20412/
     
    Последнее редактирование модератором: 13 мар 2021
  11. vitokop

    vitokop Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    39
    смотри внимательней:

    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 ) ?
    Повлияет ли это на работу отладчика (и его проектирование) и приложения, и, если да, то как??
     
  12. vitokop

    vitokop Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    39
    А по сути?
    мда...
    Столкнулся с ОЧЕНЬ большой программой, множеством DLL, порядка десяти драйверов
    под W 7 64
    так вот под отладкой со всеми выкрутасами скрыть, выкидывала дополнительно dwDebugEventCode = 11,13,19 (xm..простые числа)
    стандартные отладчики, естественно, пропускали
    но программа переходила в защиту и выдавала фортеля
    пришлось переключиться на debug-registers c последующими танцами получения контекста..
    вот пример еще одной защиты ( драйвер порта отладки???)
    мда...
    никогда
    не переходите на личности, well-Known-школота....
     
  13. q2e74

    q2e74 Active Member

    Публикаций:
    0
    Регистрация:
    18 окт 2018
    Сообщения:
    994
    vitokop, что вы считаете должен изучить человек и в какой последовательности, что бы брать такие высоты? А главное, до какой глубины?
     
    Последнее редактирование: 13 мар 2021
  14. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    > TDebugEvent.Exception.ExceptionRecord.ExceptionCode - не обязаны декларировать ВСЕ!!

    > Разбирайся, если, возможно, ни разу не писал простейший отладчик

    Вот это да жесть конечно. Чувак походу что то попутал.

    У меня новость для тебя - отладчик давно уже deprecated.
     
    galenkane нравится это.