2012-11-22 32 views
4

我昨天下載了一個程序,它用於加密和安全。除非有人問我,否則我不會在這裏命名,但它具有使指定文件夾內的文件完全不可見的功能。如何使文件真正隱藏在目錄中?

我已經隱藏的文件和文件夾 - 選擇,也隱藏受保護的操作系統文件 - 未選但這些文件從視圖中完全消失,不以搜索顯示無論是。我將這個文件夾從VMware Workstation複製到我的主機上,並且文件仍然超級隱藏!根據Windows,文件夾中有零個文件。

這怎麼巫術magick可能嗎?我想在我自己的加密程序中使用Delphi進行模擬。我還沒有找到任何方式在這裏,並通過谷歌,建議如何可能,但實際的程序幫助文件說,他們仍然在文件夾中,但不註冊大多數正常的Windows軟件處理文件。

這是那些問題,我不能給任何代碼,以顯示我曾經試過一次,而是開到了什麼,我可以嘗試也許這裏有人知道它到底是怎麼做的建議嗎?

+4

您希望我們幫助您構建rootkit嗎? –

+0

@DavidHeffernan - 我沒有興趣構建rootkit,也沒有任何其他形式的討厭的東西。我只是想知道如何以這種方式隱藏這些文件。我目前正在尋找來自bummi的答案。 – Shambhala

+0

你所描述的技術術語是rootkit。 –

回答

7

由於更少信息 一個擁有將在NTFS上使用替代文件流,它可以添加到文件和文件夾。你可以在comandline上輸入「notepad C:\ temp:hidden1.txt」來試試這個,如果你選擇yes,那麼將創建新的文件流。保存後,您可以按照相同的方式重新打開它。這也可以從delphi完成(加載/保存)。只有在使用NTFS時纔會有效。 我不知道,如果在描述的情況下使用這種方法時,發現廣告可以用下面的代碼來完成:

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); 
+0

這太棒了!我剛剛閱讀了很多內容,並在.txt文件中隱藏了文本。在某種程度上,它有點像隱寫術? – Shambhala

+1

+1不錯!現在,我該如何刪除「C:\ temp:hidden1.txt」? :-P – kobik

+0

刪除不是那麼容易,不幸的是我只能提供德文鏈接http://de.wikipedia.org/wiki/Alternativer_Datenstrom,或許有人知道英文 – bummi