Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > 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:
Но при этом всё падает при запуске. Посоветуйте, куда двигаться дальше, что можно посмотреть - какие функции ещё могут вернуть размер файла? Может NtQueryInformationFileHookProc имеет неверную сигнатуру? Буду рад любым идеям. Спасибо! |
Автор: Illusion Dolphin 27.10.2012, 18:32 |
Спасибо, что выслушали ![]() Дело было не в бобине (с). В долгой отладке нашлось, что системный сплиттер не только использует асинхронное чтение, кое я осилил, но ещё и выставляет флаг FILE_FLAG_NO_BUFFERING при открытии файла, а при этом нельзя считать мой заголовок (75 байт) т.к. этот размер меньше сектора. Теперь вроде все плееры, что у меня есть, поддаются перехвату. |