Немного изврата :)

Тема в разделе "WASM.ASSEMBLER", создана пользователем Mika0x65, 28 окт 2006.

  1. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Мое почтение всем.

    Пришла в голову мысль немного поизвращаться -- "протащить" в Win, например, свой сегмент, например, во время загрузки. Осуществить желаемое решил так: получить управление до boot-загрузчика Win, установить свой обработчик прерывания 0x1 (он жил по адресу 0x0:0x600), выставить флаг TF и передать управление оригинальному загрузчику. В самом обработчике смотреть на след. команду -- если это 'popf(d)', устанавливать в стеке выполнявшегося кода флаг TF (чтобы не снять трассировку раньше времени), а также ждать 'lgdt', чтобы поправить GDT как мне хочется. Когда lgdt найдена -- флаг TF можно снять. Все это я сделал, правда, добавить свой сегмент не получится без глобальных перестановок -- сразу за GDT идет IDT. Интереса ради попробовал уменьшить кол-во сегментов -- вычел из поля GDT_SIZE 0x8. Эти изменения тоже "не дожили". Натравил на NTLDR IDA -- NTLDR проделывает несколько операций с GDT. Но. Если он проделывает операции с GDT "по-умному", используя 'sgdt' и не считая размер GDT константой, то должно получиться. Беда в том, что в NTLDR содержит смешанный код 16/32 и дизассемблировать его трудно. Средств автоматизировать это дело, думаю, нет.

    М.б. кто-то разобрался с NTLDR более детально? Или я что-то не учел, вылавливая 'lgdt' и меняя ее параметер? Или еще какой-нибудь способ есть править GDT без драйвера?
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    А смысл сего извращения в чем состоит?
     
  3. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Если честно, просто интересно. Ну, +это даст возможность получать доступ к нулевому кольцу без драйвера, например. Тут уж кто во что горазд :).
     
  4. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    я делал так
    находил форматтер таблицы страниц и все страницы делал USER
    NT4 грузилась и работала, был доступ ко всему ядру напрямую из ring3
    правда падала через какое-то время в синьку
     
  5. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    До такого не додумался, если честно. Вариант с GDT казался самым простым, но оказался не рабочим. А подобное на 2K/XP не пробовали? Просто интересно, будет ли BSOD?
     
  6. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    нет но ntldr вобще мало изменяли насколько я знаю

    100% будет но загрузиться и поработать минут 5 должон
    я сам был когда-то удивлен тем что защита памяти ядра защищает от багов а не чего-то другого
     
  7. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Код (Text):
    1. void MempCopyGdt()
    2. {
    3.         static xdtr_t gdtr,idtr;
    4.         idt_gate* a;
    5.  
    6.         __asm   sgdt    gdtr
    7.         __asm   sidt    idtr
    8.  
    9.         if (gdtr.addr + gdtr.limit + 1 != idtr.addr)
    10.         {
    11.                 BlPrint("ERROR - GDT and IDT are not contiguous!\n");
    12.                 BlPrint("GDT - %lx (%x)  IDT - %lx (%x)\n",gdt.addr,gdt.limit,id
    13. t.addr,idt.limit);
    14.                 for (;;) ;
    15.         }
    16.         esi = (gdtr.addr + gdtr.limit + 0x1001)>>12;
    17.         edi = FwAllocateHeapPermanent(esi);
    18.         if (!edi) return 0x10;
    19.         memmove(edi, gdtr.addr, esi<<12);
    20.         gdtr.addr = edi;
    21.         idtr.addr = edi + gdtr.limit + 1;
    22.         a = (idt_gate*)idtr.addr;
    23.         a[1].offset_1 = (USHORT)(ULONG)&BdTrap01;
    24.         a[1].offset_2 = (USHORT)((ULONG)&BdTrap01 >> 16);
    25.         a[3].offset_1 = (USHORT)(ULONG)&BdTrap03;
    26.         a[3].offset_2 = (USHORT)((ULONG)&BdTrap03 >> 16);
    27.         a[0xD].offset_1 = (USHORT)(ULONG)&BdTrap0d;             // 0xD = #GP
    28.         a[0xD].offset_2 = (USHORT)((ULONG)&BdTrap0d >> 16);     // General Prot
    29.         a[0xE].offset_1 = (USHORT)(ULONG)&BdTrap0e;             // 0xE = #PF
    30.         a[0xE].offset_2 = (USHORT)((ULONG)&BdTrap0e >> 16);     // Page Fault
    31.         a[1].sel = 8;
    32.         a[1].type = 0x8E00;     // 32-bit interrupt gate, DPL=0, Present=1
    33.         a[3].sel = 8;
    34.         a[3].type = 0x8E00;
    35.         a[0xD].sel = 8;
    36.         a[0xD].type = 0x8E00;
    37.         a[0xE].sel = 8;
    38.         a[0xE].type = 0x8E00;
    39.         a[0x2D].offset_1 = (USHORT)(ULONG)&BdTrap2d;
    40.         a[0x2D].sel = 8;
    41.         a[0x2D].type = 0x8E00;
    42.         a[0x2D].offset_2 = (USHORT)((ULONG)&BdTrap2d >> 16);
    43.  
    44.         __asm   lgdt    gdtr
    45.         __asm   lidt    idtr
    46.  
    47.         BdInitDebugger(OsLoaderName,OsLoaderBase,0);
    48.         return 0;
    49. }
     
  8. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    diamond

    Не совсем понятно, что за ф-ия "BdInitDebugger"? MSDN молчит, Google вообще ни одной ссылки не вернул... И почему процессор разрешает делать lgdt/lidt с третьего кольца?
     
  9. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Mika0x65
    Это не код 3-кольца, а декомпилированный фрагмент части ntldr. Который как раз и отвечает за копирование и загрузку GDT/IDT.
     
  10. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    diamond
    Вот как. Если не секрет, откуда? Т.е. это работа какого-то декомпилятора (если да, то какого?) или же фрагмент из source?
     
  11. BUGOR

    BUGOR New Member

    Публикаций:
    0
    Регистрация:
    14 авг 2005
    Сообщения:
    44
    Вероятно кусок из пакета Win2k_OpenSource :)
     
  12. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    BUGOR
    Не угадал :) В пробегавших какое-то время назад исходниках 2k загрузчика нету.
    Mika0x65
    Это работа мозга, которому помогала IDA. Ещё некоторые процедуры из OsLoader - 32-битной части ntldr - декомпилированы и находятся на http://diamondz.land.ru/osloader.7z