Здрасти. Задача следующая. Имеется код, использующий критические секции(кс далее) без спин-блокировок. Ссылка на кс является константой. Тоесть имеется непосредственный адрес кс, который передаётся в RtlEnterCriticalSection(), например: Код (Text): LdrlockLoaderLock: push offset ntdll.LdrpLoaderLock ... call ntdll.RtlEnterCriticalSection Необходимо мониторить вход в потоков в кс, тоесть при входе в кс должен получить управление наш колбек. Пайлод - маршрутизация, например: Код (Text): CreateProcess: ... LoadLibrary() --- LoadLibrary: ... LdrLoadDll() --- LdrLoadDll: ... LdrLockLoaderLock() Тоесть получив управление при входе в кс, мы выполним откат функции - найдём её стековый фрейм и заменим адрес возврата(S-маршрутизация), переключим поток на изменённую копию образа(W-маршрутизация). После этого мы сможем перезапустить апи. Это получение управление при её вызове. Цель - движок, который будет получать на вход ссылку на кс, выполнять некоторые манипуляции, после которых зарегистрированный колбек будет получать управление при возврате из RtlEnterCriticalSection(). Требования: 1. Минимальный размер. Это значит что IDP не приемлимо для использования, как и дизасмы графы етц. 2. Не должно быть рассинхронизация в многопоточной среде. 3. Никакой порчи системного кода. 4. Нет нагрузки на процессор. Никаких спин-блокировок и подобных цикличных ожиданий. 5. Освобождение кс должно нормально работать(RtlLeaveCriticalSection()). 6. Не должно быть привязки к контексту определённого потока, в частности HWB. 7. Кс расположена среди прочих переменных, нельзя блокировать страницу. 8. Поддержка рекурсивных вызовов. Предлагайте ваши идеи.
Инде, судя по тому как вы любите всякие грязные хаки, возможно предположить что ключ к разгадке лежит в инвалидации указателя DebugInfo с последующим отловом исключений Т.е. : 1) Захват КС 2) Инвалидация DebugInfo 3) Отлов исключений
7mm Нарушает условие п.1. Если использовать IDP, то нет необходимости выполнять многие хитрые манипуляции. Так как инструкция повторно перезапускается, а это требует перенаправление на другой сегмент, либо полноценного эмулятора, а это тяжёлый код. Можно конечно откатать функцию. Да и только этой ссылки не достаточно, так будут пропущены многие вызовы.
klzlk mov CritSect.LockSemaphore,-3 and NOT(1) Меняет на mov CritSect.LockSemaphore, dword ptr[Cs2ndDispatch] После чего валидируем память на провеку валидности и первых байт колбека, имхо движок получится..
shchetinin Зачем ? Cs2ndDispatch() вызывается при возврате из RtlEnterCS и RtlLeaveCS, при этом передаём ссылку на кс, расположенную по другому адресу(копия кс) и рестартуем функу. Для множества кс следует создать таблицу. В коде есть недостатки - нет определения причины вызова(Enter/Leave) и не восстанавливаются RGP(Ebx, Esi и Edi), но это элементарно допиливается.
klzlk А давай усложним, вот намример ты не чего про структуру не знаешь ... То и есть скажем надо провернуть тоже самое но только с event, а со свездочкой будем считать что сможешь ассоциировать CloseHandle(так как некоторые чуваки, которые пишут на скриптах(думаю понял о ком я) про ось не чего не знают, и не знаю как отмониторить лики объектов ) . Использовать дизасм и патчить функции нельзя так как они не смогут понять что ты написал ( в силу того что они в ходят в секту срипто-бабистны с титулом третиго отдельного особого конного полка, чапаевской девизии ... ) ??? Кодеса не надо просто опиши словами... конечно если получится...
shchetinin Эти функции работают не с кс, а с ядерными обьектами. Описатель такого обьекта в ядре находится, это не юзермодная структура.