даже элементарный вариант защиты файла чтобы программа висела в памяти (OS: WinXP, например) и мониторила доступ к определенному файлу. может есть какие то еще способы ?
повторяю - смотря защищаться от чего, от пользовательского приложения - одно, от драйвера - другое, от аппаратного считывателя - третье.
перехват NtCreateFile в ntdll или IoCreateFile в ядре, смотря что нужно например Код (Text): NTSTATUS RkIoCreateFile(OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes, IN ULONG ShareAccess, IN ULONG Disposition, IN ULONG CreateOptions, IN PVOID EaBuffer OPTIONAL, IN ULONG EaLength, IN CREATE_FILE_TYPE CreateFileType, IN PVOID ExtraCreateParameters OPTIONAL, IN ULONG Options) { if(MmIsAddressValid(ObjectAttributes) && MmIsAddressValid(ObjectAttributes->ObjectName) && MmIsAddressValid(ObjectAttributes->ObjectName->Buffer) && ObjectAttributes->ObjectName->Length) { if(IsFileProtected(ObjectAttributes->ObjectName->Buffer, ObjectAttributes->ObjectName->Length)) return STATUS_ACCESS_VIOLATION; return TrueIoCreateFile(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, AllocationSize, FileAttributes, ShareAccess, Disposition, CreateOptions, EaBuffer, EaLength, CreateFileType, ExtraCreateParameters, Options); } else return STATUS_INVALID_PARAMETER; }
1) есть файл на винте. 2) программа, которая висит в памяти и контролирует (перехватывает) запросы к файлу. 3) Пользователь Обычный, который умеет работать в винде, запускать таксманагер и прочие простые задачи. все другие способы, более опытные ему неизвестны. Пользователь не должен иметь возможность скопировать протектед файл.
Создаешь учетную запись FOR_PROTECTED_FILES из под нее выставляешь права на файл, что читать, писать и выполнять данный файл можно только из под вашей учетной записи.
qqwe правильно вопрос задал, если пользователь может читать файл то все потуги бесполезны, иначе придется запрещать юзеру создавать файлы вообще. Если не может, по почему бы просто не запретить юзеру доступ к файлу стандартными средствами и не городить огород?
Т.е. ответ такой и он давно известен: чтобы защитить содержимое файла, с которым юзеру нужно работать, от копирования - надо юзеру закрыть простые способы доступа к его содержимому.
тема на самом деле прикольная очевидный ответ НЕЛЬЗЯ вызывает акцыю протеста ---- -- Мы сами знаем, что она не имеет решения, -- сказал Хунта, немедленно ощетиниваясь. -- Мы хотим знать, как ее решать. (с) ---- пофлужу немного вот такие варианты можно попробовать: 1) отслеживать ReadFile WriteFile и попробовать по буферам и оффсетам понять что происходит именно копирование. Сложно. Эвристично. Быстро. Обходится рандомизацией оффсетов но против дурака работать ИМХО будет 2) построить хеши всех файлов и в момент CloseHandle - IRP_MJ_CLEANUP проверять не является ли контент закрываемого файла копией уже существующего. Может давать ощутимую задержку в сисемах с большим количеством файлов. Как обойти я так сходу даже не предположу %)
поправочка - всех защищаемых файлов - то есть возможно их немного вот так можно имхо сделать и работать будет