Thomas Meinike: Bookmarks unter IE (W2k)

Beitrag lesen

Hallo,

[Nachtrag 2]

Wichtig: Das letzte Byte ist eine Pruefsumme, also nur die ersten 8 Bytes sind relevant.

Diese Pruefsumme hat mich auch noch interessiert, da sich damit die Gueltigkeit des Modified-Strings pruefen lassen sollte. Ich habe keine direkten Hinweise gefunden, aber mal mit den Modified-Daten experimentiert.

Beim Addieren der Dezimalwerte der ersten 8 Hex-Bytes und Subtrahieren des Pruefbyte-Dezimalwertes ergab sich entweder 768 oder 1024. Genauer: NTFS liefert 768 und FAT32 1024. Vermutlich gibt es noch weitere Werte.

Hier nochmal der Ausgangscode mit Pruefbedingung und einigen Testbeispielen:

<?php

// Beispiel-Modified-Werte
$mod1="D07FF63D8869C40138"; // 14.07.2004 09:52:14 (1024)
$mod2="C03490B307DCC301DE"; // 16.01.2004 08:06:53 (768)
$mod3="20F06BA06D07BD014D"; // 13.12.1997 02:20:06 (768)
$mod4="3099E08EBCC2C30179"; // 15.12.2003 03:36:00 (1024)
$mod5="C02571CDCBC2C30174"; // 15.12.2003 05:25:07 (1024)
$mod6="A0B47184A25AC00106"; // 30.11.2000 07:52:41 (1024)
$mod7="205095AA2E84C30125"; // 26.09.2003 01:04:06 (768)
$mod8="A017BFF0CC5AC40151"; // 25.06.2004 03:56:13 (1024)

// Modified-Wert auswaehlen
$mod=$mod1;

// Modified-String zerlegen
$high_dword=substr($mod,14,2).substr($mod,12,2).substr($mod,10,2).substr($mod,8,2);
$low_dword=substr($mod,6,2).substr($mod,4,2).substr($mod,2,2).substr($mod,0,2);
$pruef_summe=substr($mod,16,2);

// Teil-String zur Datum/Zeit-Bestimmung mit Gueltigkeitspruefung
$mod_neu=$high_dword.$low_dword;
$pruef_arr=explode(" ",trim(chunk_split($mod_neu,2," ")));
$pruef_test=0;
for($i=0;$i<8;$i++)$pruef_test+=hexdec($pruef_arr[$i]);
$pruef_test-=hexdec($pruef_summe);

if($pruef_test==768 || $pruef_test==1024)
{
  // Anzahl der 100-Nanosekunden-Intervalle seit 1601 in Sekunden
  $sek_ab_1601=hexdec($mod_neu)/1e7;

// Sekunden zwischen 1601 und 1970 ermitteln
  $diff=0;
  $sek_tag=24*60*60;
  for($jahr=1601;$jahr<1970;$jahr++)
  {
    if(checkdate(2,29,$jahr))$diff+=366*$sek_tag;
    else $diff+=365*$sek_tag;
  }

$sek_ab_1970=$sek_ab_1601-$diff;
  $ausgabe=gmdate("d.m.Y h:i:s",$sek_ab_1970);
  print $ausgabe;
}
else print "Modified-Wert ist nicht gueltig!\n";

?>

MfG, Thomas