Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Перехват NtQueryInformationFile


Автор: Illusion Dolphin 25.10.2012, 23:02
Столкнулся с проблемой при перехвате функции NtQueryInformationFile.
Кратко о проблемматике: 
Пишу программу для прозрачного шифрования видеофайлов, мой программа запускает внешний плеер (в идеале любую программу, и любой файл), через CreateRemoteThread внедряет библиотеку и замещает таблицу импорта (банальный код - в нэте куча кривых примеров). 
Файл шифруется блоками и вначале добавляется заголовок, который увеличиывет размер файла. Т.е. задача - перехватить чтение файла и отдать зашифрованный файл в расшифрованном виде, а также подменить размер файла для зашифрованных файлов чтобы программа думала что это обычный файл.
Получилось всё кроме одного момента - сплиттер quartz.dll пытается прочитать лишние байты в конце (в размере заголовка), т.е. он откуда-то узнаёт реальный размер файла.

Перехватываю:
 GetFileSize
 GetFileSizeEx
 FindFirstFileA
 FindFirstFileW
 GetFileAttributesExA
 GetFileAttributesExW
 SetFilePointerEx (при перемотке в конец файла - недоматываю до конца столько сколько весит заголовок)
 SetFilePointer (при перемотке в конец файла - недоматываю до конца столько сколько весит заголовок)
 NtQueryDirectoryFile (FileDirectoryInformation, FileFullDirectoryInformation, FileBothDirectoryInformation)

Но при этом quartz.dll как-то узнаёт реальный размер файла (в аттаче картинка - он пытается прочитать больше, чем есть в расшифрованном файле).
Попытался перехватить NtQueryInformationFile:
Код

function NtQueryInformationFile(FileHandle: HANDLE;
                                IoStatusBlock: PIO_STATUS_BLOCK;
                                FileInformation: PVOID;
                                FileInformationLength: ULONG;
                                FileInformationClass: FILE_INFORMATION_CLASS
                                ): NTSTATUS; stdcall; external NTDLLFile;

Код

function NtQueryInformationFileHookProc(FileHandle: HANDLE;
                                IoStatusBlock: PIO_STATUS_BLOCK;
                                FileInformation: PVOID;
                                FileInformationLength: ULONG;
                                FileInformationClass: FILE_INFORMATION_CLASS
                                ): NTSTATUS; stdcall;
begin
  Result := NtQueryInformationFileNextHook(FileHandle, IoStatusBlock, FileInformation,
                                           FileInformationLength, FileInformationClass);
end;

Но при этом всё падает при запуске. Посоветуйте, куда двигаться дальше, что можно посмотреть - какие функции ещё могут вернуть размер файла? Может NtQueryInformationFileHookProc имеет неверную сигнатуру? Буду рад любым идеям. 

Спасибо!

Автор: Illusion Dolphin 27.10.2012, 18:32
Спасибо, что выслушали smile
Дело было не в бобине (с). В долгой отладке нашлось, что системный сплиттер не только использует асинхронное чтение, кое я осилил, но ещё и выставляет флаг FILE_FLAG_NO_BUFFERING при открытии файла, а при этом нельзя считать мой заголовок (75 байт) т.к. этот размер меньше сектора. Теперь вроде все плееры, что у меня есть, поддаются перехвату. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)