Хук вырубает звук

Тема в разделе "WASM.NT.KERNEL", создана пользователем Hippey, 16 фев 2012.

  1. Hippey

    Hippey New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2011
    Сообщения:
    49
    Здравствуйте!

    Есть драйвер, который защищает процесс, устанавливая хука с помощью obregistercallbacks, но вот программа, процесс который защищен, не может воспроизводить звук, вообще нет звука. Как я понимаю главный в этом деле процесс audiodg, как в драйвере можно понять что именно он пытается получить хендл, а не какой-нибудь другой левый процесс? Можете ткнуть в лицо кодом?:) два дня уже пытаюсь исправить, не получается, пробовал доставать название процесса, но не получалось.

    Спасибо!
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Тебе что, "руководство по написанию проактивок, для чайников" надо?
    Обычно, разработчики антивирусов решают эту проблему базой доверенных процессов.

    Чувак, тебе уже всю матчасть написали в соседней теме, пора бы уже, чтобы получалось.
     
  3. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    Я же уже в каком то твоём топике говорил, что для audiodg.exe нужно позволять отрывать хендл защищаемого процесса!
    ------
    Вот мой пост: http://wasm.ru/forum/viewtopic.php?pid=462222#p462222
     
  4. Hippey

    Hippey New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2011
    Сообщения:
    49
    Спасибо за помощь, сначало решил проверять процесс по имени процесса audiodg.exe, но почему-то не получается, мой код не может отличить audiodg от другого процесса или наоборот, проверьте, пожалуйста, что тут не так?

    Код:

    Код (Text):
    1.         BOOLEAN status = FALSE;
    2.     ANSI_STRING AllowedANSI = {0};
    3.     UNICODE_STRING AllowedUnicode = {0};
    4.     UNICODE_STRING SourceProcessImageName =  {0};
    5.  
    6.     RtlInitAnsiString(&AllowedANSI, "C:\\Windows\\System32\\audiodg.exe");
    7.     RtlAnsiStringToUnicodeString(&AllowedUnicode, &AllowedANSI, TRUE);
    8.    
    9.         ZwQueryInformationProcess ( PsGetCurrentProcess(), 27, &SourceProcessImageName, sizeof ( UNICODE_STRING ), NULL );
    10.  
    11.     if (RtlEqualUnicodeString(&AllowedUnicode, &SourceProcessImageName, 1))
    12.     {
    13.         status = TRUE;
    14.                 // ВОТ ТУТ НИКОГДА НЕ ОКАЗЫВАЕТСЯ КОД
    15.     }
    16.     return status;
    Спасибо!
     
  5. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Код (Text):
    1.  ZwQueryInformationProcess ( PsGetCurrentProcess(), 27, &SourceProcessImageName, sizeof ( UNICODE_STRING ), NULL );
    Это не правильно .

    Как то так надо
    ZwQueryInformationProcess with ProcessImageFileName

    Retrieves a UNICODE_STRING value containing the name of the image file for the process.


    Код (Text):
    1. RtlInitAnsiString(&AllowedANSI, "C:\\Windows\\System32\\audiodg.exe");
    Convert to
    Код (Text):
    1. RtlInitAnsiString(&AllowedANSI, "audiodg.exe");
    А вообще юзай RtlInitUnicodeString.
     
  6. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    Использование ZwQueryInformationProcess это простое решение, но совсем не эффективное.
    Например, на последних виндах системные процессы очень часто юзают функцию OpenProcess.
     
  7. Hippey

    Hippey New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2011
    Сообщения:
    49
    shchetinin
    Спасибо за помощь, только вот не подскажешь, в чем тут проблема:

    Код (Text):
    1. 34     WCHAR ImageNameBuffer[(sizeof(UNICODE_STRING) / sizeof(WCHAR)) + 260];;
    2. 35  PUNICODE_STRING pImageName;
    3. 36  pImageName = (PUNICODE_STRING)ImageNameBuffer;
    4. 37
    5. 38  pImageName->Buffer = &pImageName[sizeof(UNICODE_STRING) / sizeof(WCHAR)];
    6. 39  pImageName->Length = 0x0;
    7. 40  pImageName->MaximumLength = 260 * sizeof(WCHAR);
    8. 41
    9. 42  ZwQueryInformationProcess(Process, 27, pImageName, sizeof(ImageNameBuffer), NULL);
    10. 43  return pImageName;
    Выдает ошибки:
     
  8. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Hippey
    Декларация переменых должна начинатся в начале блока(функция, блока if , while ... ) Это уже "СИ" , может пока не надо в ядро? ))
     
  9. Hippey

    Hippey New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2011
    Сообщения:
    49
    shchetinin
    Дело в том, что надо просто поправить драйвер, а учить си, все принципы программирования в ядре, не очень хочется только ради этого одного маленького улучшения)
     
  10. Hippey

    Hippey New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2011
    Сообщения:
    49
    shchetinin
    кстати, как раз в начале все и стоит

    код полностью:
    Код (Text):
    1. UNICODE_STRING GetProcessImageName(IN PEPROCESS Process)
    2. {
    3.     WCHAR ImageNameBuffer[(sizeof(UNICODE_STRING) / sizeof(WCHAR)) + 260];;
    4.     PUNICODE_STRING pImageName;
    5.     pImageName = (PUNICODE_STRING)ImageNameBuffer;
    6.  
    7.     pImageName->Buffer = &pImageName[sizeof(UNICODE_STRING) / sizeof(WCHAR)];
    8.     pImageName->Length = 0x0;
    9.     pImageName->MaximumLength = 260 * sizeof(WCHAR);
    10.  
    11.     ZwQueryInformationProcess(Process, 27, pImageName, sizeof(ImageNameBuffer), NULL);
    12.     return pImageName;
    13. }
     
  11. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    как вы себе это представляете ?
     
  12. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Hippey
    Нельзя так данные возврощать данные на стеки, а вы делаете возврат из функции( не всегда работать будет коректно, а точнее не когда )

    Скорее всего WCHAR не продефайнен, можно заменить на wchar_t ...
     
  13. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    shchetinin
    Иногда будет.
    например так

    Код (Text):
    1.  buf = GetProcessImageName(..);
    2. for ( i =0; i<255; ++i)
    3.  LocalBuf[i] = buf[i];
    теперь весь результат в LocalBuf и все хорошо.
    Код (Text):
    1. UNICODE_STRING GetProcessImageName(IN PEPROCESS Process)
    Hippey
    нужно примерно так
    Код (Text):
    1. NTSTATUS GetProcessImageName(IN PEPROCESS Process,OUT  PUNICODE_STRING)
    2.  
    3. {
    4.   ...
    5.    return  ZwQueryInformationProcess(.... );
    6. }
    Возвращать NTSTATUS нужно для того чтоб понять причину ошибки,если она будет.
     
  14. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    XshStasX
    Ага обычный лог добавили и не чего не работает. Это через Ж.
     
  15. Hippey

    Hippey New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2011
    Сообщения:
    49
    Спасибо! Не подскажите, в чем тут ошибка теперь?

    Код (Text):
    1. pImageName->Buffer = &pImageName[sizeof(UNICODE_STRING) / sizeof(WCHAR)];
    В этой строке ошибка error C2220: warning treated as error - no 'object' file generated

    Полный код:

    Код (Text):
    1. NTSTATUS GetProcessImageName(IN PEPROCESS Process,OUT  PUNICODE_STRING pImageName)
    2. {
    3.     WCHAR ImageNameBuffer[(sizeof(UNICODE_STRING) / sizeof(WCHAR)) + 260];
    4.     //PUNICODE_STRING pImageName;
    5.     pImageName = (PUNICODE_STRING)ImageNameBuffer;
    6.  
    7.     pImageName->Buffer = &pImageName[sizeof(UNICODE_STRING) / sizeof(WCHAR)];
    8.     pImageName->Length = 0x0;
    9.     pImageName->MaximumLength = 260 * sizeof(WCHAR);
    10.  
    11.    
    12.     return ZwQueryInformationProcess(Process, 27, pImageName, sizeof(ImageNameBuffer), NULL);
    13. }
     
  16. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Hippey
    Касты нужны..

    Код (Text):
    1. pImageName->Buffer = (PWSTR)&pImageName[sizeof(UNICODE_STRING) / sizeof(wchar_t)];
     
  17. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Hippey
    pImageName это PUNICODE_STRING pImageName; ?
    Если да то
    Buffer - указатель на юникод строку (WCHAR*)
    pImageName - указатель на UNICODE_STRING.

    нужно перевести к типу WCHAR *
     
  18. Hippey

    Hippey New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2011
    Сообщения:
    49
    Спасибо! Извините за возможный разгул нубства) но опять проблемка, все сделал как вы сказали, но опять не видит audiodg
    Вот код полностью, проверка на разрешенный процесс в IsAllowedProcess

    Код (Text):
    1. NTSTATUS GetProcessImageName(IN PEPROCESS Process,OUT  PUNICODE_STRING pImageName)
    2. {
    3.     WCHAR ImageNameBuffer[(sizeof(UNICODE_STRING) / sizeof(WCHAR)) + 260];
    4.     pImageName = (PUNICODE_STRING)ImageNameBuffer;
    5.  
    6.      pImageName->Buffer = (WCHAR*)&pImageName[sizeof(UNICODE_STRING) / sizeof(WCHAR)];
    7.     pImageName->Length = 0x0;
    8.     pImageName->MaximumLength = 260 * sizeof(WCHAR);
    9.  
    10.    
    11.     return ZwQueryInformationProcess(Process, 27, pImageName, sizeof(ImageNameBuffer), NULL);
    12. }
    13.  
    14. BOOLEAN IsAllowedProcess(IN PEPROCESS Process)
    15. {
    16.     BOOLEAN status = FALSE;
    17.     ANSI_STRING AllowedANSI = {0};
    18.     UNICODE_STRING AllowedUnicode = {0};
    19.     UNICODE_STRING SourceProcessImageName =  {0};
    20.  
    21.     RtlInitAnsiString(&AllowedANSI, "audiodg.exe");
    22.     RtlAnsiStringToUnicodeString(&AllowedUnicode, &AllowedANSI, TRUE);
    23.    
    24.     GetProcessImageName(Process, &SourceProcessImageName);
    25.     if (RtlEqualUnicodeString(&AllowedUnicode, &SourceProcessImageName, 1))
    26.     {
    27.         status = TRUE;
    28.     }
    29.     return status;
    30. }
    31.  
    32. OB_PREOP_CALLBACK_STATUS ObjectPreCallback ( IN PVOID RegistrationContext,
    33.                                              IN POB_PRE_OPERATION_INFORMATION OperationInformation )
    34. {  
    35.     if ( *PsProcessType != OperationInformation -> ObjectType )
    36.     {
    37.         goto Exit;
    38.     }
    39.                if(PsGetProcessId(OperationInformation -> Operation) == 1024) // например защищенный процесс
    40.                    {
    41.             if(!IsAllowedProcess(PsGetCurrentProcess()))
    42.             {
    43.                               //выполнение операции останавливается
    44.                       }
    45.                     }
    46. Exit:
    47.     return OB_PREOP_SUCCESS;
    48. }
     
  19. Hippey

    Hippey New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2011
    Сообщения:
    49
    есть ли у кого какие-нибудь идеи?(
     
  20. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Hippey
    Нельзя возврощать стековую память (GetProcessImageName). Надо добавлять логи. Вообще без обид рано еще в ядро.