загрузка проца 100% при понижении irql

Тема в разделе "WASM.NT.KERNEL", создана пользователем shinigami1, 5 апр 2010.

  1. shinigami1

    shinigami1 New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2010
    Сообщения:
    22
    Всем привет, решил я попрактиковаться и захукал ф-цию ZwDeleteKey

    код обработчика:

    Код (Text):
    1. NTSTATUS RegDirDefender(IN HANDLE key)
    2. {
    3.  
    4.    PKEY_BASIC_INFORMATION keyinfo;
    5.    ULONG data;
    6.    UNICODE_STRING uname;
    7.    ANSI_STRING name;
    8.    KIRQL Irql;
    9.      
    10.     __try
    11.     {
    12.             currentIrql = KeGetCurrentIrql();
    13.  
    14.             if(currentIrql!= PASSIVE_LEVEL)
    15.             {
    16.          KeLowerIrql(PASSIVE_LEVEL);  
    17.             }  
    18.      
    19.       ZwQueryKey(key,KeyNameInformation,NULL, 0,&data);  
    20.              keyinfo = ExAllocatePool(PagedPool,data);
    21.              ZwQueryKey(key,KeyNameInformation,keyinfo,data,&data);
    22.      
    23.       RtlInitUnicodeString(&uname,keyinfo->Name);
    24.       RtlUnicodeStringToAnsiString(&name,&uname,TRUE);
    25.    
    26.      if(strstr(name.Buffer,"lalala")!=0)
    27.      {
    28.  
    29.                        ExFreePool(keyinfo);
    30.         RtlFreeAnsiString(&name);
    31.        
    32.                       KeRaiseIrql(Irql,&Irql);
    33.        
    34.                       return STATUS_ACCESS_DENIED;
    35.     }
    36.    
    37.           ExFreePool(keyinfo);
    38.           RtlFreeAnsiString(&name);
    39.    
    40.           KeRaiseIrql(Irql,&Irql);
    41.    
    42.           return OldDelDir(key);
    43.    }
    44.     __except(EXCEPTION_EXECUTE_HANDLER)  
    45.     {
    46.         return STATUS_UNSUCCESSFUL;
    47.     }
    48. }
    При загрузке драйвера проц загружается на 100%! Если убрать снижение IRQL то всё становится нормально, но появляются переодические бсоды из-за того что ZwQueryKey /ExAllocatePool выполняются на PASSIVE_LEVEL. Подскажите, как корректно уменьшить IRQL?
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    shinigami1
    Запрещено понижать IRQL ниже текущего уровня. Доставляйте DPC на высоких IRQL.
     
  3. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Ошибка в хуке. Callers of ZwDeleteKey must be running at IRQL = PASSIVE_LEVEL поэтому условие currentIrql!= PASSIVE_LEVEL в нормальной работе не выполняется.
     
  4. shinigami1

    shinigami1 New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2010
    Сообщения:
    22
    То есть я должен просто запихнуть обработчик в DPC очередь, я правильно понял?
     
  5. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Ты должен прочитать мануал и понять что никто в здравом уме не вызывает перехватываемую функцию на повышенном IRQL
     
  6. shinigami1

    shinigami1 New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2010
    Сообщения:
    22
    понятно, убрал вообще понижение IRQL, видимо ошибка где-то в коде.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    shinigami1
    KeRaiseIrql тоже убери. и вообще не трогай ты его. тебе не надо.
    а код ужасен. нигде не чекаются возвращемые значения.
    может все-таки ты захукал NtDeleteKey?;)
     
  8. shinigami1

    shinigami1 New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2010
    Сообщения:
    22
    Great, я всё исправил уже, ошибка была в в том, что ExAllocatePool возвращал NULL частенько, надо делать проверку, а с ZwDeleteKey и NtDeleteKey, я сначала думал это одно и тоже :).
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    shinigami1
    Какой есчо IRQL, там можно юзать только на PASSIVE/APC, какие пулы ??
     
  10. shinigami1

    shinigami1 New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2010
    Сообщения:
    22
    Clerk, NtDeleteKey. Я же сказал, я думал это одно и тоже
     
  11. eagersh

    eagersh New Member

    Публикаций:
    0
    Регистрация:
    4 дек 2009
    Сообщения:
    2
    Самый безопасный метод выполнять что либо на гарантированном PASSIVE_LEVEL это создать или work item или System Thread.
     
  12. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    будет бсодить, никто не гарантирует, что Buffer null-terminated.