Sie interessieren sich für die Schaltung von Werbung auf Gaijin.at?
Hier finden Sie weitere Informationen und interessante Möglichkeiten dazu.

Expert Witness Compression

Inhalt

Allgemeines
Header
Sektionen
Die Sektion "header"
Die Sektion "volume" bzw. "disk"
Die Sektion "table"
Die Sektion "error2"
Die Sektion "hash"
Beispiel zur Sektionsaufteilung

Allgemeines

Das Expert Witness Compression Dateiformat dient zur komprimierten Speicherung von Daten, auf die auch ohne vollständige Dekomprimierung zugegriffen werden kann. Dies wird dadurch erreicht, dass jeweils nur einzelne Datenblöcke in der Größe von 32 Kilobyte komprimiert und in die Datei geschrieben werden. Damit eignet sich dieses Format besonders zur Speicherung von Datenträgerimages, da gezielt und schnell auf bestimmte Datenbereiche zugegriffen werden kann. Weiters kann ein Image auf mehrere Dateien (Segmente) aufgeteilt werden.

Die Firma Guidance nutzt für das Programm EnCase eine erweiterte Variante des Expert Witness Compression Formats. Diese Erweiterung besteht hauptsächlich in der Verwendung einer zusätzlichen Sektion, die den MD5-Hash der gesicherten (vom Originaldatenträger eingelesenen) Daten enthält.

Diese Beschreibung bezieht sich ausschließlich auf die von Guidance EnCase verwendete Version.

Header

Jede Datei beginnt mit einem 13 Byte langen Header, der sich wie folgt aufbaut:

OffsetLängeBedeutung
08 BytesMagic-Bytes (0x45 56 46 09 0d 0a ff 00)
81 ByteImmer 0x01
91 WordSegmentnummer
111 WordImmer 0x0000

Sektionen

Im Anschluss an den Header folgen die einzelnen Sektionen. Jede Sektion beginnt mit einem Header, der aus 76 Byte besteht:

OffsetLängeBedeutung
016 BytesSektionstyp (String)
161 QWordOffset der nächsten Sektion
241 WordLänge der Sektion
3240 BytesFüllzeichen (0x00...)
721 DWordCRC-Wert der vorangegangenen Header-Daten (72 Bytes)

Als Sektionstyp können folgende Strings eingetragen sein:

header
Hier sind Informationen zum Image eingetragen, wie z.B. die Fall-Nummer oder das Erstellungsdatum.
volume / disk
In dieser Sektion sind Partitionsdaten enthalten, falls es sich um eine einzelne Partition oder um eine Diskette bzw. CD handelt. In diesem Fall trägt die Sektion den Namen "volume". Wenn der Inhalt aus einer Festplatte besteht, sind in dieser Sektion die Datenträgerinformationen eingetragen und die Sektion heißt "disk". Diese Sektion existiert nur im ersten Segment (= der ersten Datei) des Image.
table
Diese Sektion enthält die Offsets der Datenblöcke. Es können mehrere table-Sektionen pro Segment (Datei) existieren.
sectors oder data
In dieser Sektion sind die Daten enthalten. Es können mehrere sectors-Sektionen pro Segment (Datei) existieren.
error2
In der error2-Sektion werden die fehlerhaften Bereiche gespeichert, die nicht vom Originaldatenträger gelesen werden konnten.
hash
In der hash-Sektion wird der MD5-Hash gespeichert. Diese Sektion ist nur im letzten Segment (Datei) des Images vorhanden.
next bzw. done
Am Ende einer Datei existiert entweder eine next-Sektion oder eine done-Sektion. Diese Sektionen enthalten keine Daten und der Offset-Pointer verweist auf die Sektion selbst. Handelt es sich bei der Datei um die letzte Datei eines Images, wird "done" verwendet, anderenfalls "next".

Endet ein Sektionsname mit "2", also etwa "header2" oder "table2", handelt es sich um eine Kopie der vorhergehenden, gleichnamigen Sektion. Eine Ausnahme bildet nur die Sektion "error2".

Der CRC-Wert wird mit folgender Funktion berechnet:

Quellcode (Object Pascal)
function Expert_Witness_Compression_CRC(const sString: String; iPrevKey: DWord = 1): DWord;
var
  Buf: String;
  b, d: DWord;
  i: Integer;
begin
  Buf := sString;
  b := iPrevKey and $ffff;
  d := (iPrevKey shr 16) and $ffff;
  for i := 1 to Length(sString) do begin
    Inc(b, Ord(Buf[i]));
    Inc(d, b);
    if ( (<> 0) and ( (mod $15b0 = 0) or (= Length(sString)) ) ) then begin
      b := b mod $fff1;
      d := d mod $fff1;
    end;
  end;
  Result := ((shl 16) or b);
end;
Quellcode (C++)
uint Expert_Witness_Compression_CRC(void *buffer, int buffersize, uint prevkey)
{
  unsigned char *cbuffer = (unsigned char *)buffer;
  unsigned int b = prevkey & 0xffff;
  unsigned int d = (prevkey >> 16) & 0xffff;

  for(int i=0; i < buffersize; i++)
  {
    b += cbuffer[i];
    d += b;
    if ( i != 0 && ( (% 0x15b0 == 0) || (== buffersize - 1) ) )
    {
      b = b % 0xfff1;
      d = d % 0xfff1;
    }
  }
  return (<< 16) | b;
}

Beim ersten Aufruf der Funktion muss "prevkey" der Wert "1" übergeben werden, damit ein neuer CRC-Wert errechnet wird.

Die Sektion "header"

Die gesamte Sektion (ab Offset 76) enthält mit "zLib" komprimierte Daten. Der Inhalt ist ein mehrzeiliger Text, wovon in der ersten Zeile nur die Zahl "1" und in der zweiten Zeile der Text "main" enthalten ist. Die dritte Zeile enthält Kürzel, die mit Tabulatoren voneinander getrennt sind und sich auf den Inhalt der Tabulatorenfelder in der vierten Zeile bezieht, die die eigentlichen Informationen enthält.

Beispiel
1
main
c             n                 a                    ...
Case Number   Evidence Number   Unique Description   ...

Folgende Abkürzungen sind möglich:

AbkürzungBedeutung
cAktenzahl
nEindeutige Nummer des Beweismittels
aEindeutige Beschreibung
eName des Erstellers
tNotizen
mDatum und Zeit der Erstellung
Das Format ist: "yyyy m d h n s", z.B.: "2006 10 26 14 08 32", was dem 26.10.2006, 14:08:32 Uhr entspricht.
uSystemzeit
Die Systemzeit hat das gleiche Format wie die Erstellungszeit.
p"pwhash" (sollte immer "0" sein)
rArt der Komprimierung
Mögliche Werte sind:
"b" für beste Komprimierung
"f" für schnelle Komprimierung (Standard)
"n" für keine Komprimierung
avVersionsnummer von EnCase
ovName und Version des Betriebssystems

Die Sektion "volume" bzw. "disk"

OffsetLängeBedeutung
761 DWordReserviert
801 DWordAnzahl der Cluster
841 DWordSektoren pro Cluster
881 DWordBytes per Sektor
921 DWordAnzahl der Sektoren
9620 BytesReserviert (0x00...)
116 Füllzeichen (0x00...)
Ende-41 DWordCRC-Wert der vorangegangenen Header-Daten (72 Bytes)

Die Sektion "table"

OffsetLängeBedeutung
761 DWordAnzahl der Einträge in dieser Tabelle ([cnt])
8016 BytesFüllzeichen (0x00...)
961 DWordCRC-Hash der vorangegangenen Daten, beginnend bei Offset 76
100[cnt] * 4 BytesOffset-Array
Ende - 41 DWordCRC-Hash der vorangegangenen Daten, beginnend bei Offset 100

Der Offset-Array besteht aus DWord-Werten, die die Positionen der einzelnen Datenblöcke in der sectors-Sektion angeben. Diese Positionsangaben beziehen sich jedoch auf den Anfang der Datei und nicht auf den Beginn einer sectors-Sektion.

Der Offset-Array kann bis zu 16.375 Einträge haben, jedoch können mehrere table-Sektionen in einer Datei existieren.

Die Einschränkung auf 16.375 Einträgen ergibt sich aus dem Umstand, dass das höherwertigste Bit des DWord-Wertes angibt, ob die Daten komprimiert sind oder nicht. Hier ein Codebeispiel dazu:

Code-Beispiel (Obejct Pascal)
if ((Offset and $80000000) = $80000000) then begin
  Offset := Offset - $80000000;
  Decompress := True;
end else begin
  Decompress := False;
end;

Die Sektion "error2"

OffsetLängeBedeutung
761 DWordAnzahl der Einträge in der Tabelle ([cnt])
80512 BytesFüllzeichen (0x00...)
5921 DWordCRC-Hash der vorangegangenen Daten, beginnend bei Offset 76
596[cnt] * 8 BytesFehler-Array
Ende - 41 DWordCRC-Hash der vorangegangenen Daten, beginnend bei Offset 596

Die Einträge im Fehler-Array bestehen aus zwei DWord-Werten, wobei der erste die Sektornummer und der zweite die Sektoranzahl des fehlerhaften Bereichs angibt.

Die Sektion "hash"

OffsetLängeBedeutung
7616 BytesMD5-Hash
921 DWordCRC-Hash der vorangegangenen Daten, beginnend bei Offset 76

Der MD5-Hash wird mit den dekomprimierten Daten aus den sectors-Sektionen (in Verbindung mit den table-Sektionen) aller Segmente (Dateien) errechnet.

Beispiel zur Sektionsaufteilung

Im folgenden Beispiel sind nur die Sektionsnamen in ihrer Reihenfolge aufgeführt. Es wird angenommen, dass das Image aus zwei Segmenten (Dateien) besteht.

Segment-Header 1
header2
header
volume
sectors
table
table2
sectors
table
table2
next
Segment-Header 2
sectors
table
table2
sectors
table
table2
error2
hash
done

Beta-Bereich | Webmaster | Sponsor / Werbung | Übersetzer | Unterstützung | Kontakt & Nutzungsbedingungen