4

昨日プログラムをダウンロードしました。暗号化とセキュリティのためです。誰かに言われない限り、ここでは名前を付けませんが、指定したフォルダ内のファイルを完全に非表示にする機能があります。

隠しファイルと隠しフォルダがあります-選択され、保護されたオペレーティングシステムファイルも非表示になります-選択されていませんが、ファイルは完全に表示されなくなり、検索にも表示されません。フォルダーをVMwareWorkstationからメインマシンにコピーしましたが、ファイルは非常に非表示になっています。Windowsによると、フォルダ内のファイルはゼロです。

このブードゥー魔術はどのように可能ですか?自分の暗号化プログラムでDelphiを使用してこれをエミュレートしたいと思います。私はこことGoogleを介して、それがどのように可能であるかを示唆する方法を見つけられませんでしたが、実際のプログラムのヘルプファイルには、それらはまだフォルダーにあると書かれていますが、ファイルを処理するほとんどの通常のWindowsソフトウェアには登録されていません。

これは、私が試したことを示すコードを与えることができない質問の1つですが、私が試すことができることの提案を受け入れるか、おそらくここの誰かがそれがどのように行われるかを正確に知っていますか?

4

1 に答える 1

7

情報が少ないため、1つの可能性は、ファイルやフォルダに追加できるNTFS上の代替ファイルストリームを使用することです。comandlineで「notepadC:\ 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);
于 2012-11-22T06:48:22.973 に答える