hall.dll и KeGetCurrentIrql

Тема в разделе "WASM.NT.KERNEL", создана пользователем PaCHER, 16 июн 2009.

  1. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    Есть следующая задача, необходимо получить адрес функции KeGetCurrentIrql не используя апи.
    Были опробованы следующие способы:
    1) Через парсинг экспорта хала, база хала получалась через парсинг импорта ntoskrnl.exe т.к. импорт находится в .init этод метод не оправдался.
    2) Была попытка рипнуть код функции из хала выше системы w 2003 sp2 код функции mov al,b[FS:0x24] в хп код функции который тоже можна рипнуть, но интересует вариант универсального решения.

    Если у кого есть соображения по универсальному нахождения базы hall.dll или по 2ому пункту буду рад выслушать возможные варианты.
     
  2. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    LDR_DATA_TABLE_ENTRY ?
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    KeGetCurrentIrql экспортируется ведь. Заюзать чтонибудь типа MmGetSystemRoutineAddress(), эта в экспорте ядра есть, или самому реализовать.
     
  4. AntiFreeze

    AntiFreeze Дмитрий

    Публикаций:
    0
    Регистрация:
    26 июн 2008
    Сообщения:
    65
    Всё намного проще.
    Код (Text):
    1. movzx eax,word ptr fs:[0x24]
     
  5. AntiFreeze

    AntiFreeze Дмитрий

    Публикаций:
    0
    Регистрация:
    26 июн 2008
    Сообщения:
    65
    Или тут какой-то другой тайный смысл, зачем её искать?
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    AntiFreeze
    Может таблица для отображения IRQL на вектора прерываний нужна(HalpVectorToIRQL).
     
  7. AntiFreeze

    AntiFreeze Дмитрий

    Публикаций:
    0
    Регистрация:
    26 июн 2008
    Сообщения:
    65
    Может. Для того, чтобы не гадать, надо задачу конкретнее ставить.
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    AntiFreeze
    А вам какая разница, задача поставлена чётко - найти экспорт.
     
  9. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    функа MmGetSystemRoutineAddress вызывается только на пассив левеле а откуда мы узнаем текущий левел если мы еще хал ненашли.
     
  10. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    кста в для каких версий вин этот способ
    movzx eax, b_p [fs:KPCR.Irql]
    может заменить вызов
    KeGetCurrentIrql
     
  11. AntiFreeze

    AntiFreeze Дмитрий

    Публикаций:
    0
    Регистрация:
    26 июн 2008
    Сообщения:
    65
    doctor_Ice, работает во всех от Win 2000 до 7.
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    doctor_Ice
    Вот оно - привязанность к среде и компилятору, иначе такой вопрос возникнуть не может, во первых KPCR/KPRCB содержат много информации, далее и ядерные структуры следующие отсюда(ETHREAD etc). А чтобы найти в памяти модуль либо экспорт в нём вовсе не нужен никакой сторонний функционал. Также незачем текущий IRQL определять обычно, ибо известно где код, откуда он вызывается и на каком IRQL. На крайний случай можно из APIC считать(TPR).
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    я не видел, чтобы изменялся когда-либо массив HalpVectorToIRQL
    аналогично я не видел, чтобы менялся маппинг регистров APIC - FFFE0000
    Смещение регистра TPR фиксировано и равно 80h
    соответственно,
    Код (Text):
    1. mov eax, [0xFFFE0080]
    2. shr eax, 4
    3. movzx eax, byte [HalpVectorToIRQL + eax]
    4. ret
    есть, конечно, хал без апик, но таких машин я никогда не видел. один раз на виртуалке (почему-то) оказался хал без apic.
     
  14. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    бывает так что код выполняется в случайном месте в р0 и в случайный момент. =)))
     
  15. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    тоже такое наблюдал и хочу чтобы код работал и на виртуалке тоже.
     
  16. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    А вот интересно, где-то сделают cli, какой IRQL покажет KeGetCurrentIrql и какой он будет на самом деле? ;)
     
  17. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    J0E
    0xFF
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Clerk
    KeGetCurrentIrql вернет текущий иркл, который был до CLI.
    А вот если при выключенных прерываниях происходит ошибка страницы, _KiTrap0E явно проверяет EFL.IF==0 и в этом случае в KeBugCheckEx передает соотв. параметр FF
    Код (Text):
    1.   KIRQL Irql;
    2.  
    3.   KeRaiseIrql (DISPATCH_LEVEL, &Irql);
    4.  
    5.   __asm cli;
    6.   KdPrint(("Raised to Dispatch, previous %d, current %d\n", Irql, KeGetCurrentIrql()));
    7.   __asm sti;
    8.  
    9.   KfLowerIrql (Irql);
     
  19. AntiFreeze

    AntiFreeze Дмитрий

    Публикаций:
    0
    Регистрация:
    26 июн 2008
    Сообщения:
    65
    DbgPrint на DISPATCH_LEVEL может вызвать BSOD :-D
     
  20. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    AntiFreeze
    Ой да ладно?

    DbgPrint and DbgPrintEx can be called at IRQL<=DIRQL. However, Unicode format codes (%wc and %ws) can be used only at IRQL PASSIVE_LEVEL. Also, because the debugger uses interprocess interrupts (IPIs) to communicate with other processors, calling DbgPrint at IRQL>DIRQL can cause deadlocks.