Deadlock в LdrGetProcedureAddress

Тема в разделе "WASM.WIN32", создана пользователем ntdrivers, 26 фев 2011.

  1. ntdrivers

    ntdrivers New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2010
    Сообщения:
    25
    Загружаю в winlogon свою dll и устанавливаю хуки на множестве функций из kernel32.dll. Хуки при необходимости загружают еще одну dll, вызывая LdrLoadDll / LdrGetProcedureAddress. Проблема в том, что в 50% случаев при вызове из хука LdrGetProcedureAddress поток зависает (управление из этой функции не возвращается). Подозреваю что мой хук был вызван при инициализации одной из множества загружаемых винлогоном dll, и получается я делаю загрузку dll из DllMain, что Microsoft делать не рекомендует. На какие системные объекты синхронизации воздействуют LdrLoadDll / LdrGetProcedureAddress? Может быть проверять их состояние перед вызовом LdrLoadDll / LdrGetProcedureAddress?

    PS: Могу конечно и сам реализовать LdrGetProcedureAddress, но имхо это временное решение: в будущем аналогичные проблемы могут возникнуть и с LdrLoadDll.
     
  2. Ladr

    Ladr New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2009
    Сообщения:
    17
    Поставить хук на LdrLoadDll:

    LdrLoadDllHook:
    InterlockedIncrement( &LdrLoadDllCalled ) (InterlockedIncrement <=> TlsSetValue)
    OrigLdrLoadDll(...)
    InterlockedDecrement( &LdrLoadDllCalled )

    И проверять значение переменной LdrLoadDllCalled в других "небезопасных" хуках
    Или подгружать нужные dll заранее а не по срабатыванию определенного условия