Проблемка. Перехват ZwQueryDirectoryFile

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

  1. Guest

    Guest Guest

    Публикаций:
    0
    Пытаюсь освоить перехват ф-и ZwQueryDirectoryFile. Для начала решил начать с обработки FileBothDirectoryInformation, для которого структура FileInformation выглядит следующим образом:
    Код (Text):
    1.  
    2. FILE_BOTH_DIRECTORY_INFORMATION struc
    3.     NextEntryOffset     dd  ?
    4.     Unknown         dd  ?
    5.     CreationTime        dq  ?
    6.     LastAccessTime      dq  ?
    7.     LastWriteTime       dq  ?
    8.     ChangeTime      dq  ?
    9.     EndOfFile       dq  ?
    10.     AllocationSize      dq  ?
    11.     FileAttributes      dd  ?
    12.     FileNameLength      dd  ?
    13.     EaInformationLength dd  ?
    14.     AlternateNameLength db  ?
    15.     AlternateName       dw  12  dup (?)
    16.     FileName        dw  ?
    17. FILE_BOTH_DIRECTORY_INFORMATION ends
    18.  


    Значит сам перехват проходит удачно. Суть проблемы состоит в том что я не могу корректно получить имя файла (FILE_BOTH_DIRECTORY_INFORMATION->FileName).

    Вот участок кода который пытается вывести на экран DbgView имя файла, вместо чего выводятся символы "?????", например файл 1.тхт = ?????


    Код (Text):
    1.  
    2. LOCAL   as  :ANSI_STRING
    3. LOCAL   us  :UNICODE_STRING
    4.     @@:
    5.         mov eax,[edi].NextEntryOffset
    6.         test    eax,eax
    7.         jz  @F
    8.        
    9.         mov eax,[edi].FileNameLength
    10.         mov us._Length,ax
    11.         mov us.MaximumLength,ax
    12.         lea eax,[edi].FileName
    13.         mov us.Buffer,eax      
    14.         invoke  RtlUnicodeStringToAnsiString,addr as,addr us,TRUE
    15.         .if eax==STATUS_SUCCESS
    16.             invoke  DbgPrint,$CTA0(" %s "),as.Buffer
    17.             invoke  RtlFreeAnsiString,addr as
    18.         .endif     
    19.         add edi,[edi].NextEntryOffset
    20.         jmp @B
    21.     @@:
    22.  




    Подскажите как правильно надо получать имя файла
     
  2. Guest

    Guest Guest

    Публикаций:
    0
    Уважаемые друзья! Разобрался, но если честно от этого мне щас не легче, т.к. понять теперь не могу почему неправильно перевел структуру на асм.

    Вот вариант на С++, из ДДК
    Код (Text):
    1.  
    2.         typedef struct _FILE_BOTH_DIRECTORY_INFORMATION {
    3.                 ULONG NextEntryOffset;
    4.                 ULONG Unknown;
    5.                 LARGE_INTEGER CreationTime;
    6.                 LARGE_INTEGER LastAccessTime;
    7.                 LARGE_INTEGER LastWriteTime;
    8.                 LARGE_INTEGER ChangeTime;
    9.                 LARGE_INTEGER EndOfFile;
    10.                 LARGE_INTEGER AllocationSize;
    11.                 ULONG FileAttributes;
    12.                 ULONG FileNameLength;
    13.                 ULONG EaInformationLength;
    14.                 UCHAR AlternateNameLength;
    15.                 WCHAR AlternateName[12];
    16.                 WCHAR FileName[1];
    17.         } FILE_BOTH_DIRECTORY_INFORMATION, *PFILE_BOTH_DIRECTORY_INFORMATION;
    18.  




    Вот нашел в инете вариант под ассемблер
    Код (Text):
    1.  
    2. FILE_BOTH_DIRECTORY_INFORMATION struc
    3.     NextEntryOffset     dd  ?
    4.     Unknown         dd  ?
    5.     CreationTime        dq  ?
    6.     LastAccessTime      dq  ?
    7.     LastWriteTime       dq  ?
    8.     ChangeTime      dq  ?
    9.     EndOfFile       dq  ?
    10.     AllocationSize      dq  ?
    11.     FileAttributes      dd  ?
    12.     FileNameLength      dd  ?
    13.     EaInformationLength dd  ?
    14.     AlternateNameLength db  ?
    15.                 [b]db   ? - Откуда взялся вдруг этот параметр???!!![/b]
    16.     AlternateName       dw  12  dup (?)
    17.     FileName        dw  ?
    18. FILE_BOTH_DIRECTORY_INFORMATION ends
    19.  
    20. Вот из-за несоответствия в структурах возился целый день! Как это объяснить - не знаю!
    21. Натолкните на мысль, может это я туплю... Скорей всего...
    22.  
    23.  
     
  3. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    З.Ы. судя по частоте и характеру твоих постов, кажется что руткит пишешь не ты, а народ с васма...



    З.З.Ы Я сталкивался с такой ошибклй в структурах, вот правильный структуры:


    Код (Text):
    1. typedef struct _FILE_DIRECTORY_INFORMATION
    2. {
    3.     ULONG NextEntryOffset;
    4.     ULONG Unknown;
    5.     LARGE_INTEGER CreationTime;
    6.     LARGE_INTEGER LastAccessTime;
    7.     LARGE_INTEGER LastWriteTime;
    8.     LARGE_INTEGER ChangeTime;
    9.     LARGE_INTEGER EndOfFile;
    10.     LARGE_INTEGER AllocationSize;
    11.     ULONG FileAttributes;
    12.     ULONG FileNameLength;
    13.     WCHAR FileName [1];
    14. } FILE_DIRECTORY_INFORMATION,*PFILE_DIRECTORY_INFORMATION;
    15.  
    16. typedef struct _FILE_FULL_DIRECTORY_INFORMATION
    17. {
    18.     ULONG NextEntryOffset;
    19.     ULONG Unknown;
    20.     LARGE_INTEGER CreationTime;
    21.     LARGE_INTEGER LastAccessTime;
    22.     LARGE_INTEGER LastWriteTime;
    23.     LARGE_INTEGER ChangeTime;
    24.     LARGE_INTEGER EndOfFile;
    25.     LARGE_INTEGER AllocationSize;
    26.     ULONG FileAttributes;
    27.     ULONG FileNameLength;
    28.     ULONG EaInformationLength;
    29.     WCHAR FileName [1];
    30. } FILE_FULL_DIRECTORY_INFORMATION, *PFILE_FULL_DIRECTORY_INFORMATION;
    31.  
    32. typedef struct _FILE_BOTH_DIRECTORY_INFORMATION
    33. {
    34.     ULONG NextEntryOffset;
    35.     ULONG Unknown;
    36.     LARGE_INTEGER CreationTime;
    37.     LARGE_INTEGER LastAccessTime;
    38.     LARGE_INTEGER LastWriteTime;
    39.     LARGE_INTEGER ChangeTime;
    40.     LARGE_INTEGER EndOfFile;
    41.     LARGE_INTEGER AllocationSize;
    42.     ULONG  FileAttributes;
    43.     ULONG  FileNameLength;
    44.     ULONG  EaInformationLength;
    45.     USHORT AlternateNameLength;
    46.     WCHAR  AlternateName [12];
    47.     WCHAR  FileName [1];
    48. } FILE_BOTH_DIRECTORY_INFORMATION,*PFILE_BOTH_DIRECTORY_INFORMATION;
    49.  
    50. typedef struct _FILE_NAMES_INFORMATION
    51. {
    52.     ULONG NextEntryOffset;
    53.     ULONG Unknown;
    54.     ULONG FileNameLength;
    55.     WCHAR FileName[1];
    56. } FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION;
    57.  
     
  4. Guest

    Guest Guest

    Публикаций:
    0
    Я так и не понял почему структуры разные? Или они от ОС зависят?
     
  5. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"


    Это стурктуры для разных запрашиваемых типов информации о файлах. В справочнике по NativeApi от Нэббета ошибочна описана стрктура FILE_BOTH_DIRECTORY_INFORMATION, на что ты сейчас и напоролся.
     
  6. Guest

    Guest Guest

    Публикаций:
    0
    Ms Rem

    Совершенно верно! Им то я и пользуюсь уже неделю. Из-за него я насмотрелся за день порядка 30 БДОСОВ! Ужас!

    Хотя о том что купил не жалею ни дня, книга хорошая



    зы Ты еще ошибки не обнаруживал в книге? т.к. на данный момент все прототипы ф-й и структуры на асм я переделываю именно из Неббета...
     
  7. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    Corleone

    Я использую прототипы с reactos.
     
  8. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Вроде чето обанруживал (в описании функций), но не помню конкретно что.

    В любом случае если есть ошибки, то на них напорешся когда попытаешся это применить.
     
  9. Guest

    Guest Guest

    Публикаций:
    0
    Ms Rem

    Все скрытие реализовал! Весь день просидел, но оно того стоило, размер драйвера 1,4 кб, все на чистом асме