перехват NtQueryDirectoryFile

Тема в разделе "WASM.WIN32", создана пользователем tr1cker, 22 янв 2006.

  1. tr1cker

    tr1cker New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2005
    Сообщения:
    20
    здравствуйте!

    я реализую так:


    Код (Text):
    1.  
    2. NTSTATUS (*RealZwQueryDirectoryFile)(IN HANDLE, IN HANDLE, IN PIO_APC_ROUTINE, IN PVOID, OUT PIO_STATUS_BLOCK, OUT PVOID, \
    3.                                    IN ULONG, IN FILE_INFORMATION_CLASS, IN BOOLEAN, IN PUNICODE_STRING, IN BOOLEAN);
    4.  
    5. NTSTATUS NewZwQueryDirectoryFile(
    6.         IN HANDLE FileHandle,
    7.         IN HANDLE Event OPTIONAL,
    8.         IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
    9.         IN PVOID ApcContext OPTIONAL,
    10.         OUT PIO_STATUS_BLOCK IoStatusBlock,
    11.         OUT PVOID FileInformation,
    12.         IN ULONG FileInformationLength,
    13.         IN FILE_INFORMATION_CLASS FileInformationClass,
    14.         IN BOOLEAN ReturnSingleEntry,
    15.         IN PUNICODE_STRING FileName OPTIONAL,
    16.         IN BOOLEAN RestartScan)
    17. {
    18.     NTSTATUS status;
    19.  
    20. RealZwQueryDirectoryFile = (NTSTATUS (__cdecl *)(void*, void*, PIO_APC_ROUTINE, void*, IO_STATUS_BLOCK* , void*, ULONG, FILE_INFORMATION_CLASS, BOOLEAN, UNICODE_STRING*, BOOLEAN))(DWORD)GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwQueryDi rectoryFile");
    21.  
    22. status = (NTSTATUS)RealZwQueryDirectoryFile;
    23.  
    24.     if (NT_SUCCESS(status))
    25.     {
    26.         PFILE_FULL_DIRECTORY_INFORMATION FileDirectoryInfo, LastFileDirectoryInfo;
    27.         PFILE_FULL_DIRECTORY_INFORMATION LastFileFullDirectoryInfo, FileFullDirectoryInfo;
    28.         PFILE_BOTH_DIRECTORY_INFORMATION LastFileBothDirectoryInfo, FileBothDirectoryInfo;
    29.         PFILE_NAMES_INFORMATION          LastFileNamesInfo, FileNamesInfo;
    30.  
    31.         ULONG Offset = 0;
    32.  
    33.         switch (FileInformationClass)
    34.         {
    35.             case FileDirectoryInformation :
    36.                 FileDirectoryInfo = NULL;
    37.                 do
    38.                 {
    39.                     FileDirectoryInfo = (PFILE_FULL_DIRECTORY_INFORMATION)((ULONG)FileInformation + Offset);
    40.                     LastFileDirectoryInfo = FileDirectoryInfo;
    41.  
    42.                     if (FileDirectoryInfo->FileName[0] == 0x55)
    43.                     {
    44.                         if (!FileDirectoryInfo->NextEntryOffset)
    45.                         {
    46.                             if (LastFileDirectoryInfo) LastFileDirectoryInfo->NextEntryOffset = 0;
    47.                             else status = STATUS_NO_SUCH_FILE;
    48.                             return status;
    49.                         } else
    50.                         if (LastFileDirectoryInfo) LastFileDirectoryInfo->NextEntryOffset += FileDirectoryInfo->NextEntryOffset;                       
    51.                     }
    52.  
    53.                     Offset += FileDirectoryInfo->NextEntryOffset;
    54.  
    55.                 } while (FileDirectoryInfo->NextEntryOffset);
    56.  
    57.             break;
    58.  
    59.             case FileFullDirectoryInformation :
    60.                 FileFullDirectoryInfo = NULL;
    61.                 do
    62.                 {
    63.                     LastFileFullDirectoryInfo = FileFullDirectoryInfo;
    64.                     FileFullDirectoryInfo = (PFILE_FULL_DIRECTORY_INFORMATION)((ULONG)FileInformation + Offset);
    65.  
    66.                     if (FileFullDirectoryInfo->FileName[0] == 0x55)
    67.                     {
    68.                         if (!FileFullDirectoryInfo->NextEntryOffset)
    69.                         {
    70.                             if (LastFileFullDirectoryInfo) LastFileFullDirectoryInfo->NextEntryOffset = 0;
    71.                             else status = STATUS_NO_SUCH_FILE;
    72.                             return status;
    73.                         } else
    74.                         if (LastFileFullDirectoryInfo) LastFileFullDirectoryInfo->NextEntryOffset += FileFullDirectoryInfo->NextEntryOffset;
    75.                     }
    76.  
    77.                     Offset += FileFullDirectoryInfo->NextEntryOffset;
    78.  
    79.                 } while (FileFullDirectoryInfo->NextEntryOffset);
    80.             break;
    81.  
    82.             case FileBothDirectoryInformation :
    83.                 FileBothDirectoryInfo = NULL;
    84.                 do
    85.                 {
    86.                     LastFileBothDirectoryInfo = FileBothDirectoryInfo;
    87.                     FileBothDirectoryInfo = (PFILE_BOTH_DIRECTORY_INFORMATION)((ULONG)FileInformation + Offset);
    88.                     if (FileBothDirectoryInfo->FileNameLength > 1 && FileBothDirectoryInfo->FileName[0] == 0x55)
    89.                     {
    90.                         if (!FileBothDirectoryInfo->NextEntryOffset)
    91.                         {
    92.                             if (LastFileBothDirectoryInfo) LastFileBothDirectoryInfo->NextEntryOffset = 0;
    93.                             else status = STATUS_NO_SUCH_FILE;
    94.                             return status;
    95.                         } else
    96.                         if (LastFileBothDirectoryInfo) LastFileBothDirectoryInfo->NextEntryOffset += FileBothDirectoryInfo->NextEntryOffset;
    97.                     }
    98.  
    99.                     Offset += FileBothDirectoryInfo->NextEntryOffset;
    100.  
    101.                 } while (FileBothDirectoryInfo->NextEntryOffset);
    102.             break;
    103.  
    104.             case FileNamesInformation :
    105.                 FileNamesInfo = NULL;
    106.                 do
    107.                 {
    108.                     LastFileNamesInfo = FileNamesInfo;
    109.                     FileNamesInfo = (PFILE_NAMES_INFORMATION)((ULONG)FileInformation + Offset);
    110.                     if (FileNamesInfo->FileName[0] == 0x55)
    111.                     {
    112.                         if (!FileNamesInfo->NextEntryOffset)
    113.                         {
    114.                             if(LastFileNamesInfo) LastFileNamesInfo->NextEntryOffset = 0;
    115.                             else status = STATUS_NO_SUCH_FILE;
    116.                             return status;
    117.                         } else
    118.                         if (LastFileNamesInfo) LastFileNamesInfo->NextEntryOffset += FileNamesInfo->NextEntryOffset;
    119.                     }
    120.  
    121.                     Offset += FileNamesInfo->NextEntryOffset;
    122.                 } while (FileNamesInfo->NextEntryOffset);
    123.             break;
    124.         }
    125.     }
    126.  
    127.     return status;
    128. }
    129.  
    130.  




    после этого делаю нечто вроде


    Код (Text):
    1.  
    2. ReplaceIATEntryInAllMods("ntdll.dll", GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwQueryDirectoryFile"), (PROC)NewZwQueryDirectoryFile);
    3.  




    но при инжекте в любой процесс, будь то totalcmd.exe или еще какой, процесс падает =(

    не могли бы вы показать маленьки рабочий пример правильного перехвата.

    буду очень признателен!!!
     
  2. Guest

    Guest Guest

    Публикаций:
    0
    Недавно сам реализовывал, правда в ядре, проверь структуру FILE_BOTH_DIRECTORY_INFORMATION, во многоих источниках неправильно составлена структура. Ищи пост MS Rema, он недавно выкладывал правильный вариант, вполне возможно ошибка тут
     
  3. psw1

    psw1 New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2006
    Сообщения:
    8
    Уж очень ты странно вызываешь RealZwQueryDirectoryFile.

    1. Ты уверен, что твоя и оригинальные процедуры должны быть _cdecl, а не _stdcall?

    2. Вызвать RealZwQueryDirectoryFile ты должен как-то так

    status = (*RealZwQueryDirectoryFile)(FileHandle, Event,

    ... далее идут другие параметры...

    );
     
  4. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    Да, точно, нужны только stdcall'овские процедуры. psw1 молодец. При _cdecl стек не очищается от параметров процедурой, и программа получает не ту вершину стека, на которую рассчитывала. Да и лучше б ты на asm'е написал, читать проще было бы.
     
  5. tr1cker

    tr1cker New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2005
    Сообщения:
    20
    с stdcall не компилится..

    будем-с думать.