Синий экран nt!SwapContext_PatchXSave

Тема в разделе "WASM.X64", создана пользователем test555, 14 мар 2012.

  1. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Дело нестандартное. В общем дело так обстоит:

    7 x64.

    Я подменяю обработчик LSTAR (nt!KiSystemCall64) - поправьте, если неверно.
    Подменяю на свой код, который (срабатывает при первом же вызове какой-нибуль АПИ типа CreateFile)
    1. восстанавливает родной обработчик
    2. Вызываю NtOpenProcess.

    Получаю синий экран, падает на nt!SwapContext_PatchXSave (переход от KiSwapContext).

    Вот у меня такой вопрос, где можно узнать про эти контексты и почему у меня падает?

    WinDbg я ловлю когда начинает срабатывать мой обработчик и пошагово дохожу до NtOpenProcess и .. там в недрах.. падение...

    Запутался на счет контектстов. Юзермодная прога вызывает CreateFile, далее дело передается в ядро, там в какой-то момент срабатывает мой обработчик. Указатели на структуру правильные и тд. Причем падает только если корректный ПИД передается, иначе видимо просто не доходит.

    Вопрос: как мне прояснить ситуацию с KiSwapContext?
     
  2. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    В т-фрейме звать его нужно.
     
  3. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Эээто как?????
     
  4. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Окружение сменить на ядерное, сохранив предыдущее и сообщив об этом ядру.
     
  5. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Скажите, пожалуйста, названия функций необходимых?
     
  6. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Там не функции, а макро. Посмотрите в сурсах.

    Как в x64 нормально делается я не знаю, в x86 я морфлю сискол в буфер, чтобы выделить код, формирующий т-фрейм.
     
  7. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    2000?

    Честно, пока по вашим советам я не понял куда идти и копать...
     
  8. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Код (Text):
    1. ;++
    2. ;
    3. ; Routine Description:
    4. ;
    5. ;   This routine gains control when a system call instruction is executed
    6. ;   from 64-bit mode. The specified system service is executed by locating
    7. ;   its routine address in system service dispatch table and calling the
    8. ;   specified function.
    9. ;
    10. ;   N.B. This routine is never entered from kernel mode and it executed with
    11. ;        interrupts disabled.
    12. ;
    13. ; Arguments:
    14. ;
    15. ;   eax - Supplies the system service number.
    16. ;
    17. ; Return Value:
    18. ;
    19. ;   eax - System service status code.
    20. ;
    21. ;   r10, rdx, r8, and r9 - Supply the first four system call arguments.
    22. ;
    23. ;   rcx - Supplies the RIP of the system call.
    24. ;
    25. ;   r11 - Supplies the previous EFLAGS.
    26. ;
    27. ;--
    28.  
    29.         TRAP_ENTRY KiSystemCall64, KiSystemServiceHandler
    30.  
    31.         swapgs                          ; swap GS base to kernel PCR
    32.         mov     gs:[PcUserRsp], rsp     ; save user stack pointer
    33.         mov     rsp, gs:[PcRspBase]     ; set kernel stack pointer
    34.         push    KGDT64_R3_DATA or RPL_MASK ; push dummy SS selector
    35.         push    gs:[PcUserRsp]          ; push user stack pointer
    36.         push    r11                     ; push previous EFLAGS
    37.         push    KGDT64_R3_CODE or RPL_MASK ; push dummy 64-bit CS selector
    38.         push    rcx                     ; push return address
    39.         mov     rcx, r10                ; set first argument value
    40.  
    41.         push_frame                      ; mark machine frame
    42.         alloc_stack 8                   ; allocate dummy error code
    43.         push_reg rbp                    ; save standard register
    44.         alloc_stack (KTRAP_FRAME_LENGTH - (7 * 8)) ; allocate fixed frame
    45.         set_frame rbp, 128              ; set frame pointer
    46.         mov     TrRbx[rbp], rbx         ; save nonvolatile registers
    47.         .savereg rbx, (TrRbx + 128)     ;
    48.         mov     TrRdi[rbp], rdi         ;
    49.         .savereg rdi, (TrRdi + 128)     ;
    50.         mov     TrRsi[rbp], rsi         ;
    51.         .savereg rsi, (TrRsi + 128)     ;
    52.  
    53.         END_PROLOGUE
    54.  
    55.         mov     byte ptr TrExceptionActive[rbp], 2 ; set service active
    56.         mov     rbx, gs:[PcCurrentThread] ; get current thread address
    57.         prefetchw ThTrapFrame[rbx]      ; prefetch with write intent
    58.         stmxcsr TrMxCsr[rbp]            ; save current MXCSR
    59.         ldmxcsr gs:[PcMxCsr]            ; set default MXCSR
    60.         test    byte ptr ThDebugActive[rbx], TRUE ; test if debug enabled
    61.         mov     word ptr TrDr7[rbp], 0  ; assume debug not enabled
    62.         jz      short KiSS05            ; if z, debug not enabled
    63.         mov     TrRax[rbp], rax         ; save service argument registers
    64.         mov     TrRcx[rbp], rcx         ;
    65.         mov     TrRdx[rbp], rdx         ;
    66.         mov     TrR8[rbp], r8           ;
    67.         mov     TrR9[rbp], r9           ;
    68.         call    KiSaveDebugRegisterState ; save user debug registers
    69.         mov     rax, TrRax[rbp]         ; restore service argument registers
    70.         mov     rcx, TrRcx[rbp]         ;
    71.         mov     rdx, TrRdx[rbp]         ;
    72.         mov     r8, TrR8[rbp]           ;
    73.         mov     r9, TrR9[rbp]           ;
    74.  
    75.         align   16
    76.  
    77. KiSS05: sti                             ; enable interrupts
    78.  
    79. if DBG
    80.  
    81.         cmp     byte ptr ThPreviousMode[rbx], UserMode ; check previous mode
    82.         je      short @f                ; if e, previous mode set to user
    83.         int     3                       ;
    84. @@:                                     ;
    85.  
    86. endif
    87.  
    88. ;
    89. ; Dispatch system service.
    90. ;
    91. ;   eax - Supplies the system service number.
    92. ;   rbx - Supplies the current thread address.
    93. ;   rcx - Supplies the first argument if present.
    94. ;   rdx - Supplies the second argument if present.
    95. ;   r8 - Supplies the third argument if present.
    96. ;   r9 - Supplies the fourth argument if present.
    97. ;
    98.  
    99.         ALTERNATE_ENTRY KiSystemServiceStart
    100.  
    101.         mov     ThTrapFrame[rbx], rsp   ; set current frame pointer address
    Это всё опенсурсно. Лень чтоле посмотреть, как вы кодить собрались %)
     
  9. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Благодарю, буду разбираться.....
    Ух...