Многопоточные приложения и хуки

Тема в разделе "WASM.WIN32", создана пользователем Rustem, 4 сен 2007.

  1. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Приветствую

    В общем сабж...Как писать обработчик хука с повторной входимостью

    Допустим хук установлен как:

    FUNC: JMP STUB_ ;сохранили
    FUNC+хх: ;из обработчика исполняем отсюда
    те. снимать хук его не надо.

    Есть две идеи:
    1. Глобальный флаг Занят\Свободен
    2. EnterCriticalSection\LeaveCriticalSection

    Как написать обработчик, если два потока илил более потока одновременно вызывают одну и ту же функцию...
     
  2. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    701
    трамплин ?
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    чтобы не свалить их, замораживаешь и смотришь указывают ли ихний EIP кудато внутрь области, куда пишем джамп. Если да - придется временно разморозить нужные потоки, чтобы ни один из них в конце концов не выполнял код в этой области. после этого смело пишем джамп на буфер, в котором сохранено начало функции и джамп на продолжение и размораживаем потоки
     
  4. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    sl0n Да, точно, трамплин
     
  5. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Great а как узнать EIP?
     
  6. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Rustem
    GetThreadContext?
     
  7. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    А если просто весь стаб обернуть

    EnterCriticalSection\LeaveCriticalSection???
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Rustem
    от этого не исчезнет необходимость чекать EIP всех потоков на предмет попадания в область кода, куда будет записан джамп
     
  9. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Rustem
    Не понял. Вам нужно сделать хук и Вы боитесь, что в это время на этом месте будет исполняться поток? Обычно проблемы с несколькими потоками возникают если они могут использовать один и тот же ресурс одновременно. В Вашей постановке вопроса этого не наблюдается.
     
  10. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Mental_Mirror нет, я боюсь, что к одному обработчику хука обратятся с разных потоков...
     
  11. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Rustem
    А что в этом страшного?
     
  12. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Mental_Mirror ну например обработчик:

    pop ret_addr; сохранили в глоб. перем адр. возврата
    pushad
    pushfd
    ;что то делаем с параметрами или типа того
    popfd
    popad
    call function ;вызвали функцию
    pushad
    pushfd
    ;если надо опять делаем, например с возвр. значением
    popfd
    popad
    push ret_addr
    ret; возвращаемся в вызываемое приложение

    Если одновременно обратятся, то ret_addr будет содержать значение последней функции..прога упадет
     
  13. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Rustem
    Если брать именно этот пример, то тут сохранение адреса возврата в глобальной переменной явно синтетично, т.к. можно адрес возврата и так сохраняется в стеке и RET'ом оттуда достается. По теме - проблема классическая и нужно использовать стандартные Win32 механизмы синхронизации, о некоторых из них было упомянуто выше.