AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) ADS Streams auslesen mit BackupRead und ReadBuffer
Thema durchsuchen
Ansicht
Themen-Optionen

ADS Streams auslesen mit BackupRead und ReadBuffer

Ein Thema von Luckie · begonnen am 10. Okt 2007 · letzter Beitrag vom 10. Okt 2007
Antwort Antwort
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

ADS Streams auslesen mit BackupRead und ReadBuffer

  Alt 10. Okt 2007, 16:08
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?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
suni

Registriert seit: 19. Sep 2007
17 Beiträge
 
#2

Re: ADS Streams auslesen mit BackupRead und ReadBuffer

  Alt 10. Okt 2007, 17:49
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: ADS Streams auslesen mit BackupRead und ReadBuffer

  Alt 10. Okt 2007, 20:22
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:25 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