Здравствуйте! Есть драйвер, который защищает процесс, устанавливая хука с помощью obregistercallbacks, но вот программа, процесс который защищен, не может воспроизводить звук, вообще нет звука. Как я понимаю главный в этом деле процесс audiodg, как в драйвере можно понять что именно он пытается получить хендл, а не какой-нибудь другой левый процесс? Можете ткнуть в лицо кодом? два дня уже пытаюсь исправить, не получается, пробовал доставать название процесса, но не получалось. Спасибо!
Тебе что, "руководство по написанию проактивок, для чайников" надо? Обычно, разработчики антивирусов решают эту проблему базой доверенных процессов. Чувак, тебе уже всю матчасть написали в соседней теме, пора бы уже, чтобы получалось.
Я же уже в каком то твоём топике говорил, что для audiodg.exe нужно позволять отрывать хендл защищаемого процесса! ------ Вот мой пост: http://wasm.ru/forum/viewtopic.php?pid=462222#p462222
Спасибо за помощь, сначало решил проверять процесс по имени процесса audiodg.exe, но почему-то не получается, мой код не может отличить audiodg от другого процесса или наоборот, проверьте, пожалуйста, что тут не так? Код: Код (Text): BOOLEAN status = FALSE; ANSI_STRING AllowedANSI = {0}; UNICODE_STRING AllowedUnicode = {0}; UNICODE_STRING SourceProcessImageName = {0}; RtlInitAnsiString(&AllowedANSI, "C:\\Windows\\System32\\audiodg.exe"); RtlAnsiStringToUnicodeString(&AllowedUnicode, &AllowedANSI, TRUE); ZwQueryInformationProcess ( PsGetCurrentProcess(), 27, &SourceProcessImageName, sizeof ( UNICODE_STRING ), NULL ); if (RtlEqualUnicodeString(&AllowedUnicode, &SourceProcessImageName, 1)) { status = TRUE; // ВОТ ТУТ НИКОГДА НЕ ОКАЗЫВАЕТСЯ КОД } return status; Спасибо!
Код (Text): 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): RtlInitAnsiString(&AllowedANSI, "C:\\Windows\\System32\\audiodg.exe"); Convert to Код (Text): RtlInitAnsiString(&AllowedANSI, "audiodg.exe"); А вообще юзай RtlInitUnicodeString.
Использование ZwQueryInformationProcess это простое решение, но совсем не эффективное. Например, на последних виндах системные процессы очень часто юзают функцию OpenProcess.
shchetinin Спасибо за помощь, только вот не подскажешь, в чем тут проблема: Код (Text): 34 WCHAR ImageNameBuffer[(sizeof(UNICODE_STRING) / sizeof(WCHAR)) + 260];; 35 PUNICODE_STRING pImageName; 36 pImageName = (PUNICODE_STRING)ImageNameBuffer; 37 38 pImageName->Buffer = &pImageName[sizeof(UNICODE_STRING) / sizeof(WCHAR)]; 39 pImageName->Length = 0x0; 40 pImageName->MaximumLength = 260 * sizeof(WCHAR); 41 42 ZwQueryInformationProcess(Process, 27, pImageName, sizeof(ImageNameBuffer), NULL); 43 return pImageName; Выдает ошибки:
Hippey Декларация переменых должна начинатся в начале блока(функция, блока if , while ... ) Это уже "СИ" , может пока не надо в ядро? ))
shchetinin Дело в том, что надо просто поправить драйвер, а учить си, все принципы программирования в ядре, не очень хочется только ради этого одного маленького улучшения)
shchetinin кстати, как раз в начале все и стоит код полностью: Код (Text): UNICODE_STRING GetProcessImageName(IN PEPROCESS Process) { WCHAR ImageNameBuffer[(sizeof(UNICODE_STRING) / sizeof(WCHAR)) + 260];; PUNICODE_STRING pImageName; pImageName = (PUNICODE_STRING)ImageNameBuffer; pImageName->Buffer = &pImageName[sizeof(UNICODE_STRING) / sizeof(WCHAR)]; pImageName->Length = 0x0; pImageName->MaximumLength = 260 * sizeof(WCHAR); ZwQueryInformationProcess(Process, 27, pImageName, sizeof(ImageNameBuffer), NULL); return pImageName; }
Hippey Нельзя так данные возврощать данные на стеки, а вы делаете возврат из функции( не всегда работать будет коректно, а точнее не когда ) Скорее всего WCHAR не продефайнен, можно заменить на wchar_t ...
shchetinin Иногда будет. например так Код (Text): buf = GetProcessImageName(..); for ( i =0; i<255; ++i) LocalBuf[i] = buf[i]; теперь весь результат в LocalBuf и все хорошо. Код (Text): UNICODE_STRING GetProcessImageName(IN PEPROCESS Process) Hippey нужно примерно так Код (Text): NTSTATUS GetProcessImageName(IN PEPROCESS Process,OUT PUNICODE_STRING) { ... return ZwQueryInformationProcess(.... ); } Возвращать NTSTATUS нужно для того чтоб понять причину ошибки,если она будет.
Спасибо! Не подскажите, в чем тут ошибка теперь? Код (Text): pImageName->Buffer = &pImageName[sizeof(UNICODE_STRING) / sizeof(WCHAR)]; В этой строке ошибка error C2220: warning treated as error - no 'object' file generated Полный код: Код (Text): NTSTATUS GetProcessImageName(IN PEPROCESS Process,OUT PUNICODE_STRING pImageName) { WCHAR ImageNameBuffer[(sizeof(UNICODE_STRING) / sizeof(WCHAR)) + 260]; //PUNICODE_STRING pImageName; pImageName = (PUNICODE_STRING)ImageNameBuffer; pImageName->Buffer = &pImageName[sizeof(UNICODE_STRING) / sizeof(WCHAR)]; pImageName->Length = 0x0; pImageName->MaximumLength = 260 * sizeof(WCHAR); return ZwQueryInformationProcess(Process, 27, pImageName, sizeof(ImageNameBuffer), NULL); }
Hippey Касты нужны.. Код (Text): pImageName->Buffer = (PWSTR)&pImageName[sizeof(UNICODE_STRING) / sizeof(wchar_t)];
Hippey pImageName это PUNICODE_STRING pImageName; ? Если да то Buffer - указатель на юникод строку (WCHAR*) pImageName - указатель на UNICODE_STRING. нужно перевести к типу WCHAR *
Спасибо! Извините за возможный разгул нубства) но опять проблемка, все сделал как вы сказали, но опять не видит audiodg Вот код полностью, проверка на разрешенный процесс в IsAllowedProcess Код (Text): NTSTATUS GetProcessImageName(IN PEPROCESS Process,OUT PUNICODE_STRING pImageName) { WCHAR ImageNameBuffer[(sizeof(UNICODE_STRING) / sizeof(WCHAR)) + 260]; pImageName = (PUNICODE_STRING)ImageNameBuffer; pImageName->Buffer = (WCHAR*)&pImageName[sizeof(UNICODE_STRING) / sizeof(WCHAR)]; pImageName->Length = 0x0; pImageName->MaximumLength = 260 * sizeof(WCHAR); return ZwQueryInformationProcess(Process, 27, pImageName, sizeof(ImageNameBuffer), NULL); } BOOLEAN IsAllowedProcess(IN PEPROCESS Process) { BOOLEAN status = FALSE; ANSI_STRING AllowedANSI = {0}; UNICODE_STRING AllowedUnicode = {0}; UNICODE_STRING SourceProcessImageName = {0}; RtlInitAnsiString(&AllowedANSI, "audiodg.exe"); RtlAnsiStringToUnicodeString(&AllowedUnicode, &AllowedANSI, TRUE); GetProcessImageName(Process, &SourceProcessImageName); if (RtlEqualUnicodeString(&AllowedUnicode, &SourceProcessImageName, 1)) { status = TRUE; } return status; } OB_PREOP_CALLBACK_STATUS ObjectPreCallback ( IN PVOID RegistrationContext, IN POB_PRE_OPERATION_INFORMATION OperationInformation ) { if ( *PsProcessType != OperationInformation -> ObjectType ) { goto Exit; } if(PsGetProcessId(OperationInformation -> Operation) == 1024) // например защищенный процесс { if(!IsAllowedProcess(PsGetCurrentProcess())) { //выполнение операции останавливается } } Exit: return OB_PREOP_SUCCESS; }
Hippey Нельзя возврощать стековую память (GetProcessImageName). Надо добавлять логи. Вообще без обид рано еще в ядро.