Критические секции.

Тема в разделе "WASM.WIN32", создана пользователем klzlk, 20 июл 2011.

  1. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    Здрасти.
    Задача следующая. Имеется код, использующий критические секции(кс далее) без спин-блокировок. Ссылка на кс является константой. Тоесть имеется непосредственный адрес кс, который передаётся в RtlEnterCriticalSection(), например:
    Код (Text):
    1. LdrlockLoaderLock:
    2.     push offset ntdll.LdrpLoaderLock
    3.     ...
    4.     call ntdll.RtlEnterCriticalSection
    Необходимо мониторить вход в потоков в кс, тоесть при входе в кс должен получить управление наш колбек. Пайлод - маршрутизация, например:
    Код (Text):
    1. CreateProcess:
    2.     ...
    3.     LoadLibrary()
    4. ---
    5. LoadLibrary:
    6.     ...
    7.     LdrLoadDll()
    8. ---
    9. LdrLoadDll:
    10.     ...
    11.     LdrLockLoaderLock()
    Тоесть получив управление при входе в кс, мы выполним откат функции - найдём её стековый фрейм и заменим адрес возврата(S-маршрутизация), переключим поток на изменённую копию образа(W-маршрутизация). После этого мы сможем перезапустить апи. Это получение управление при её вызове.
    Цель - движок, который будет получать на вход ссылку на кс, выполнять некоторые манипуляции, после которых зарегистрированный колбек будет получать управление при возврате из RtlEnterCriticalSection().
    Требования:
    1. Минимальный размер. Это значит что IDP не приемлимо для использования, как и дизасмы графы етц.
    2. Не должно быть рассинхронизация в многопоточной среде.
    3. Никакой порчи системного кода.
    4. Нет нагрузки на процессор. Никаких спин-блокировок и подобных цикличных ожиданий.
    5. Освобождение кс должно нормально работать(RtlLeaveCriticalSection()).
    6. Не должно быть привязки к контексту определённого потока, в частности HWB.
    7. Кс расположена среди прочих переменных, нельзя блокировать страницу.
    8. Поддержка рекурсивных вызовов.

    Предлагайте ваши идеи.
     
  2. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.186
    Адрес:
    подполье
    /me собрался было ответить, но, передумав, лег на грядку ко всем остальным.
     
  3. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Инде, судя по тому как вы любите всякие грязные хаки, возможно предположить что ключ к разгадке лежит в инвалидации указателя DebugInfo с последующим отловом исключений ;) Т.е. :
    1) Захват КС
    2) Инвалидация DebugInfo
    3) Отлов исключений
     
  4. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    7mm
    Нарушает условие п.1. Если использовать IDP, то нет необходимости выполнять многие хитрые манипуляции. Так как инструкция повторно перезапускается, а это требует перенаправление на другой сегмент, либо полноценного эмулятора, а это тяжёлый код. Можно конечно откатать функцию. Да и только этой ссылки не достаточно, так будут пропущены многие вызовы.
     
  5. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    OK, возможно создаём условия для возникновения STATUS_POSSIBLE_DEADLOCK + отлов?
     
  6. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    7mm
    Межпоточная синхронизация не пострадает от этого ?
     
  7. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Инде, да не томи, давай концепт-сурец, сообщество заценит ;)
     
  8. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    RTL_CRITICAL_SECTION::LockSemaphore - смелых ждет удача.
     
  9. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    И что с семафором?..
     
  10. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    7mm
    У кс хитрая реализация ;)

    shchetinin
    Получите пряник.
     
  11. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Ну, я смотрел как сделано в ReactOS :)))
     
  12. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    klzlk
    mov CritSect.LockSemaphore,-3 and NOT(1)

    Меняет на
    mov CritSect.LockSemaphore, dword ptr[Cs2ndDispatch]

    После чего валидируем память на провеку валидности и первых байт колбека, имхо движок получится..
     
  13. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    shchetinin
    Зачем ?
    Cs2ndDispatch() вызывается при возврате из RtlEnterCS и RtlLeaveCS, при этом передаём ссылку на кс, расположенную по другому адресу(копия кс) и рестартуем функу. Для множества кс следует создать таблицу.
    В коде есть недостатки - нет определения причины вызова(Enter/Leave) и не восстанавливаются RGP(Ebx, Esi и Edi), но это элементарно допиливается.
     
  14. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    klzlk
    Быть может, но я таки ми вещами не занимаюсь, я пишу на HTML:)
     
  15. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    klzlk
    А давай усложним, вот намример ты не чего про структуру не знаешь ... То и есть скажем надо провернуть тоже самое но только с event, а со свездочкой будем считать что сможешь ассоциировать CloseHandle(так как некоторые чуваки, которые пишут на скриптах(думаю понял о ком я) про ось не чего не знают, и не знаю как отмониторить лики объектов ) . Использовать дизасм и патчить функции нельзя так как они не смогут понять что ты написал ( в силу того что они в ходят в секту срипто-бабистны с титулом третиго отдельного особого конного полка, чапаевской девизии ... ) ???
    Кодеса не надо просто опиши словами... конечно если получится...
     
  16. nevminoz

    nevminoz New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2011
    Сообщения:
    2
    shchetinin
    тонко
     
  17. phoukait

    phoukait New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2011
    Сообщения:
    43
    shchetinin
    Сам то понял что написал ?
     
  18. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    CreateEvent(OpenEvent) vs CloseHandle
     
  19. phoukait

    phoukait New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2011
    Сообщения:
    43
    shchetinin
    Эти функции работают не с кс, а с ядерными обьектами. Описатель такого обьекта в ядре находится, это не юзермодная структура.
     
  20. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    phoukait
    Так в этом вся и сложность.