Перехват NtQueryDirectoryFile и проблемы с загрузкой длл.

Тема в разделе "WASM.BEGINNERS", создана пользователем AndjellaArtavazdovna, 23 фев 2011.

  1. AndjellaArtavazdovna

    AndjellaArtavazdovna New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2010
    Сообщения:
    615
    Добрый вечер. Ситуация следующая. Есть длл,загружающаяся через ключ SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs. Длл устанавливает перехват на NtQueryDirectoryFile. Из функции-перехватчика вызывается следующая ф-я:
    Код (Text):
    1. void WINAPI Hide_FileDirectoryInformation (PVOID BufferPointer)
    2. {
    3.  
    4.     PFILE_DIRECTORY_INFORMATION CurrentPointer = (PFILE_DIRECTORY_INFORMATION)BufferPointer;
    5.     PFILE_DIRECTORY_INFORMATION PrevPointer = CurrentPointer;
    6.  
    7.     while(wcscmp(L"C:\\Hide\\",CurrentPointer->FileName) != 0 &&
    8.                          CurrentPointer->NextEntryOffset != NULL)
    9.     {
    10.         PrevPointer = CurrentPointer;
    11.         CurrentPointer = (PFILE_DIRECTORY_INFORMATION)((int)CurrentPointer + (int)CurrentPointer->NextEntryOffset);
    12.     }
    13.    
    14. /////////Проблема здесь!//////////////////////////////////////////////////////////////////
    15.     if(CurrentPointer->NextEntryOffset == NULL)
    16.     {
    17.        
    18.         if(wcscmp(L"C:\\Hide\\",CurrentPointer->FileName) == 0)
    19.         {
    20.             PrevPointer->NextEntryOffset = NULL;
    21.         }
    22.        
    23.     }
    24.     else
    25.     {
    26.        
    27.         if(CurrentPointer == (PFILE_DIRECTORY_INFORMATION)BufferPointer)
    28.         {
    29.             BufferPointer = (PVOID)((int)(((PFILE_DIRECTORY_INFORMATION)BufferPointer)->NextEntryOffset) + (int)BufferPointer);
    30.         }
    31.         else
    32.         {
    33.             PrevPointer->NextEntryOffset = (ULONG)((int)PrevPointer->NextEntryOffset + (int)CurrentPointer->NextEntryOffset);
    34.         }
    35.        
    36.     }
    37. ///////////////////////////////////////////////////////////////////////////////////
    38.  
    39.  
    40. }
    В результате ,если убрать блок выделенный комментариями,длл грузится во все процессы,а если оставить,то нет.
    С длл вроде все нормально - через LoadLibrary грузится без проблем. У кого есть соображения пишите. Заранее спасибо.
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Немного странный код в целом. Нет проверки на случай, если директория пуста. Насколько я помню, в этом случае возвращается специальный статус.
     
  3. AndjellaArtavazdovna

    AndjellaArtavazdovna New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2010
    Сообщения:
    615
    Mika0x65
    Я знаю. Это предварительный вариант. С пустой директорией вопрос решен уже. Еще указатель на BufferPointer по ссылке а не
    по значению передать надо было,и код поменять немного. Просто в VM фиксированное расположение файлов в С:\. Но дллка все равно
    не грузиться. И почему причиной является IF-ELSE не понятно. Если заменить этот блок кода на какой-нибудь произвольный IF-ELSE,
    не работающий со списком,все равно грузиться перестает.