Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват Native API, Перехват ZwQueryDirectoryFile 
:(
    Опции темы
DoZENT
Дата 11.1.2007, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 2.6.2006

Репутация: 1
Всего: 1



Цитата

может это и не то... но все-таки

Перехват функции осуществляется

Ладно, пойдем другим путем.
Кто-нибудь может привести ПОЛНЫЙ пример работы с библиотекой advApiHook? А то с wasm.ru ни сама библиотека, ни примеры ее использования не скачиваются smile


--------------------
Какая боль, какая боль, Internet Explorer 5.0...
PM MAIL   Вверх
W4FhLF
Дата 11.1.2007, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Цитата

Кто-нибудь может привести ПОЛНЫЙ пример работы с библиотекой advApiHook? А то с wasm.ru ни сама библиотека, ни примеры ее использования не скачиваются 


Аттач.

Присоединённый файл ( Кол-во скачиваний: 57 )
Присоединённый файл  advapihook.zip 116,62 Kb


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Girder
Дата 11.1.2007, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



Кстати... в факе есть пример использования драйверочков от FileMon smile 


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
DoZENT
Дата 11.1.2007, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 2.6.2006

Репутация: 1
Всего: 1



Спасибо, с библиотекой я уже разобрался. Такой вопрос. Перехватываю ZwQueryDirectoryFile, обрабатываю результаты:

Код

function NewZwQueryDirectoryFile (FileHandle: dword;
                              Event: dword;
                              ApcRoutine: pointer;
                              ApcContext: pointer;
                              IoStatusBlock: pointer;
                              FileInformation: PVOID;
                              FileInformationLength: ULONG;
                              FileInformationClass: dword;
                              ReturnSingleEntry: bool;
                              FileName: PUnicodeString;
                              RestartScan: bool): NTStatus;
                              stdcall;
var
Name : string;
offset : dword;
DirInfo, DirInfo1 : PFILE_DIRECTORY_INFORMATION;
F : TextFile;
FileBothDirectoryInfo, LastFileBothDirectoryInfo : PFILE_BOTH_DIRECTORY_INFORMATION;
begin



  Result := TrueZwQueryDirectoryFile (FileHandle, Event, ApcRoutine, ApcContext,
            IoStatusBlock,FileInformation,FileInformationLength,
            FileInformationClass,ReturnSingleEntry,FileName,RestartScan);

Offset := 0;

if Result = STATUS_SUCCESS then
begin


  if FileInformationClass =  FileBothDirectoryInformation then
  begin
        FileBothDirectoryInfo := nil;
        repeat
          LastFileBothDirectoryInfo := FileBothDirectoryInfo;
         FileBothDirectoryInfo := PFILE_BOTH_DIRECTORY_INFORMATION(pointer(dword(FileInformation)));// + Offset));
         

          //Name := Copy(WideCharToString(FileBothDirectoryInfo.FileName), 1,FileBothDirectoryInfo.FileNameLength div 2); // без этой строчки работает нормально 
  
          Offset := Offset + FileBothDirectoryInfo.NextEntryOffset;
        until FileBothDirectoryInfo.NextEntryOffset = 0;
      end;



end;

end;

Процесс вылетает, если есть строчка 
Код

Name := Copy(WideCharToString(FileBothDirectoryInfo.FileName), 1, FileBothDirectoryInfo.FileNameLength div 2);

 В чем ошибка обработки smile 


--------------------
Какая боль, какая боль, Internet Explorer 5.0...
PM MAIL   Вверх
W4FhLF
Дата 11.1.2007, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Ты б справчку по функции Copy и WideCharToString прочёл или посмотрел как она реализована. А потом бы глянул как переводится UNICODE в ASCII. Неверно ты их используешь.


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
DoZENT
Дата 11.1.2007, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 2.6.2006

Репутация: 1
Всего: 1



Код

var
us : PUnicodeString;
         us.Length :=  FileBothDirectoryInfo.FileNameLength div 2;
         us.MaximumLength :=  FileBothDirectoryInfo.FileNameLength div 2;
         us.Buffer := FileBothDirectoryInfo.FileName;

         RtlUnicodeStringToAnsiString (Name, us, true);


Тоже не проходит, причем не выполняется ни одна из этих строк (если хоть одна присутствует, то процесс вылелает)  smile 


--------------------
Какая боль, какая боль, Internet Explorer 5.0...
PM MAIL   Вверх
MetalFan
Дата 25.1.2007, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



DoZENT, буду сегодня разбираться!
результат, если будет, все еще интересен?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
drkot
Дата 25.1.2007, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: нет
Всего: 8



Результат всегда интересен.


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
MetalFan
Дата 26.1.2007, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



мда.
у MS-REM'а видимо спецом ошибочки затесались....
много читал MSDN и понял, что
FileName: PWideChar;
нифига не так,
а вот так:
FileName: WideChar;
ибо в MSDN анлгийским по белому написано:
Код

FileName 
Specifies the first character of the file name string. This is followed in memory by the remainder of the string. 

и еще один косяк в описании структуры...

Это сообщение отредактировал(а) MetalFan - 26.1.2007, 09:35


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Romikgy
Дата 26.1.2007, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



MetalFan, имхо ты здесь не прав 

Цитата(MetalFan @  25.1.2007,  23:44 Найти цитируемый пост)
много читал MSDN и понял, что
FileName: PWideChar;
нифига не так,
а вот так:
FileName: WideChar;

не может быть название файла соостоящее из одного символа!


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
MetalFan
Дата 26.1.2007, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



Romikgy, ;) конечно не может) а кто  сказал, что оно из одного символа.

ладно, вот что у меня вышло,
может кто явные недочеты укажет:

структура
Код

 FILE_BOTH_DIRECTORY_INFORMATION = packed record 
   NextEntryOffset: ULONG;
   Unknown: ULONG; 
   CreationTime,
   LastAccessTime,
   LastWriteTime, 
   ChangeTime,
   EndOfFile,
   AllocationSize: int64; 
   FileAttributes: ULONG; 
   FileNameLength: ULONG; 
   EaInformationLength: ULONG;
   AlternateNameLength: WORD; //здесь 2 байтя, а не 4, как у REM'a
   AlternateName: array [0..11] of WideChar; 
   FileName: WideChar; //и здесь не PWideChar
 end;

сама "перехваченная" функция
Код

   function NewZwQueryDirectoryFile (FileHandle: dword;
                              Event: dword;
                              ApcRoutine: pointer;
                              ApcContext: pointer;
                              IoStatusBlock: pointer;
                              FileInformation: pointer;
                              FileInformationLength: dword;
                              FileInformationClass: dword;
                              ReturnSingleEntry: bool;
                              FileName: PUnicodeString;
                              RestartScan: bool): NTStatus; stdcall;
   var
     lNamePWC: PWideChar;
     lNameW: WideString;

     lPrevPt, lPt: Pointer;
     lNextEntryOffset: ULONG;
     lSz: ULONG;
   begin
     Result := TrueZwQueryDirectoryFile( FileHandle,
                                         Event,
                                         ApcRoutine,
                                         ApcContext,
                                         IoStatusBlock,
                                         FileInformation,
                                         FileInformationLength,
                                         FileInformationClass,
                                         ReturnSingleEntry,
                                         FileName,
                                         RestartScan  );
     if not (FileInformationClass in [ FileDirectoryInformation,
                                  FileFullDirectoryInformation,
                                  FileBothDirectoryInformation,
                                  FileNamesInformation]) or
        (Result = STATUS_NO_SUCH_FILE) or
        (FileInformationLength = 0) then Exit;
     lPt := FileInformation;
     lPrevPt := nil;
     repeat
       lNextEntryOffset := ULONG(lPt^);
       //получаем информацию о имени файла...
       //в зависимости от структуры
       //з.ы. кроме FileBothDirectoryInformation ниразу другие значения не попались
       case FileInformationClass of
         FileDirectoryInformation:
         begin
           lSz := FILE_DIRECTORY_INFORMATION(lPt^).FileNameLength;
           lNamePWC := @FILE_DIRECTORY_INFORMATION(lPt^).FileName;
         end;
         FileFullDirectoryInformation:
         begin
           lSz := FILE_FULL_DIRECTORY_INFORMATION(lPt^).FileNameLength;
           lNamePWC := @FILE_FULL_DIRECTORY_INFORMATION(lPt^).FileName;
         end;
         FileBothDirectoryInformation:
         begin
           lSz := FILE_BOTH_DIRECTORY_INFORMATION(lPt^).FileNameLength;
           lNamePWC := @FILE_BOTH_DIRECTORY_INFORMATION(lPt^).FileName;
         end;
         FileNamesInformation:
         begin
           lSz := FILE_NAMES_INFORMATION(lPt^).FileNameLength;
           lNamePWC := @FILE_NAMES_INFORMATION(lPt^).FileName;
         end;
       end;
       //по скольку lNamePWC не всегда содержит завершающие нули,
       //то сразу использовать нельзя.
       //я сделал вот так, извращенно... 
       SetLength( lNameW, lSz div 2);
       Move( lNamePWC^, lNameW[1], lSz );
       //в lNameW имеем нормальное имя, которое можно отдать не стыдясь на сравнение
       if lstrcmpiW( @gHideFileNameW[1], @lNameW[1] ) = 0 then
       begin //нашли! принимаем решительые меры
         if lPt = FileInformation then
         begin //первая запись
           //этот код протестировать не удалось, возможны косяки
           if lNextEntryOffset <> 0 then
           begin
             lPt := Pointer(ULONG(lPt)+lNextEntryOffset);
             Move( lPt^, FileInformation^, FileInformationLength - lNextEntryOffset );
           end
           else
             Result := STATUS_NO_SUCH_FILE;
         end
         //далее срабатывало правильно
         else
         if lNextEntryOffset <> 0 then
         begin // если серединка
           ULONG(lPrevPt^) := ULONG(lPrevPt^) + lNextEntryOffset;
         end
         else //конетц
         begin
           ULONG(lPrevPt^) := 0;
         end;
         Break; //подменили? выходим из цикла
       end;
       lPrevPt := lPt;
       lPt := Pointer(ULONG(lPt)+lNextEntryOffset);
     until lNextEntryOffset = 0;
   end;


и вообще, часть статьи REM'а содрано слово слово из.. см.аттач
з.ы. уже сам нашел небольшой недочет в коде. точнее отсутсвие кода по одному замечанию из статьи...

Это сообщение отредактировал(а) MetalFan - 26.1.2007, 10:47

Присоединённый файл ( Кол-во скачиваний: 34 )
Присоединённый файл  hidingru.txt 58,26 Kb


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Romikgy
Дата 26.1.2007, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Цитата(MetalFan @  26.1.2007,  09:42 Найти цитируемый пост)
 FileName: WideChar; //и здесь не PWideChar

сомневаюсь я в этом smile



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
MetalFan
Дата 26.1.2007, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



Romikgy, сомневайся. а в MSDN написано именно так.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Romikgy
Дата 26.1.2007, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Цитата(MetalFan @  26.1.2007,  11:55 Найти цитируемый пост)
а в MSDN написано именно так.

ссылку можно?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
MetalFan
Дата 26.1.2007, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



Romikgy-неверующий! а самому посмотреть? вот ссылка
Windows Driver Kit: Installable File System Drivers. FILE_BOTH_DIR_INFORMATION, 
кушайте на здоровье) smile 
и вообще, почему сомневаешься? smile  пробовал так, как у REM'а написано и все заработало? или просто посомневаться решил  smile 

Это сообщение отредактировал(а) MetalFan - 26.1.2007, 13:19


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0977 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.