Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   ADS Streams auslesen mit BackupRead und ReadBuffer (https://www.delphipraxis.net/101260-ads-streams-auslesen-mit-backupread-und-readbuffer.html)

Luckie 10. Okt 2007 15:08


ADS Streams auslesen mit BackupRead und ReadBuffer
 
Ich habe folgende Routine geschrieben, um die Alternate Data Streams auszulesen:
Delphi-Quellcode:
function TMpuADS.GetDataStream: WideString;
var
  hFile            : THandle;
  hADSFile         : THandle;
  BytesRead        : DWORD;
  Context          : Pointer;
  pBuffer          : PByte;
  iLo              : DWORD;
  iHi              : DWORD;
  wcStreamName     : array[0..MAX_PATH] of WideChar;
  StreamName       : WideString;
  ReadBuffer       : array of WideChar;
begin
  Context := nil;
  Result := '';
  hFile := CreateFileW(PWideChar(FFilename), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_ALWAYS, FILE_FLAG_BACKUP_SEMANTICS,
    0);
  if hFile <> INVALID_HANDLE_VALUE then
  begin
    GetMem(pBuffer, 4096);
    while true do
    begin
      if BackupRead(hFile, pBuffer, 20, BytesRead, False, True, Context) then
      begin
        if BytesRead > 0 then
        begin
          if PWIN32StreamID(pBuffer)^.dwStreamNameSize > 0 then
          begin
            if BackupRead(hFile, @(wcStreamName[0]), PWIN32StreamID(pBuffer)^.dwStreamNameSize, BytesRead, False, True,
              Context) then
            begin
              if BytesRead <> PWIN32StreamID(pBuffer)^.dwStreamNameSize then
                Break
              else
              begin
                if PWIN32StreamID(pBuffer)^.Size > 0 then
                begin
                  SetString(StreamName, wcStreamName, PWIN32StreamID(pBuffer)^.dwStreamNameSize div 2);
                  StreamName := copy(StreamName, 2, length(StreamName));
                  StreamName := ':' + copy(StreamName, 1, pos(':', StreamName) - 1);
                  Writeln(StreamName);
                  hADSFile := CreateFileW(PWideChar(FFilename + StreamName), GENERIC_READ, FILE_SHARE_READ, nil,
                    OPEN_ALWAYS, 0, 0);
                  if hADSFile <> INVALID_HANDLE_VALUE then
                  begin
                    SetLength(ReadBuffer, PWIN32StreamID(pBuffer)^.Size);
                    if ReadFile(hADSFile, ReadBuffer[0], PWIN32StreamID(pBuffer)^.Size, BytesRead, nil) then
                      Writeln(WideString(ReadBuffer))
                    else
                      Writeln(SysErrorMessage(GetLastError));
                  end;
                end;
              end;
            end
            else
              Break;
          end;
          if PWIN32StreamID(pBuffer)^.Size > 0 then
            BackupSeek(hFile, high(DWORD), high(DWORD), iLo, iHi, @Context);
        end
        else
          Break;
      end
      else
        Break;
    end;
    BackupRead(hFile, pBuffer, 0, BytesRead, True, False, Context);
    CloseHandle(hFile);
    FreeMem(pBuffer);
  end
  else
    raise Exception.CreateFmt(rsExceptionTemplate, [GetLastError, SysErrorMessage(GetLastError)]);
end;
Die Streamnamen kan ich alle auslesen, will ich aber mit ReadFile den Inhalt auslesen, bekomm eich die Fehlermeldung:
Zitat:

Der Prozess kann nicht auf die Datei zugreifen, da ein anderer Prozess einen Teil der Datei gesperrt hat
Obwohl ich die Datei mit FILE_SHARE_READ geöffnet habe. Aber wie kan ich die Datei ein zweites mal öffnen, um den ADS auszulesen?

suni 10. Okt 2007 16:49

Re: ADS Streams auslesen mit BackupRead und ReadBuffer
 
Hallo :)

Wow also ich muss schon sagen finde es toll das du es geschafft hast diese Routine zu schreiben =)
Könnte es vielleicht sein das der Fehler wegen der blöden "Windows File Protection" entsteht?
Man bekommt durch sie ja immer fehler wie z.b kann auf den laufenden prozess nicht zugreifen / löschen / etc.
Ich hab hier mal einen RegKey rausgesucht wie sich das ganze deaktivieren lässt.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon "SFCDisable"=dword:FFFFFF9D

Kann natürlich auch sein das ich da total falsch liege...
Hoffe ich konnte dem Problem vielleicht abhilfe verschaffen :)

btw: interessiert sich sonst niemand für dieses Thema (ads)(Alternative Data Stream) ? Sehr interessant wie ich zumindest finde.
Ausserdem versteckt sich viel bösartige software in diesem ADS Filesystem die im WindowsExplorer und im System somit leider unsichtbar ist. Also lässt sich mit so einer Routine wie sie "Luckie" geschrieben hat auch nach versteckter "SpyWare" suchen ,die man so im System gar nicht wirklich finden würde :)

Dank dir nochmal vielmals für deine Großartige Arbeit Luckie ,ich hoffe es findet sich einen Weg um das problem zu lösen ;)

Luckie 10. Okt 2007 19:22

Re: ADS Streams auslesen mit BackupRead und ReadBuffer
 
Ich habe das Konzept geändert. Jetzt habe ich allerdings ein anderes Problem, aber dazu morgen mehr. Wenn ich fertig bin hab eich hoffentlich eine Klasse, mit der man Streams nicht nur lesen, sondern auch anhängen und ausführen kann.

Solche Programme zum Auslesen gibt es aber schon, zum Beispiel von Sysinternals und Richard hat hier in der Freewaresparte eins vorgestellt. Ich will allerdings noch etwas weitergehen, siehe oben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz