Безопасный перехват/снятие перехвата СДТ

Тема в разделе "WASM.NT.KERNEL", создана пользователем billi12, 18 окт 2011.

  1. billi12

    billi12 New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    44
    Установку перехвата делаю путем прямой записи в таблицу. Общий вид функции перехвата примерно такой:

    нтстатус хукКреэтФайл(трололо)
    {
    количество_выполняющихся_перехваченных_вызовов++;- спомощью InterlockedIncrement
    результат=(вызов оригинала);
    количество_выполняющихся_перехваченных_вызовов--; - спомощью InterlockedDecrement
    ретерн результат;
    }

    Так вот после снятия хуков такой же простой записью в таблицу, остаются активными некоторые вызовы. Это я узнаю по ненулевому значению (количество_выполняющихся_перехваченных_вызовов). Чем дольше система в захуканом состоянии, тем больше накапливается этих вызовов. С течением времени эти вызовы неохотно, но завершаются. Если не выгружать драйвер,то все окей, все отлично продолжает работать. Если выгружаю - пара действий и привет бсод.

    Каким образом выполняются системные вызовы, что им нужно наличие в памяти моих хук-функций? Я так понимаю, их код не грузится в процессы, которые запрашивают эти вызовы. Неужели они не подружаются куда-то для выполнения?

    Как сделать чтоб после снятия хука, пожно было спокойно выгрузить драйвер? Спасибо.
     
  2. 100gold

    100gold New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2010
    Сообщения:
    165
    После того ка вызов возвращает результат
    поток попадает обратно в твою функцию, которой уже нет

    Вместо
    Код (Text):
    1.   результат=(вызов оригинала);
    2.   ретерн результат;
    использовать
    Код (Text):
    1.   пуш параметерс
    2.   пуш оригиналретурнадрес
    3.   джэмпэ оригиналфанкшон
     
  3. billi12

    billi12 New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    44
    Спасибо. Я думал это тоже не подойдет.
     
  4. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    billi12
    Поробуй это почитать: http://wasm.ru/forum/viewtopic.php?id=36022
     
  5. billi12

    billi12 New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    44
    Т800, спс, но не понял местами че делает. Если можешь, объясни кратенько какое значение имеет IRQL. Я читал, знаю про диспатч лэвэл, аппаратные, знаю что их в винде под 30, но целостной картины не сложилось.

    Про

    пуш параметерс
    пуш оригиналретурнадрес
    джэмпэ оригиналфанкшон

    Ведь после входа в мою хук-функцию, в стэке уже будут все переданные параметры, нужный адрес возврата. Почему я не могу сделать джамп сразу на оригинал? Объясните плиз.
     
  6. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    billi12
    Ну это ещё почитай: http://wasm.ru/forum/viewtopic.php?id=35946
     
  7. 100gold

    100gold New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2010
    Сообщения:
    165
    Ну да, если с параметрами ничего не делаешь, то можно пользоваться тем что уже есть в стеке.
     
  8. billi12

    billi12 New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    44
    Блин, нифига не получается. Если пуш адрес + рет - неверное обращение к памяти. Если джамп адрес - бсод(