sidt

Тема в разделе "WASM.BEGINNERS", создана пользователем staper, 19 май 2009.

  1. staper

    staper New Member

    Публикаций:
    0
    Регистрация:
    19 май 2009
    Сообщения:
    18
    1) Запутался в сегментах, селекторах, дескрипторах... Как вычислить ФИЗИЧЕСКИЙ адрес какой-нибудь переменной (кода) в защищённом режиме в плоской модели, в страничной?
    2) См. приложение. Находит ли этот код реальный адрес IDT и обработчика прерывания № 32? Если нет, то подскажите, пожалуйста, как вычислить его физический адресс. Написано на FASM'e.
    3) Ну, и вытекает из п.1 и 2, как подменить обработчик прерывания?

    Спасибо всем откликнувшимся!


    Приложение:

    sidt [idt]
    mov eax,idt
    mov eax,[eax+2] ;line address for IDT table
    lea ecx,[eax+32*8] ;line address for int0 handler
    mov eax,[ecx+4] ;селектор(31-16),смещение(15-0)
    xor ax,ax
    mov ax,[ecx] ;смещение (31-16)

    idt dp ?
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    staper
    Если под защищённым режимом с плоской моделью и страничной адресацией подразумевается Windows, то там преравания, кроме int 2Eh не используются
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Mikl___
    Если под "используюся" подразумевается "установлены" и под прерываниями подразумеваются программные прерывания, то кроме 2e есть еще
    2a - KiGetTickCount
    2b - KiCallbackReturn
    2c - KiSetLowWaitHighThread
    2d - KiDebugService
    Используются из них
    2e: (в win 2k),
    2b: возврат из каллбеков (в которые зашли по KeUserModeCallback),
    2d: nt!DbgPrint -> nt!vDbgPrintExWithPrefix -> nt!DebugPrint -> nt!DebugService -> int 2dh

    staper
    Ну примерно так.
    Код (Text):
    1. //
    2. // IDT entry
    3. //
    4.  
    5. #pragma pack(push, 1)
    6. typedef struct
    7. {
    8.     USHORT OffsetLow;
    9.     USHORT Selector;
    10.     UCHAR ReservedByte;
    11.     UCHAR Type : 3;
    12.     UCHAR D : 1;
    13.     UCHAR UnusedBits2 : 1;
    14.     UCHAR DPL : 2;
    15.     UCHAR Present : 1;
    16.     USHORT OffsetHigh;
    17. } IDTEntry, *PIDTEntry;
    18. #pragma pack(pop)
    19.  
    20. //
    21. // IDTR register
    22. //
    23.  
    24. #pragma pack(push, 2)
    25. typedef struct
    26. {
    27.     USHORT Limit;
    28.     PIDTEntry Table;
    29. } IDTR, *PIDTR;
    30. #pragma pack(pop)
    31.  
    32. //
    33. // Routines to work with IDT
    34. //
    35.  
    36. IDTR Idtr;
    37.  
    38. PVOID
    39. SetVector(
    40.   IN UCHAR Interrupt,
    41.   IN PVOID Handler,
    42.   IN BOOLEAN MakeValid
    43.   )
    44. /**
    45.     Set IDT vector Interrupt to point to Handler
    46. */
    47. {
    48.     BOOLEAN OldWP;
    49.     ULONG OldHandler;
    50.     KIRQL Irql;
    51.    
    52.     //
    53.     // Disable WP and interrupts
    54.     //
    55.  
    56.     OldWP = DisableWP();
    57.     Irql = KfRaiseIrql (HIGH_LEVEL);
    58.  
    59.     if (Idtr.Table == NULL)
    60.         __asm sidt fword ptr [Idtr]
    61.  
    62.     //
    63.     // Fill out IDT entry with the corresponding values
    64.     //
    65.  
    66.     OldHandler = Idtr.Table[Interrupt].OffsetLow  | ( Idtr.Table[Interrupt].OffsetHigh << 16 );
    67.    
    68.     Idtr.Table[Interrupt].OffsetLow  = (USHORT) ( (ULONG)Handler )       & 0xFFFF;
    69.     Idtr.Table[Interrupt].OffsetHigh = (USHORT) ( (ULONG)Handler >> 16 ) & 0xFFFF;
    70.  
    71.     if (MakeValid)
    72.     {
    73.         Idtr.Table[Interrupt].Present    = 1;
    74.         Idtr.Table[Interrupt].D          = 1;
    75.         Idtr.Table[Interrupt].DPL        = 3;
    76.         Idtr.Table[Interrupt].Selector   = 0x0008;
    77.     }
    78.    
    79.     //
    80.     // Restore interrupts and CR0 value
    81.     //
    82.  
    83.     KfLowerIrql (Irql);
    84.  
    85.     RestoreWP (OldWP);
    86.  
    87.     return (PVOID) OldHandler;
    88. }
     
  4. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    staper, рекомендую мануалы от интела. там даже картинки со стрелочками, которые показывают что откуда и куда поставить, чтоб сконвертить адрес из одного вида в другой.
    код грейта исчо надо бы на каждом йадре выполнить, но это мелочи
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Mikl___
    Как это не ипользуются, помимо програмных есчо аппаратных прерываний куча и исключений.
     
  6. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    staper - для записи в IDT физический адрес знать не надо.
    В IDT хранятся логические адреса обработкиков: selector:offset
    А вообще преобразование такое: logical_address->linear_address->physical_address

    1. logical_address->linear_address
    из GDT/LDT в зависимости от селектора читаем базовый адрес сегмента и к нему прибавляем смещение. получаем линейный адрес

    2. linear_address->physical_address
    для линейного адреса считаем номер страницы page_num=linear_address / page_size и смещение в странице page_offset=linear_address % page_size
    По номеру страницы (page_num) из таблицы страниц читаем физический адрес страницы и к нему прибавляем смещение в странице (page_offset).
    Получаем физический адрес.

    Если страничная адресация не включена - физический адрес равен линейному.