Можно ли изменить размер файла в режиме ядра?
От: Suares  
Дата: 20.10.14 13:44
Оценка:
Сначала опишу, что я хочу сделать. Допустим у нас на компьютере есть папка E:\Data\Private, где будут лежать секретные файлы, содержащие схемы по отмыванию денег Так как они являются очень секретными, то и просматривать их хочу только я. Т.е. при сохранении файла в эту папку он будет шифроваться, а при чтении расшифровываться.

Решение придумал такое, что есть некое приложение, через которое можно будет открыть эту папку. И в тот момент когда происходит открытие папки, запускался драйвер, который будет перехватывать запросы по чтению/записи к E:\Data\Private.

За основу взял драйвер с WDK: SwapBuffer File System Minifilter Driver. Добавил только возможность пересылать массив символов с драйвера в мое приложение, где собственно будет шифрование/расшифрование данных. Алгоритм шифрования использую AES.

Пару месяцев работы прошли не зря, почти не зря. Я добился того, что бы при записи файлы шифровались, а при чтении расшифровывались. Рассматриваю для начала текстовые файлы. Но столкнулся с такой проблемой.

Повторюсь, у нас уже лежит ранее зашифрованный файл. При его чтении происходит следующее, выделяется буфер размером таким же как этот зашифрованный файл и заполняется этими данными, зашифрованными данными. Он называется swappedBuffer. Создается еще один буфер уже в PostRead, называется origBuf, для расшифрованного содержимого. И у origBuf размер ТАКОЙ ЖЕ как и у swappedBuffer. При этом мы знаем, что размер зашифрованных данных будет вегда больше чем реальных. Это связанно с блоками в AES алгоритме, в моем случае блоки кратны 16 байт. Во время копирования из swappedBuffer в origBuf происходит расшифровка. В итоге в origBuf будет лежать реальный контент файла. НО этот буфер велик для реальных данных и по этому при открытии файла я вижу в конце лишние байты(символы).

Создается origBuf буфер всего одной строчкой кода:

origBuf = MmGetSystemAddressForMdlSafe(iopb->Parameters.Read.MdlAddress, NormalPagePriority);

И как так получается, что этот буфер равняется размеру swappedBuffer для меня загадка.
Я искал переменную, которая показывала бы размер файла, который считывается, например length = 64 байта, а после расшифрования присвоить ей реальный размер, там length = 55. Как бы принудительно сказать системе, что там 55 байт, а не 64. Но не находил такого. И еще в добавок все переменные структур, которые я просматривал, связанные с размером файла по 512 байт.

И того сейчас так
strlen(origBuf) = strlen(swappedBuffer) = 64 байт
в реале, для нашего примера, должно быть так
strlen(origBuf) = 55 байт, а strlen(swappedBuffer) = 64 байт
нужно как-то такое обойти, но не могу найти или придумать что-либо как усечь размер origBuf до нужно нам размера.
Вообще можно смухлевать в драйвере с размерами файлов?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.