Адреса GDT и IDT.

Тема в разделе "WASM.WIN32", создана пользователем n0name, 2 май 2005.

  1. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Использую sgdt/sidt для определения адреса GDT/IDT. Но вот проблема: вызываю 1 раз возвращается норм. значение 8003F400. Вызываю другой раз возвращается другое значение - F9515560. Одно из этих 2х значений. Делал дамп памяти по этим адресам, память различается несколькими байтами.
     
  2. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    Это случаем не под vmware делается ?
     
  3. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    В 98-ой idt меняется, если я ничего не забыл. И тот, кто что-то перехватывает, вынужден обрабатывать сообщения от vmm в своем коде.
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    _BC_, _Chingachguk_: всё происходит в WinXP SP0, чисто под виндой, без эмулятора.
     
  5. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Ну и пусть себе меняется... Ты что делаешь ? Если перехват какого-нибудь int, то раз она меняется, то и тебе придется обработчик какой-то вешать. Так не только я делал, в реальной защите такое видел.
     
  6. Wolfgang

    Wolfgang New Member

    Публикаций:
    0
    Регистрация:
    11 май 2005
    Сообщения:
    82
    Адрес:
    Russia
    А как отследить смену IDT? То есть как при этом получить какое-то уведомление?
     
  7. Nimnul

    Nimnul New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2005
    Сообщения:
    136
    Адрес:
    не Китай
    n0name



    Когда происходит попытка записи в область памяти ядра происходит Copy-On-Write, измененый модуль целиком копируется в область памяти "наглово" процесса.
     
  8. Nimnul

    Nimnul New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2005
    Сообщения:
    136
    Адрес:
    не Китай
    n0name



    Видать то, что ты смотриш меняется...
     
  9. Nimnul

    Nimnul New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2005
    Сообщения:
    136
    Адрес:
    не Китай
    Wolfgang



    1. Хукать исключение(защита от записи)

    2. В цикле смотреть не изменилось ли чего



    2й способ помойму единственный в ринге 3 :)
     
  10. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Ядро меняет соответствующие адреса с помощью lidt, lgdt. Соответственно надо эти комманды поискать и поставить бряки на них, иначе действительно только в цикле ждать изменения.
     
  11. Wolfgang

    Wolfgang New Member

    Публикаций:
    0
    Регистрация:
    11 май 2005
    Сообщения:
    82
    Адрес:
    Russia
    На самом деле на многопроцессорных системах у каждого проца своя таблица IDT. То есть вместо того, чтобы что-то хучить, достаточно определить, каким процом выполняется данный поток.
     
  12. n0name

    n0name New Member

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

    Я сразу не подумал. Вель для Винды это 2 проца.

    Возникает вопрос - для каждого процессора - своя GDT?
     
  13. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    n0name

    ессно
     
  14. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Можно проверить, задав через SetProcessAffinityMask чтобы процесс работал только на первом процессе, другое дело что сомнительно что таблицы IDT разных процессоров так "далеко" друг от друга отстоят, да и на GDT указатель в таком случае не должен менятся.