Страница 1 из 2

Как же всё-таки удалить файл без "хвостов"?

СообщениеДобавлено: 17.05.2016 22:02:43
shyub
Как же всё-таки удалить файл без "хвостов"?
Этот вопрос косвенно уже поднимался в теме "Как предотвратить восстановление удалённых данных?" viewtopic.php?f=13&t=11094. Дело в том, что если заменить содержимое файла, допустим, нулями, а затем выполнить удаление (сразу же или через несколько минут), то на диске сохраняется первоначальный текст. Если же в промежуток времени, между заменой содержимого и удалением открыть этот файл, например, "Блокнотом", то на диске остаются только нули. Причём во всех секторах. Специально сделал несколько относительно больших файлов, которые OC разбросала по всему диску, и проверял WinHex-ом.
Посоветуйте, как можно решить эту задачу?
У меня есть одна идея, связанная с запуском между заменой содержимого и стиранием чего-то типа "Блокнота", но может есть лучший вариант...

Re: Как же всё-таки удалить файл без "хвостов"?

СообщениеДобавлено: 17.05.2016 22:54:16
runewalsh
Ты флушнул записанное перед этим? Желательно через API ОС (FlushFileBuffers на TFileStream.Handle). Всё равно может не сработать, как и чтение из другого процесса: слишком много слоёв абстракции, каждый из которых норовит что-то закешировать и оптимизировать. Так, задним числом можно предположить, что да, запросы к файлу, который всё равно предполагается тут же удалить, до физического устройства не доходят.

Re: Как же всё-таки удалить файл без "хвостов"?

СообщениеДобавлено: 17.05.2016 23:48:35
MysticCoder
Ага, открыть файл повторно самому

Re: Как же всё-таки удалить файл без "хвостов"?

СообщениеДобавлено: 18.05.2016 07:41:59
shyub
Ты флушнул записанное перед этим?
Нет. Я открываю файл средствами FPC без прямого использования API. Надо попробовать.

Re: Как же всё-таки удалить файл без "хвостов"?

СообщениеДобавлено: 18.05.2016 10:59:41
debi12345
Да зашифруйте этот файл (ессно не блочно, а целиком) паролем например "12345" и даже опубликуйте этот пароль на весь Интернет, и забивайте нулями перед удалением - но уже без шифрования. Хоть один сектор файла затрется нулями - информация в других секторах станет полным мусором.

Re: Как же всё-таки удалить файл без "хвостов"?

СообщениеДобавлено: 18.05.2016 11:49:30
Лекс Айрин
debi12345 писал(а):Хоть один сектор файла затрется нулями - информация в других секторах станет полным мусором.


вообще-то не совсем так. просто трудоемкость возрастает.

Re: Как же всё-таки удалить файл без "хвостов"?

СообщениеДобавлено: 18.05.2016 14:42:12
debi12345
вообще-то не совсем так.

Один сектор, реально принадлежавший файлу, по-любому затрется - либо при забивании нулями, либо когда будет отдан другому файлу или каталожной структуре. Поэтому думаю что 100% надежное решение.

Re: Как же всё-таки удалить файл без "хвостов"?

СообщениеДобавлено: 18.05.2016 17:40:47
shyub
Попробовал в интервале между затиранием и стиранием запускать другое приложение через TProcess. Эффект нулевой: в файловой системе файл удаляется, а всё содержимое остаётся на диске. Вероятно, ОС зная, что это дочерний процесс, не сбрасывает на физический диск данные.

Re: Как же всё-таки удалить файл без "хвостов"?

СообщениеДобавлено: 18.05.2016 17:47:39
debi12345
Попробовал в интервале между затиранием и стиранием

Шифруйте файл в рабочем режиме, а перед удалением затирайте без шифрования - должно помочь!

в файловой системе файл удаляется

Это еще зависит от файловой системы - FAT, NTFS, Ext,.. - поэтому вообще нельзя закладываться на сброс буферов и т.п.

Добавлено спустя 5 минут 2 секунды:
На само деле если кому-то ну ооочень надо прочитать этот файл, то он может тупо нажать "резет" во время работы проги - чтобы прога не успела удалить файл, и после перезагрузки...

Re: Как же всё-таки удалить файл без "хвостов"?

СообщениеДобавлено: 18.05.2016 18:06:56
Лекс Айрин
debi12345 писал(а):Поэтому думаю что 100% надежное решение.


но данные то восстановить реально.пусть частично, но иногда и этого много.

debi12345 писал(а): то он может тупо нажать "резет"


тогда уж с розетки дернуть.

Re: Как же всё-таки удалить файл без "хвостов"?

СообщениеДобавлено: 19.05.2016 13:15:00
shyub
Воспользовался советом runewalsh:
Ты флушнул записанное перед этим?

Получился вот такой код:
Код: Выделить всё
procedure TForm1.EraseFileDisk(Path: String);
var
  bf: THandle;
  n: Longint;
  z: DWORD;
  M: array[1..256] of Byte;
begin
  for z:=1 to 256 do M[z]:=0;
  n:=FileSize(UTF8ToWinCP(Path));
  try
    bf:=CreateFile(PChar(Path),GENERIC_READ or GENERIC_WRITE, 0, Nil, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    SetFilePointer(bf,0,nil,FILE_BEGIN);
    while n>1 do begin
      if n>255 then z:=256
      else z:=n;
      WriteFile(bf,M,z,z,nil);
      FlushFileBuffers(bf);
      n:=n-z;
    end;
  finally
    CloseHandle(bf);
  end;
end;

После этой процедуры сразу идёт удаление.
Код: Выделить всё
DeleteFileUTF8(PChar(Path));

В результате перед удалением файла все данные на физическом диске затираются нулями, что, в принципе, и требовалось.
Тему можно закрывать.

Re: Как же всё-таки удалить файл без "хвостов"?

СообщениеДобавлено: 19.05.2016 14:24:37
debi12345
Как решили проблему резета-выключения питания во время работы проги, не дающих проге затереть+удалить файл ?

Re: Как же всё-таки удалить файл без "хвостов"?

СообщениеДобавлено: 19.05.2016 23:43:47
GAMER
А можно узнать о задаче более детально? Файл создается только во время работы программы, и требуется не оставлять следов? Так может лучше вообще в памяти все держать? Или файл слишком большой?

Добавлено спустя 22 минуты 51 секунду:
PS. Уже прочитал базовую тему.

Re: Как же всё-таки удалить файл без "хвостов"?

СообщениеДобавлено: 20.05.2016 07:19:04
shyub
Как решили проблему резета-выключения питания

Момент передачи данных в центральный оффис, после чего данные уничтожаются, определить сложно. Если, допустим, сеанс связи не состоялся, то состоится позже. Чисто теоретически, если всё-таки кому-то удастся предотвратить таким образом стирание, то суточная сводка или даже статистика одной точки особой ценности не представляет. Смотрите предыдущую тему.

Re: Как же всё-таки удалить файл без "хвостов"?

СообщениеДобавлено: 20.05.2016 08:31:26
debi12345
Момент передачи данных в центральный оффис, после чего данные уничтожаются, определить сложно

Кому (по какой-то причине) надо будет прочесывать диск посекторно в поисках хвостов файла, тот уж о "моменте" точно сумеет позаботиться. В 1-ю очередь на время заменит свич на хаб и поставит у себя сниффер вроде WireShark - который умеет выуживать траффик в promiscious-режиме (не только свои пакеты, но и бегающие по всей локалке)

Чисто теоретически, если всё-таки кому-то удастся предотвратить таким образом стирание, то суточная сводка или даже статистика одной точки особой ценности не представляет

Хм, это обессмысливает всю тему - мы-то подумали, что вопрос секьюрити стоИт реально серьезно. Такие вопросы желательно решать на все 100%, иначе вообще не решать :)