Hook API + многопоточность

Тема в разделе "WASM.WIN32", создана пользователем seeQ, 14 дек 2006.

  1. seeQ

    seeQ New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2003
    Сообщения:
    71
    Всем добрый день.
    Проблема в следующем. Есть код (Ring 3) перехватывающий с десяток NTxxx функций. В некоторых перехватчиках используются локальные переменные. Соответственно возможна ситуация, когда в многопоточном приложении во время работы перехватчика другой поток вызовет этот же перехватчик, что может привести к изменениям в локальных переменных.
    Первое, что приходит в голову, это останавливать все потоки при работе перехватчика, либо использовать CriticalSections. Какой из этих методов предпочтительней использовать? Может есть еще подводные камни?
    P.S У меня на обычном селероне все и так работает. Пробовал перехват на последней версии Themida - все окей. Но есть еще такие звери как Core2 Duo, HyperTreading, многопроцессорные компьютеры… Вот тут и могут быть проблемы.
     
  2. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    критические секции, имхо, предпочтительнее... можно также реализовать синхронизацию с использлванием обьектов ядра (мютексов, событий, етц)
     
  3. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    А локальные переменные, случаем, не в стеке потока создаются?
     
  4. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    локальные переменные? это которые объявлены внутри функции?
    они и так свои для каждого потока
     
  5. seeQ

    seeQ New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2003
    Сообщения:
    71
    Извиняюсь, не правильно выразился. Не локальные переменные, а вот такие:


    Код (Text):
    1.    
    2.  
    3. ;Код заполняющий LUD_Handle, Zw_rvalue2
    4.  
    5. jmp @F
    6.  
    7. Zw_name2        db 'LdrUnloadDll:   Handle :'
    8. LUD_Handle      dq ?   
    9. LUD_Result      db '  Result : '
    10. Zw_rvalue2      dq ? ,0h                    ;Buffer for save results
    11.  
    12. @@:
    13.     ;******[Writing Acii string to File]*******
    14.     lea eax,[EBP+Zw_name2]
    15.     push eax
    16.     call _write2file
    Под переменными подразумеваются LUD_Handle, Zw_rvalue2. Сам код является базовонезависимым. Это кусок кода перехватчика LdrUnloadDll.
     
  6. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    "Останавливать все потоки" - а если хукаешь блокирующую функцию (а тем более, с разблокировкой в другом потоке)? + возможны гонки и взаимоблокировки.
    "использовать CriticalSections" - в дополнение к предыдущему, бока будут при (неявной) рекурсии. ХЗ может в NTxxx функциях ее и нет, но такую гарантию тебе никто не даст.
    ЗЫ: Локальные переменные, тут не причем, можешь их юзать сколько душе угодно, для каждой функции они свои. Траблы с потоками у тебя возникнут минимум в 3-х других местах.
     
  7. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Сколько всего добавилось :)
    seeQ
    В твоем, как частном примере, можешь использовать КС, лишь бы _write2file, не вызвал в итоге хукаемую :) функцию.
    ЗЫ: Все равно минимум 3 других бока связанные с многопоточностью остаются, и советую подумать о них :)
     
  8. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    не будет ничего
     
  9. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Nouzui
    Это как понять? Вообще я писал, до того как увидел пример с кодом. Исходя из первоначальных объяснений трудно понять какой участок кода берется в критическую секцию, поэтому и ответил для общего случая когда весь хук будет в КС. Для частного, т.е. примера, все ОК.
     
  10. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    здорово у меня "не" инвертировалась )
    а что касается КС, то они не блокируют поток при повторном вхождении, только потом нужно будет освободить секцию столько же раз, сколько раз она была занята
     
  11. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Nouzui
    Код (Text):
    1. Объект Относительная скорость Доступ нескольких процессов Подсчет числа обращений к ресурсу Платформы
    2. Критическая секция быстро Нет Нет (эксклюзивный доступ) 9x/NT/CE
    3. Мьютекс медленно Да Нет (эксклюзивный доступ) 9x/NT/CE
    4. Семафор медленно Да Автоматически 9x/NT
    5. Событие медленно Да Да 9x/NT/CE
    Кто-то что-то путает, критические секции не считают даже в теории синхронизации у Таненбаума.
     
  12. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    _Serega_
     
  13. seeQ

    seeQ New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2003
    Сообщения:
    71
    ого, понеслась :)
    Я решил отказаться от замораживания потоков и от КС.
    Раз не было у меня локальных переменных, то теперь будут, соответственно и возможные проблемы должны таким способом решиться.

    Нда.. заинтриговал.
     
  14. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Nouzui
    Некоторые АПИ функции, (шелловские в основном, но есть пара например ДбжБреак+ЕхитТнреад), любят создавать потоки и ждать резалта от потока. Если хукнуть подобную, и одну из тех которые вызывает вновь созданный поток, это будет как раз искомый бок.
     
  15. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    seeQ
    Ты ведь не написал чем хукаешь... если подменой ДЛЛ, то эти три случая снимаются :)
     
  16. seeQ

    seeQ New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2003
    Сообщения:
    71
    базово-независимый код+ сплайсинг.
     
  17. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    прив, seeQ
    если нужно - могу потестить твой код на своём Core2 Duo