Как сделать файлы действительно скрытыми в каталоге?
Я вчера скачал программу, она для шифрования и безопасности. Я не буду называть его здесь, пока кто-то не попросит меня об этом, но у него есть возможность сделать файлы в указанной папке полностью невидимыми.
У меня есть Скрытые файлы и папки - Выбрано, а также Скрыть защищенные файлы операционной системы - Не выбрано, но файлы полностью исчезли из просмотра и не отображаются в поиске. Я скопировал папку с 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);