Модификация своего TSS

Тема в разделе "WASM.ASSEMBLER", создана пользователем Ichetnick, 21 фев 2006.

  1. Ichetnick

    Ichetnick New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2006
    Сообщения:
    9
    Цель - выставить флаг T в слове флагов задачи



    __asm{

    str ax

    mov fs, ax

    mov edi, 0x64

    mov ax, fs:[edi]

    or ax, 1

    mov fs:[edi], ax

    }



    Вместо этого получаю bugcheck.



    Выполняется все естественно в kernel mode. Обработчик int 1 есть и проверен на TF, int 1 и бряках.



    Я куда-то не туда лезу?
     
  2. nobody

    nobody New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2004
    Сообщения:
    32
    Адрес:
    Afghanistan
    Может попробовать сохранять FS, или использовать другой сегментный регистр?
     
  3. Godness

    Godness Мёртвый дзена

    Публикаций:
    0
    Регистрация:
    27 ноя 2002
    Сообщения:
    90
    Ichetnick



    Через селектор ТSS ни читать ни писать нельзя! Тебе нужно перенастроить другой селектор на область памяти, где хранится TSS. И через него уже читать. Я делал вот так, через 23й селектор -
    Код (Text):
    1.  
    2.   mov     ax, 23h
    3.   mov     ds, ax
    4.   mov     ax, 10h
    5.   mov     gs, ax
    6.   sub     esp, 08h
    7.  
    8.   sgdt    fword ptr [esp]
    9.  
    10.   str     ax       //get TSS selector
    11.   movzx   eax, ax
    12.   add     eax, dword ptr [esp + 2]
    13.  
    14.   mov     edx, dword ptr [eax]
    15.   mov     dword ptr [temp_new_descrp], edx
    16.   mov     edx, dword ptr [eax + 4]
    17.   mov     dword ptr [temp_new_descrp + 4], edx
    18.  
    19.   mov     ax, 20h   //means 23h selector
    20.   movzx   eax, ax
    21.   add     eax, dword ptr [esp + 2]
    22.  
    23.   mov     edx, dword ptr [eax]
    24.   mov     dword ptr [temp_old_descrp], edx
    25.   mov     edx, dword ptr [eax + 4]
    26.   mov     dword ptr [temp_old_descrp + 4], edx
    27.  
    28.   shr     edx, 8
    29.   mov     byte ptr [temp_new_descrp + 4 + 1], dl
    30.   shr     edx, 8
    31.   and     dl, 11000000b
    32.   mov     byte ptr [temp_new_descrp + 4 + 2], dl
    33.  
    34.   mov     edx, dword ptr [temp_new_descrp] //patch GDT
    35.   mov     dword ptr [eax], edx
    36.   mov     edx, dword ptr [temp_new_descrp + 4]
    37.   mov     dword ptr [eax + 4], edx
    38.        
    39.   mov     dx, 23h   //reload shadow part in ds
    40.   mov     ds, dx
    41.  
    42.   mov     edx, dword ptr ds:[4]
    43.   mov     dword ptr gs:[original_esp0], edx
    44.   mov     dword ptr ds:[4], ecx //patch ESP0 value at TSS
    45.  
    46.   mov     edx, dword ptr gs:[temp_old_descrp] //patch GDT
    47.   mov     dword ptr gs:[eax], edx
    48.   mov     edx, dword ptr gs:[temp_old_descrp + 4]
    49.   mov     dword ptr gs:[eax + 4], edx
    50.  
    51.   mov     dx, 23h
    52.   mov     ds, dx
    53.  
    54.   add     esp, 08h
    55.   pop     gs
    56.   pop     ds
    57.  


    вроде работает :)
     
  4. Ichetnick

    Ichetnick New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2006
    Сообщения:
    9
    А почему выбраны селекторы 23 и 10?

    Просто у меня код для kernel mode в Windows и предопределить значения селекторов я не смогу.



    Как я понимаю gs (0x10) - это селектор данных?
     
  5. Ichetnick

    Ichetnick New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2006
    Сообщения:
    9
    Не работает...



    Переработал код до такого



    UCHAR lpGDT[8];

    UCHAR new_descriptor[8];

    UCHAR old_descriptor[8];



    __asm {

    cli

    pushad



    mov ax, 0x23

    mov ds, ax

    mov ax, 0x10

    mov gs, ax



    sgdt fword ptr [lpGDT]

    str ax

    movzx eax, ax

    add eax, dword ptr [lpGDT+2] ; now eax points to TSS data descriptor



    mov edx, dword ptr [eax]

    mov dword ptr [new_descriptor], edx

    mov edx, dword ptr [eax+4]

    mov dword ptr [new_descriptor+4], edx ; now new_descriptor saved



    mov ax, 0x20

    movzx eax, ax

    add eax, dword ptr [lpGDT+2] ; now eax points to our data descriptor



    mov edx, dword ptr [eax]

    mov dword ptr [old_descriptor], edx

    mov edx, dword ptr [eax + 4]

    mov dword ptr [old_descriptor + 4], edx ; now old_descriptor backuped



    shr edx, 8

    mov byte ptr [new_descriptor + 4 + 1], dl

    shr edx, 8

    and dl, 11000000b

    mov byte ptr [new_descriptor + 4 + 2], dl ; now new_descriptor patched



    mov edx, dword ptr [new_descriptor]

    mov dword ptr [eax], edx

    mov edx, dword ptr [new_descriptor + 4]

    mov dword ptr [eax + 4], edx ; patch GDT



    mov dx, 0x23 ; reload shadow part

    mov ds, dx



    mov dx, word ptr ds:[0x64]

    or dx, 1

    mov word ptr ds:[0x64],dx //patch Task Flags



    mov edx, dword ptr [old_descriptor]

    mov dword ptr gs:[eax], edx

    mov edx, dword ptr [old_descriptor+4]

    mov dword ptr gs:[eax + 4], edx ; restore GDT backup



    mov dx, 23h

    mov ds, dx

    popad



    sti

    };



    Не позволяет читать с 0x64
     
  6. Godness

    Godness Мёртвый дзена

    Публикаций:
    0
    Регистрация:
    27 ноя 2002
    Сообщения:
    90
    На лицо (...лице :) ) явные баги!

    Во первых, что это значит:



    Просто у меня код для kernel mode в Windows и предопределить значения селекторов я не смогу



    ?!?! глупость! - kernel mode (т.е. ring0) - абсолютная власть! - делаеш что хочеш. Возможно ты не совсем еще рулиш в уровнях привелегий кода и пр хр.

    (Правда я сам не рулю в этом как надо :))



    А почему выбраны селекторы 23 и 10?

    ...Как я понимаю gs (0x10) - это селектор данных?




    Эти селекторы выбраны на фонарь я мог использовать любые другие. 23h - это селектор данных для ринг3. 10h - это селектор данных для ринг0 (точнее это селектор указателя стека SS, но это не важно)



    Теперь вопиющее безобразие :)

    Что это? -
    Код (Text):
    1.   mov edx, dword ptr [old_descriptor]
    2.   mov dword ptr gs:[eax], edx
    3.   mov edx, dword ptr [old_descriptor+4]
    4.   mov dword ptr gs:[eax + 4], edx


    а должно быть так:
    Код (Text):
    1.   mov edx, dword ptr [b]gs:[/b][old_descriptor]
    2.   mov dword ptr gs:[eax], edx
    3.   mov edx, dword ptr [b]gs:[/b][old_descriptor+4]
    4.   mov dword ptr gs:[eax + 4], edx


    т.е. ты же получается читал old_descriptor через ds, т.е. из самой TSS!!?



    Ну и далее - что ты читаеш по смещению 0x64?

    Посмотри на структуру TSS -

    по смещению 0x64 находится "I/O Map Base Address"

    Регистр флагов текущей задачи находится по смещению 0x24



    Проверь все внимательно - должно работать, вот правда когда я с TSS ковырялся, я заметил что в текущей TSS по смещению 0x24 будет находится не текущий EFLAGS!, а ноль! Что вообщем-то мне пока не понятно.

    Но это уже другой вопрос...
     
  7. Ichetnick

    Ichetnick New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2006
    Сообщения:
    9
    Насчет gs спасибо.. Сейчас попробую...



    Насчет 64h - по Зубкову там 2 байта слово флагов задачи (не EFLAGS!) А порты идут следующими.



    Насчет селекторов спасибо...



    предопределить значения селекторов я не смогу имелось ввиду что я не смогу засатвить винду использовать селектор 23h для данных ring0. Вопрос был к тому что в коде захардкоден 23h в ds, так что если другая версия винды будет использовать другой селектор для данных то мы грохнемся на этом коде при попытке сохранить данные перед модификацией дескриптора...



    Сейчас запущу VMWare экспериментировать... Извиняюсь за свою тупизну - но асм видел в прошлый раз 3 года назад, а тут такая подстава... И тем более защищенный режим, в котором я хронически туплю...
     
  8. Godness

    Godness Мёртвый дзена

    Публикаций:
    0
    Регистрация:
    27 ноя 2002
    Сообщения:
    90
    Вопрос был к тому что в коде захардкоден 23h в ds, так что если другая версия винды будет использовать другой селектор для данных то мы грохнемся на этом коде при попытке сохранить данные перед модификацией дескриптора...



    У всей линейки NT предназначения селекторов данных и кода одинаковы и соответственно одинаковы их значения.

    На это можно положится, по крайней мере на сегодняшний день.



    На счет Зубкова - может быть, не знаю...