Задача такая: Есть зашифрованный файл данных, при запуске программы он дешифруется, но как в таком случае запретить пользователю скопировать не зашифрованный файл??? И такое возможно.
Здравствуйте, white_znake, Вы писали:
_> Задача такая: Есть зашифрованный файл данных, при запуске программы он дешифруется, но как в таком случае запретить пользователю скопировать не зашифрованный файл??? И такое возможно.
Все можно сломать. Для простоты пусть либо программа в памяти хранит расшифрованный файл, либо создай его где нибудь в каталоге temp.
Hello white_znake, you wrote:
> Задача такая: Есть зашифрованный файл данных, при запуске > программы он дешифруется, но как в таком случае запретить пользователю > скопировать не зашифрованный файл???
Открыть его (расшифрованную версию) с эксклюзивными правами на
чтение/запись.
> И такое возможно.
Защититься на 100% не получится.
ЗЫ: А на NTFS можно расшифрованные данные писать не в файл, а прицепиться
к какому-нибудь файлу и писать в stream (или как там это называется).
Что-то типа такого:
================================
procedure TForm1.Button1Click(Sender: TObject);
var
Filter: IFilter;
Storage: IStorage;
Res: HRESULT;
begin
Res:= LoadIFilter('C:\Test.mp3', Storage, Filter);
Caption:= IntToHex(Res, 1);
end;
procedure TForm1.Button3Click(Sender: TObject);
var
hFileStream: THandle;
Num: Cardinal;
Buf: array[0..2048] of Char;
begin
hFileStream:= CreateFile('C:\Test.mp3:mystream',
GENERIC_READ or GENERIC_WRITE,
0,
nil,
OPEN_ALWAYS,
0,
0);
if hFileStream <> INVALID_HANDLE_VALUE then
try
WriteFile(hFileStream, 'Hello World', Length('Hello World'), Num,
nil);
SetFilePointer(hFileStream, 0, nil, FILE_BEGIN);
ReadFile(hFileStream, Buf, SizeOf(Buf)-1, Num, nil);
Buf[Num]:= #0;
MessageBox(0, Buf, 'File Stream Test', MB_OK);
finally
CloseHandle(hFileStream);
end;
end;
Здравствуйте, Slava Antonov, Вы писали:
SA>Hello white_znake, you wrote:
>> Задача такая: Есть зашифрованный файл данных, при запуске >> программы он дешифруется, но как в таком случае запретить пользователю >> скопировать не зашифрованный файл???
SA>Открыть его (расшифрованную версию) с эксклюзивными правами на SA>чтение/запись.
>> И такое возможно.
SA>Защититься на 100% не получится.
SA>ЗЫ: А на NTFS можно расшифрованные данные писать не в файл, а прицепиться SA>к какому-нибудь файлу и писать в stream (или как там это называется). SA>Что-то типа такого: SA>================================ SA>
SA>-- SA>Всего хорошего, Слава SA>http://slava.users.otts.ru
Вообще идея хороша, но файл может быть размером до 10 Мб., а твое решение это фактически держать в памяти расшифрованный файл. Мне бы хотелось узнать о том, можно ли перехватить пользовательское обращение к защищаемому файлу на уровне Win API, или это не возможно(придется копать в DDK)?
_>Вообще идея хороша, но файл может быть размером до 10 Мб., а твое решение это фактически держать в памяти расшифрованный файл.
а где Slava такое написал? нет не так
_>Мне бы хотелось узнать о том, можно ли перехватить пользовательское обращение к защищаемому файлу на уровне Win API, или это не возможно(придется копать в DDK)?
только через фильтр, т.е. только через DDK . и в поиске это есть
Hello white_znake, you wrote:
> Вообще идея хороша, но файл может быть размером до 10 Мб., а твое > решение это фактически держать в памяти расшифрованный файл.
Нет. Это запись/чтение на диск. В NTFS файлы — набор атрибутов.
Среди них выделяется такой атрибут — как основной поток (возможно я
напутал с названиями, но это не важно, смысл тот же). Так вот, основной
поток — это то, что мы привыкли считать файлом. Но никто не мешает создать
дополнительные потоки, что и делает мой код.
Прикол собственно в том, что функция GetFileSize возвращает размер
основного потока (какой функцией узнать размер всех потоков — не знаю).
Поэтому если смотреть размер файла из проводника, far или т.п. то кажется,
то размер файла остался прежним.
Здравствуйте, Slava Antonov, Вы писали:
SA>Прикол собственно в том, что функция GetFileSize возвращает размер SA>основного потока (какой функцией узнать размер всех потоков — не знаю).
Одной функции, вроде, нет, их перебрать можно. См. функции Stg*.