Setting Thread Context :\

Тема в разделе "WASM.NT.KERNEL", создана пользователем patolog, 11 фев 2008.

  1. patolog

    patolog New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    49
    неработает (читай : бсодит с ошипкой "BUGCHECK: 30 SET_OF_INVALID_CONTEXT") сделущий кодес:

    Код (Text):
    1.     Context.ContextFlags    =   CONTEXT_FULL;
    2.     Status = Int2eCall(0x55 /*NtGetContextThread*/, hThread, &Context);
    3.     DbgPrint("[SwitchEIP]   :   NtGetContextThread() returns %p\n", Status);
    4.     DbgPrint("[SwitchEIP]   :   Target EIP is %p\n", Context.Eip);
    5.     Status = Int2eCall(0x0D5 /*NtSetContextThread*/, hThread, &Context);
    6.     DbgPrint("[SwitchEIP]   :   NtSetContextThread() returns %p\n", Status);
    в умных доках написано что NtSetContextThread не может менять SS:SP, CS:IP, FLAGS, BP.
    и првда - я ставлю CONTEXT_INTEGER и все пашет. но как работает в таком случае юзермодные кодесы которые меняют EIP ?
    все вродь также. проверок нет никаких странных там :

    Код (Text):
    1. BOOL
    2. APIENTRY
    3. SetThreadContext(
    4.     HANDLE hThread,
    5.     CONST CONTEXT *lpContext
    6.     )
    7. {
    8.     NTSTATUS Status;
    9.  
    10.     Status = NtSetContextThread(hThread,(PCONTEXT)lpContext);
    11.  
    12.     if ( !NT_SUCCESS(Status) ) {
    13.         BaseSetLastNTError(Status);
    14.         return FALSE;
    15.         }
    16.     else {
    17.         return TRUE;
    18.         }
    19. }
     
  2. patolog

    patolog New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    49
    посмарел под отладчегом. вот что выдал анализ бсода :

    Код (Text):
    1. SI>lastfault -a
    2. BUGCHECK: 30  SET_OF_INVALID_CONTEXT
    3. The stack pointer in a trap frame had an invalid value. This bug check occurs
    4. when some routine attempts to set the stack pointer in the trap frame to a
    5. lower value than the current stack pointer value. If this error were not
    6. caught, it would cause the kernel to run with a stack pointer pointing to
    7. stack which is no longer valid.
    8.  
    9. Parameter 1 : 0x0006fde0         New stack ptr
    10. Parameter 2 : 0xf515edd8         Old stack ptr
    11. Parameter 3 : 0xf515ed64         Trap Frame
    12.  
    13.  
    14. Probably caused by : 0x00870000
    15. TrapFrame Address  : 0xf515ed64
    16. Context     Instruction Ptr  Stack Ptr   Frame Ptr   Parameters  Function Table  Status                                
    17. -----------------------------------------------------------------------------------------------------------------------
    18. 0x00870000  0x00870000       0xf515edd8  0xf515edd4              EBP             Return address is not in any image.  
    19.  
    20. Stack Frame Information for 0x00870000 on thread(160)
    21. Count: 16
    22.  
    23. Name    Value      
    24. --------------------
    25. eax     0x74725960  
    26. ebx     0x0        
    27. ecx     0x3        
    28. edx     0x44000    
    29. esi     0x6fee8    
    30. edi     0x1014018  
    31. eip     0x870000    
    32. esp     0xf515edd8  
    33. ebp     0xf515edd4  
    34. eflags  0x246      
    35. cs      0x18        
    36. ds      0x23        
    37. es      0x23        
    38. fs      0x3b        
    39. gs      0x0        
    40. ss      0x0        
    41. 00870000   push   ebp
    42. 00870001   mov    ebp, esp
    43. 00870003   push   ebx
    44. 00870004   push   esi
    45. 00870005   push   edi
    46. 00870006   int    03
    47. 00870007   call   008700d7 // 0x008700d7
    48.  
    49.  
    50.  
    51.  
    52. SI>stack
    53. Context                         Instruction Ptr  Stack Ptr   Frame Ptr   Status                                
    54. ---------------------------------------------------------------------------------------------------------------
    55. ntkrnlpa!_Section.text+0x21176  0x804f9176       0xf515eaa0  0xf515ea9c                                        
    56. ntkrnlpa!_Section.text+0x21c37  0x804f9c37       0xf515eaa4  0xf515eabc                                        
    57. ntkrnlpa!_Section.text+0x2582a  0x804fd82a       0xf515eac4  0xf515eae0                                        
    58. ntkrnlpa!_Section.text+0x25d86  0x804fdd86       0xf515eae8  0xf515eb00                                        
    59. ntkrnlpa!_SectionPAGE+0x6e38e   0x805d638e       0xf515eb08  0xf515eb1c                                        
    60. ntkrnlpa!_SectionPAGE+0x6e3d1   0x805d63d1       0xf515eb24  0xf515eb3c                                        
    61. ntkrnlpa!_Section.text+0x26bb5  0x804febb5       0xf515eb44  0xf515eb8c                                        
    62. ntkrnlpa!_Section.text+0x2ab35  0x80502b35       0xf515eb94  0xf515ebcc                                        
    63. ntkrnlpa!_Section.text+0x2a2b6  0x805022b6       0xf515ebd4  0xf515ec2c                                        
    64. ntkrnlpa!_Section.text+0x2ab35  0x80502b35       0xf515ec34  0xf515ec6c                                        
    65. win32k!_Section.text+0x2b44     0xbf802ec4       0xf515ec74  0xf515eca8                                        
    66. win32k!_Section.text+0x1728     0xbf801aa8       0xf515ecb0  0xf515ecec                                        
    67. win32k!_Section.text+0xed86     0xbf80f106       0xf515ecf4  0xf515ed4c                                        
    68. ntkrnlpa!_Section.text+0x6860c  0x8054060c       0xf515ed54  0xf515ed64                                        
    69. 0x00870000                      0x00870000       0xf515edd8  0xf515edd4  Return address is not in any image.
    --------------------------------

    однако кодес от такой :
    Код (Text):
    1.     Context.ContextFlags    =   CONTEXT_FULL|CONTEXT_DEBUG_REGISTERS|CONTEXT_FLOATING_POINT|CONTEXT_EXTENDED_REGISTERS;
    2.     Status = Int2eCall(0x55 /*NtGetContextThread*/, hThread, &Context);
    3.     DbgPrint("[SwitchEIP]   :   NtGetContextThread() returns %p\n", Status);
    4.     DbgPrint("[SwitchEIP]   :   Target EIP is %p\n", Context.Eip);
    5.     DbgPrint("[SwitchEIP]   :   Target EIP is %p\n", Context.Eip);
    6.     DbgPrint("[SwitchEIP]   :   Target ESP is %p\n", Context.Esp);
    7.     DbgPrint("[SwitchEIP]   :   Target EBP is %p\n", Context.Ebp);
    8.     DbgPrint("[SwitchEIP]   :   Target SS is %p\n", Context.SegSs);
    9.     DbgPrint("[SwitchEIP]   :   Target DS is %p\n", Context.SegDs);
    10.     DbgPrint("[SwitchEIP]   :   Target CS is %p\n", Context.SegCs);
    11.     DbgPrint("[SwitchEIP]   :   Target FS is %p\n", Context.SegFs);
    говорит что все вроде тру :

    Код (Text):
    1. NtGetContextThread() returns 00000000
    2. Target EIP is 7C90EB94
    3. Target EIP is 7C90EB94
    4. Target ESP is 0006FDE0
    5. Target EBP is 0006FDFC
    6. Target SS is 00000023
    7. Target DS is 00000023
    8. Target CS is 0000001B
    9. Target FS is 0000003B
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    надеюсь ты поток приостановил?
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    скорее всего да, тогда советую покопатся в сорцах wrk на эту тему.
     
  5. patolog

    patolog New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    49
    да, поток засаспеденный. почемуто при установке контекста херитсо стек =\\
     
  6. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    patolog
    Вообще достаточно флага CONTEXT_FULL

    А так - потренься в юзермоде вначале :derisive:
    А еще проверь вариант с аттачем (то есть KeAttach к процессу. и изменить , находясь в его контексте)
     
  7. patolog

    patolog New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    49
    пробовал. в юзере все пашет. тут сбрасываетсо SS и ваше портитсо
     
  8. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    patolog
    Обязательно проверю. Самому интересно. Как будет возможность правда :)

    Но почему то мне кажется, что с Аттачем точно должно работать .
     
  9. patolog

    patolog New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    49
    все разрешилось довольно просто. ETHREAD->KTHREAD->KTRAP_FRAME->EIP.