Захват IDT

Тема в разделе "WASM.NT.KERNEL", создана пользователем sysexit, 30 авг 2010.

  1. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    Код (Text):
    1. #include "ntddk.h"
    2. #include <stdio.h>
    3. #define MAKELONG(a, b)((LONG) (((WORD) (a)) | ((DWORD) ((WORD) (b))) << 16))
    4.  
    5. typedef unsigned char byte,BYTE;
    6. typedef unsigned short int word,WORD;
    7. typedef unsigned int dword,DWORD;
    8. typedef DWORD *PDWORD,*LPDWORD;
    9. typedef WORD *PWORD,*LPWORD;
    10.  
    11. VOID OnUnload( IN PDRIVER_OBJECT DriverObject )
    12. {
    13.  DbgPrint("\nDriver unloaded\n");
    14. }
    15.  
    16. typedef struct
    17. {
    18.  WORD IDTLimit;
    19.  WORD LowIDTbase;
    20.  WORD HiIDTbase;
    21. } IDTINFO;
    22.  
    23. typedef struct
    24. {
    25.     unsigned short LowOffset;
    26.     unsigned short selector;
    27.     unsigned char unused_lo;
    28.     unsigned char segment_type:4;
    29.     unsigned char system_segment_flag:1;
    30.     unsigned char DPL:2;
    31.     unsigned char P:1;
    32.     unsigned short HiOffset;
    33. } IDTENTRY;
    34.  
    35. NTSTATUS DriverEntry(IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath)
    36. {
    37.  unsigned int ADDR;
    38.  char out_[255];
    39.  IDTINFO idt_info;
    40.  IDTENTRY* idt_entries;
    41.  IDTENTRY* i;
    42.  
    43.  __asm SIDT idt_info;
    44.  idt_entries = (IDTENTRY*) MAKELONG(idt_info.LowIDTbase, idt_info.HiIDTbase);
    45.  
    46.  i = &idt_entries[0xFF];
    47.  
    48.  idt_entries[0xFF].LowOffset = 0xFFFF;
    49.  idt_entries[0xFF].HiOffset  = 0xFFFF;
    50.  
    51.  ADDR = MAKELONG(i->LowOffset, i->HiOffset);
    52.  _snprintf(out_, sizeof(out_), "%X\n", ADDR);
    53.  DbgPrint(out_);
    54.  
    55.  
    56.  theDriverObject->DriverUnload  = OnUnload;
    57.  return 0;
    58. }
    Почему после этого кода livekd показывает что адрес 255 прерывания остался прежним, а не стал 0xFFFFFFFF ?
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    многоядерная система?
     
  3. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    Да.

    Как получить IDT другого процессора?
     
  4. n0name

    n0name New Member

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

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    WinDbg показывает с первого процессора или как задать с какого процессора показывать содержимое IDT?

    Как исполнить sidt на другом процессоре, есть инструкция для этого? Или только через сис. сервисы?

    Еще вопрос не в тему, кем экспортируется MmCheckSystemImage() ?
     
  6. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    sysexit
    В WinDBG команда ~ позволяет переключать текущие процессоры.
    ~0 - переключение на нулевой, ~1 - на первый и тп.)
    0: kd> означает нулевой
    1: kd> означает первый
    и так далее.
     
  7. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Через DPC можно, вызов KeSetTargetProcessorDpc() тебе поможет.
     
  8. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    Еще вопрос не в тему, кем экспортируется MmCheckSystemImage() ?

    Еще прочел что в текущих 64 битных редакциях Windows используется виртуальная адресация только 48 битами, т.е. я ограничиваюсь виртуальным пространством от

    0x0000000000000000 - 0x0000FFFFFFFFFFFF ?


    livekd показал что в IDT были внесены изменения только после перезапуска livekd.

    А как объясняется это?

    Заменил ISR прерывания 0xFF на пустой. Бсода при вызове из юзермода не вышло.
    Заменил 0x2A, бсод вышел.
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    x64
    Можно есчо использовать извраты с аффинитетом.
    sysexit
    #4.
    Она не экспортируется, а используется системным загрузчиком(MmLoadSystemImage()).

    Если вопрос чисто софтверный(в частности кривой виндбг), то я удалю отсюда этот топик.