Как сделать файлы действительно скрытыми в каталоге?

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

У меня есть Скрытые файлы и папки - Выбрано, а также Скрыть защищенные файлы операционной системы - Не выбрано, но файлы полностью исчезли из просмотра и не отображаются в поиске. Я скопировал папку с VMware Workstation на мой основной компьютер, и все же файлы были супер скрыты! В папке нет файлов в соответствии с Windows.

Как возможна эта магия вуду? Я хочу подражать этому, используя Delphi в моей собственной программе шифрования. Я не нашел здесь и в Google никакого способа, который бы подсказывал, как это возможно, но в самом файле справки по программам говорится, что они все еще находятся в папке, но не регистрируются в большинстве обычных программ Windows, которые обрабатывают файлы.

Это один из тех вопросов, где я не могу дать какой-либо код, чтобы показать то, что я пробовал, а скорее открыт для предложений того, что я могу попробовать, или, может быть, кто-то здесь точно знает, как это делается?

1 ответ

Решение

Так как меньше информации. Одна возможность - использовать альтернативные файловые потоки в NTFS, которые можно добавлять в файлы и папки. Вы можете просто попробовать это, набрав "notepad C:\temp:hidden1.txt" в командной строке, если вы ответите "да", будет создан новый файловый поток. После сохранения вы можете открыть его точно так же. Это также можно сделать из Delphi (загрузка / сохранение). Будет работать только при использовании NTFS. Я не знаю, используется ли этот метод в описанном случае, найти ADS можно с помощью следующего кода:

unit u_ListADS;

// 20120928 by Thomas Wassermann
// www.devworx.de
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, StrUtils;

 Procedure GetADS(List: TStrings; const Path, WildCard: String; Recursiv: Boolean = false);

function NtQueryInformationFile(FileHandle: Cardinal; IoStatusBlock: Pointer; FileInformation: Pointer; FileInformationLength: Cardinal;
  FileInformationClass: Cardinal): Cardinal; stdcall; external 'ntdll.dll';

implementation

type
  _FILE_STREAM_INFORMATION = record
    NextEntryOffset: Cardinal;
    StreamNameLength: Cardinal;
    StreamSize: int64;
    StreamAllocationSize: int64;
    StreamName: array [0 .. MAX_PATH] of WideChar;
  end;

  PFILE_STREAM_INFORMATION = ^_FILE_STREAM_INFORMATION;

function GetStreams(aFilename: String): TStringList;
var
  FileHandle: Integer;
  FileName: array [0 .. MAX_PATH] of WideChar;
  StreamName: String;
  InfoBlock: _FILE_STREAM_INFORMATION;
  StatusBlock: record Status: Cardinal;
                      Information: PDWORD;
               end;

  Procedure Analyze;
    begin
      CopyMemory(@FileName, @InfoBlock.StreamName, InfoBlock.StreamNameLength);
      StreamName := Copy(Filename, 1, PosEx(':', Filename, 2) - 1);
      if StreamName <> ':' then Result.Add(StreamName);
    end;
begin
  Result := TStringList.Create;
  FileHandle := FileOpen(aFilename, GENERIC_READ);
  NtQueryInformationFile(FileHandle, @StatusBlock, @InfoBlock, SizeOf(InfoBlock), 22);
  FileClose(FileHandle);
  if InfoBlock.StreamNameLength <> 0 then
    Repeat

      if (InfoBlock.NextEntryOffset <> 0) then
        begin
        InfoBlock := PFILE_STREAM_INFORMATION(PByte(@InfoBlock) + InfoBlock.NextEntryOffset)^;
        Analyze;
        end;
    until InfoBlock.NextEntryOffset = 0
end;

Procedure GetADS(List: TStrings; const Path, WildCard: String; Recursiv: Boolean = false);
  Var
    SR: SysUtils.TSearchRec;
    RES: Integer;
    SP: String;
    StreamList: TStringList;
    i: Integer;
  begin
    if length(Path) = 0 then
      exit;
    if length(WildCard) = 0 then
      exit;
    SP := IncludeTrailingBackSlash(Path) + WildCard;
    RES := FindFirst(IncludeTrailingBackSlash(Path) + '*.*', faDirectory, SR);
    While RES = 0 Do
    Begin
      If (SR.attr And faDirectory) <> 0 Then
        If SR.Name[1] <> '.' Then
          if Recursiv then
            GetADS(List, IncludeTrailingBackSlash(Path) + SR.Name, WildCard, Recursiv);
      RES := FindNext(SR);
    End;
    SysUtils.FindClose(SR);
    RES := FindFirst(SP, $27, SR);
    While RES = 0 Do
    Begin
      StreamList := GetStreams(IncludeTrailingBackSlash(Path) + SR.Name);
      for i := 0 to StreamList.Count - 1 do
        List.Add(IncludeTrailingBackSlash(Path) + SR.Name + StreamList[i]);
      StreamList.Free;
      RES := FindNext(SR);
    End;
    SysUtils.FindClose(SR);
  end;

end.

Вызов может быть, например,

  GetADS(Listbox1.Items,Directory.Text, WildCards.Text,rekursiv.checked);
Другие вопросы по тегам