получение CPL 0

Тема в разделе "WASM.BEGINNERS", создана пользователем t00x, 26 май 2008.

  1. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    подскажите, как получить CPL 0.
    необходим для записи в отладочные регистры.
     
  2. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    t00x
    Пиши драйвер
     
  3. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    для изучения отладочных регистров необходимо писать драйвер?
     
  4. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    CPL0 показывает, что ты находишься в kernelmode, верно?
    Для изменения и работы с отладочными регистрами нужны привилегии ядра, а чтобы их получить, придется лезть в ядро, т.е. писать драйвер.
    Изменить отладочные регистры из юзермода система не даст.
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Напрямую не даст, а через Get\SetThreadContext или SEH-обработчик ?
     
  6. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Нет, тоже не даст. Intel уверяет, что инструкция MOV DRn является привилегированной.
     
  7. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    steelfactor
    при чём тут привелегированная инструкция ? Ты правишь контекст, функция SwapContext ядерная уже установит нужный контекст потока
     
  8. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    k3internal
    mea culpa, поспешил с ответом.
    Но как тогда такое может быть, если вызов юзермодной функции SetThreadContext может корректировать debug-регистры, доступ к которым, со слов Intel'a, требует CPL0? Где на@бывают?
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    steelfactor
    Уфф.. Отладочные регистры хорошё изменяются через NtSet/GetContextThread, доступ к ним закрыт из р3, но контекст потока изменятся в р0.
     
  10. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Clerk
    Реально не знал о такой возможности (никогда не сталкивался), надеюсь t00x будет не в обиде, что ввел в заблуждение :)
     
  11. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    GetCurrentThread() + GetThreadContext(); - отработали без ошибок, однако структура осталась пустой :dntknw:
    k3internal
    насколько понял, надо изменить отладочные регистры в CONTEXT и выполнить SwapContext.
    поискал на c:\windows файлы со SwapContext, только в *.pdb от SP2 нашлись, и в engdbg.dll.

    P.S. steelfactor
    это понятно :)
     
  12. leo

    leo Active Member

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

    n0name New Member

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

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    пробовал считать контекст текущего потока.
    сделал mov [CONTEXT + 48], CONTEXT_ALL

    и ещё, в OllyDbg смотрел, поток не создаётся:
    Код (Text):
    1.     push idThread       ;
    2.     push ecx        ; Flags
    3.     push ecx        ; ValueIn
    4.     push ThreadFunc     ;
    5.     push ecx        ;
    6.     push ecx        ;
    7.     call [CreateThread] ;
    8.  
    9. ...
    10. proc ThreadFunc
    11.     push esp
    12.     add ecx, 1
    13.  
    14.     pop esp
    15.     ret
    16. endp
     
  15. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    MSDN видимо не модно...
    а у меня создается, если в ecx ноль конечно.
     
  16. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    t00x
    почему +48 ? вроде в самом начале флажки стоят

    да, вижу, есть в DDK CONTEXT_ALL, это меня windows.inc попутал :)
     
  17. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    есть CONTEXT_ALL в него как раз и входят дебажные регистры, а вообще какой статус возвращается при вызове? Мож привилегии поднять?
     
  18. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    картинка прилагается. без отладчика выполняется, но контекст не считывает
    Код (Text):
    1.     xor ecx, ecx
    2.     push idThread       ;
    3.     push ecx        ; Flags
    4.     push ecx        ; ValueIn
    5.     push ThreadFunc     ;
    6.     push ecx        ;
    7.     push ecx        ;
    8.     call [CreateThread] ;
    9.  
    10.     mov dword [_thread_context.ContextFlags], CONTEXT_ALL   ; ContextFlags = CONTEXT_ALL
    11.     push _thread_context        ; CONTEXT CurrentThread
    12.  
    13.     mov eax, [idThread]
    14.     push eax
    15.     call [SuspendThread]
    16.  
    17.     mov eax, [idThread]
    18.     push eax
    19.     call [GetThreadContext]
    P.S. покажите кто-нибудь структуру CONTEXT, и флаги для этой структуры
     
  19. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Чтобы сохранить контекст, имеет смысл взять WinNT.h целиком же.
     
  20. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    t00x
    В GetThreadContext нужно передавать не id потока, а хэндл, возвращаемый CreateThread