сравнить хэндлы

Тема в разделе "WASM.BEGINNERS", создана пользователем LubaEls, 6 июн 2008.

  1. LubaEls

    LubaEls New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2006
    Сообщения:
    17
    подскажите плз, можно ли определить, являются ли 2 хэндла дескрипторами одного и того же объекта.

    Вообще меня интересует именованный ивент.
    Через OpenEvent я получаю его хэндл. А в хуке SetEvent я хочу понять, это хэндл того же ивента или нет.
    На данный момент пользую api-функцайку NtQueryObject, через которую по хэндлу определяю имя и сравниваю. Но это как-то времязатратно.
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Определить адрес обьекта в ядре, если не имеет значение именованный он или нет. NtQuerySystemInformation(SystemHandleInformation) но тоже долго, лучше сделать как ты.
     
  3. LubaEls

    LubaEls New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2006
    Сообщения:
    17
    Да, это наверное вариант.
    Дело в том, что интересующий меня ивент создается в другом процессе.
    И если к тому моменту, как я туда заинжектилась, ивент создан, то я его могу найти по тому же самому имени, перебрав все хэдлы процесса.
    И тогда в хуке SetEvent мне надо будет сравнить именно пришедший хэндл с найденным мною.
    Но, вот если я никого не найду, тады придется проверять имя пока не наткнусь на нужный мне.
     
  4. Clerk

    Clerk Забанен

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

    LubaEls New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2006
    Сообщения:
    17
    В хуке SetEvent мне нужно понять, что это вызывается именно для ивента с именем "BaseNamedObjects\Name1"
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Понятно. Получение имени через NtQueryObject и сравнение оптимальный вариант.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    евент может быть безымянным.
    самое оптимальное это сравнение адресов.
     
  8. Clerk

    Clerk Забанен

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

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Ради интереса проверил скорость исполнения. Аффинитет 11b, приоритет нормальный.
    Вызов в цикле NtQueryObject(ObjectNameInformation) для одного из евентов директории \BaseNamedObjects, число циклов - 800000h, затрачено - 13 секунд.
    Вызов в цикле NtQuerySystemInformation(SystemHandleInformation), число циклов - 2000h, затрачено - 18 секунд.
    Видно что один вызов NtQuerySystemInformation (в секунду примерно 455 раз) выполняется примерно за 2.2 миллисекунды, а один вызов NtQueryObject (в секунду примерно 645277) выполняется примерно за 1.55 микросекунды.
    Вызов NtQueryObject(ObjectNameInformation) выполняется быстрее чем вызов NtQuerySystemInformation(SystemHandleInformation) в 1400 раз.
     
  10. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    С другой стороны, если Event ещё не создан, то можно перехватывать CreateEvent/OpenEvent в целевом процессе до тех пор, пока Event не будет создан.
    С третьей стороны, сравнение чисто по числовому значению хэндла в хуке SetEvent может иметь какой-то смысл только если целевой процесс гарантированно создаёт\открывает этот именованный Event лишь один раз (и ни разу не делает с ним DuplicateEvent). Ведь иначе неизвестно, с использованием какого из хэндлов одного и того же Event'а целевой процесс обратиться к SetEvent.
     
  11. LubaEls

    LubaEls New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2006
    Сообщения:
    17
    Это понятно. Но список хэндлов, указывающих на нужный мне ивент через NtQuerySystemInformation я получаю один раз при инжекте в процесс.
    Естественно, при условии, что в ивент уже создан.

    А NtQueryObject мне придется вызывать каждый раз в хуке SetEvent.

    Но сравнение хэнлов и правдо видать не валидно, т.к. его могут и закрыть, тогда еще надо добавить хук на CloseEvent, и дублировать...

    Поэтому и хотелось идти по схеме:
    OpenEvent ( нужного именованного ивента ) возвращает h1, запонимаю
    хук SetEvent дает h2
    А теперь я хочу знать, дискрипторами одно и того же объекта они являются. При чем быстро:)
     
  12. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Если событие с автосбросом, то можно узнать, что SetEvent был вызван, и при этом с некоторой вероятностью предотвратить получение уведомления целевым процессом:
    В своём процессе создать\открыть нужное событие.
    Создать много-много потоков.
    В каждом созданном потоке вызвать WaitForSingleObject(hEvent);

    Пробуждение какого-либо из потоков говорит о том, что в целевом процессе была вызвана SetEvent.

    Но, конечно, это вероятностный подход - мы не можем знать, что сигнал получит какой-либо из наших потоков, а не целевой процесс. Для этого, собственно, и создаётся много потоков. (Кстати, есть какие-то способы повлиять на выбор потока для пробуждения? Приоритет должен влиять же, да?)
     
  13. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Sol_Ksacap
    Хук нужен для того, чтобы контролировать сигнализацию эвента, а не отслеживания её.
     
  14. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Clerk
    Просто мы сделали предположение, что в данном случае одной может быть достаточно отследить сигнализацию. При этом в случае события с автосбросом мы также получаем некоторую возможность контролировать ситуацию - можем убивать свои потоки и сигнализировать, можем не сигнализировать... Гм, да, "могу копать, могу не копать").
     
  15. LubaEls

    LubaEls New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2006
    Сообщения:
    17
    А мне не нужно вмешиваться в воркфлоу целевого процесса. Мне нужно тока подсматривать.
    И вероятностный подход тоже не катит