Wie kann eine Datei 1641 'erstellt' worden sein?

75

Vor ein paar Jahren bin ich auf diese Datei auf unserem Fileserver gestoßen.

Screenshot eines Dateieigenschaften-Dialogfelds in Microsoft Windows

Und ich frage mich, wie eine Datei sagen kann, dass sie 1641 erstellt wurde. Soweit ich weiß, wird die Zeit auf dem PC durch die Anzahl der Sekunden seit dem 1. Januar 1970 definiert. Wenn dieser Index ausfällt, können Sie den 31. Dezember 1969 erhalten (der Index sagt wahrscheinlich -1), aber ich bin diesbezüglich ratlos scheinbar zufälliges Datum, das sogar vor der Gründung der Vereinigten Staaten von Amerika liegt.

Wie könnte eine Akte also 1641 datiert werden?

PS: Die Daten sind auf Französisch. Février ist Februar.

Fredy31
quelle
29
"Soweit ich weiß, wird die Zeit auf dem PC durch die Anzahl der Sekunden seit dem 1. Januar 1970 definiert." - Auch für Systeme, auf denen dies der Fall ist, lassen sich Daten vor 1970 leicht darstellen, indem diese Zahl (als Unix-Zeitstempel bezeichnet ) negativ wird. Zum Beispiel entspricht die Unix-Zeit -1000000000 dem 1938-04-24 22:33:20.
Marcelm
1
@marcelm Ja, aber aufgrund des begrenzten Bereichs von 32-Bit-Ganzzahlen gibt es das 1901 mögliche Mindestdatum.
Slhck
14
@slhck: Ich denke, marcelm ging von einem 64-Bit-Zeitstempel aus, da dies die aktuellen Unix / Linux-Dateisysteme, Kernel und User-Space-Software verwenden. In der clock_gettime(2)Manpage finden Sie eine Definition dessen struct timespec, was statund andere Systemaufrufe verwenden, um Zeitstempel zwischen User-Space und Kernel zu übergeben. Es ist eine Struktur mit einem time_tin Sekunden und einer long tv_nsecNanosekunde. Auf 64-Bit-Systemen sind beide 64-Bit-Systeme, sodass der gesamte Zeitstempel 128 Bit (16 Byte) beträgt. (Entschuldigung für zu viele Details, ich wurde mitgerissen.)
Peter Cordes
3
Sie haben eine gute Antwort darauf, wie ein Datum im 17. Jahrhundert in die Datei gestempelt werden kann. Jetzt ist es an der Zeit, darüber nachzudenken, wie es passiert ist. Ich würde mir den Inhalt dieser wp-Datei sehr genau ansehen, um zu sehen, was hinzugefügt worden sein könnte, da dies Aufschluss darüber geben könnte, wie es passiert ist. Ich würde mir die installierten Plugins ansehen und prüfen, ob keine zwielichtig sind. Ich denke, dass etwas diese Akte änderte und versuchte, geänderte / verursachte Daten manuell zu stempeln, um zu verbergen, dass die Akte geändert wurde, aber eine Unixzeit anstelle einer Fensterzeit spezifizierte.
Thomas Carlisle
2
König Ludwig XIII. Der Gerechte demonstrierte das Bekenntnis der königlichen Linie zu PHP?
Jesse Slicer

Antworten:

106

Warum ist ein Datum aus dem 17. Jahrhundert möglich?

Windows speichert keine Zeitstempel für Dateiänderungen wie Unix-Systeme . Laut Windows Dev Center (Schwerpunkt Mine):

Eine Dateizeit ist ein 64-Bit-Wert, der die Anzahl der 100-Nanosekunden- Intervalle angibt , die seit dem 1. Januar 1601 (UTC) um 12:00 Uhr vergangen sind . Das System zeichnet die Dateizeiten auf, zu denen Anwendungen Dateien erstellen, darauf zugreifen und darauf schreiben.

Wenn Sie hier einen falschen Wert einstellen, können Sie problemlos Daten aus dem 17. Jahrhundert abrufen.

Eine andere wichtige Frage ist natürlich: Wie wurde dieser Wert festgelegt? Was ist das aktuelle Datum? Ich denke, Sie werden es nie herausfinden können, da dies einfach ein Rechenfehler im Dateisystemtreiber gewesen sein könnte. Eine andere Antwort geht davon aus, dass es sich bei dem Datum tatsächlich um einen Unix-Zeitstempel handelt, der als Windows-Zeitstempel interpretiert wird. Die Berechnung erfolgt jedoch in unterschiedlichen Intervallen (Sekunden vs. Nanosekunden).

In welcher Beziehung steht dies zum Problem des Jahres 2038?

Die Verwendung eines 64-Bit-Datentyps bedeutet, dass Windows (im Allgemeinen) nicht vom Problem des Jahres 2038 betroffen ist , das herkömmliche Unix-Systeme haben, da Unix anfänglich eine 32-Bit-Ganzzahl verwendete, die früher als die 64-Bit-Ganzzahl von Windows überläuft hat. (Dies ist trotz Unix-Betrieb in Sekunden und Windows-Betrieb in Mikro- / Nanosekunden.)

Windows ist natürlich weiterhin betroffen, wenn 32-Bit-Programme verwendet werden, die mit alten Versionen von Visual Studio kompiliert wurden.

Neuere Unix-Betriebssysteme haben den Datentyp bereits auf 64 Bit erweitert, wodurch das Problem vermieden wird. (Da Unix-Zeitstempel in Sekunden ausgeführt werden, liegt das neue Umlaufdatum in 292 Milliarden Jahren.)

Was ist das maximale Datum, das eingestellt werden kann?

Für die Neugierigen - so berechnen Sie das:

  • Die Anzahl der möglichen Werte in einem 64-Bit - Integer sind 2 63 - 1 = 9223372036854775807 .
  • Jeder Tick entspricht 100 Nanosekunden, was 0,1 µs oder 0,0000001 s entspricht.
  • Der maximale Zeitbereich wäre 9223372036854775807 ⨉ 0,0000001 s , also Hunderte von Milliarden Sekunden.
  • Eine Stunde hat 3600 Sekunden, ein Tag hat 86400 Sekunden und ein Jahr hat 365 Tage, also gibt es 86400 ⨉ 365 s = 31536000 s in einem Jahr. Dies ist natürlich nur ein Durchschnittswert, der Schaltjahre, Schaltsekunden oder Kalenderänderungen ignoriert, die zukünftige postapokalyptische Regime den verbleibenden Erdenbürgern diktieren könnten.
  • 9223372036854775807 ⨉ 0,0000001 s / 31536000 s ≈ 29247 Jahre
  • @corsiKaerklärt, wie wir Schaltjahre abziehen können: 29247/365/4 ≈ 20
  • Ihr maximales Jahr ist also 1601 + 29247 - 20 = 30828 .

Einige Leute haben tatsächlich versucht, dies einzustellen und kamen mit dem gleichen Jahr.

slhck
quelle
7
Unix (oder zumindest Linux) hat das 2038-Problem für den Kernel / die Dateisysteme auf 64-Bit-Architekturen bereits gelöst, bei denen time_tes sich um einen 64-Bit-Typ handelt. Daher verwenden Anwendungen hoffentlich time_tanstelle eines Integer-Typs einen 32-Bit- und einen 32-Bit-Typ würde Zeitstempel abschneiden ... Wie auch immer, falls jemand neugierig auf den Status des Problems war, ist es meistens gelöst, mit Ausnahme von älteren 32-Bit-Versionen. IDK, wenn 32-Bit-ARM im Jahr 2038 noch relevant sein wird, aber dies wird mindestens eine ABI-Änderung erzwingen. 32-Bit x86 ist in der Unix-Welt so gut wie verschwunden. Es ist nur Windows, wo 32-Bit-Code noch verbreitet ist.
Peter Cordes
Kommentare sind nicht für eine längere Diskussion gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Geselle Geek
1
Die VMS-Zeit ist ein 64-Bit-Wert, der die Anzahl der 100-Nanosekunden-Intervalle darstellt, die seit dem 17. November 1858 verstrichen sind . :)
RonJohn
Jahr 30k ist ... überraschend niedrig
John Dvorak
2
@DonaldDuck blogs.msdn.microsoft.com/oldnewthing/20090306-00/?p=18913 und ungefähr 1600 Leute benutzten immer noch den Julianischen Kalender, um die Darstellung eines Datums zu erschweren.
Maciej Piechotka
16

Wenn Sie sich nicht schlecht fühlen, wenn Sie raten, lassen Sie mich dies erklären. Und ich meine nicht "jemand hat den Wert auf Unsinn gesetzt", das ist natürlich immer möglich :)

Die Unix-Zeit verwendet normalerweise die Anzahl der Sekunden seit 1970. Windows verwendet dagegen 1601 als Startjahr. Wenn wir also annehmen (und das ist eine große Annahme!), Dass das Problem eine falsche Umrechnung zwischen den beiden Zeiten ist, können wir uns vorstellen, dass das Datum, das eigentlich dargestellt werden sollte, irgendwann im Jahr 2011 (1970 + 41) liegt, was falsch umgerechnet wurde bis 1640 (1601 + 41) . EDIT: Eigentlich habe ich im Windows-Startjahr einen Fehler gemacht. Es ist möglich, dass die tatsächliche Erstellungszeit im Jahr 2010 lag oder dass ein anderer Fehler aufgetreten ist (Off-by-One-Fehler sind in der Software ziemlich häufig: D).

Angesichts der Tatsache, dass dieses Jahr zufällig ein weiteres Tracking-Datum für die betreffende Datei ist, halte ich dies für eine ziemlich plausible Erklärung :)

Luaan
quelle
Könnte es also sein, dass das Datum in Unix geschrieben wurde, aber in UTC gelesen wird?
Fredy31
Windows verwendet 1601, nicht 1600.
Joey
3
Ein paar Probleme mit dieser Theorie: Dem Screenshot zufolge wurde die Datei 11 Tage nach dem letzten Zugriff erstellt. Außerdem werden Windows-Zeitstempel in 100 Nanosekunden gezählt, während die UNIX-Zeit in Sekunden angegeben wird.
Nolonar
2
@ Joey Ugh, mein Fehler. Das macht die Passform viel schlechter als auf den ersten Blick :) Ich denke, die gleiche Grundidee sollte immer noch funktionieren, aber es sind wahrscheinlich mehr Fehler beteiligt, als ich angenommen habe. Oder natürlich wurde die Datei im Jahr 2010 erstellt und nicht im Jahr 2011.
Luaan
2
Die Sekunden zwischen der Windows-Epoche und dem angezeigten Datum / der Uhrzeit der Datei betragen 1.266.705.294 . In der Unix-Epoche ergibt dies 2010-02-20 23:34:54 CEST , was ein Samstag war.
SQB
5

Wie von anderen geschrieben, ist die Windows-Epoche am 1601-01-01 00:00 .

Die Anzahl der Sekunden zwischen dieser Epoche und der angezeigten Dateizeit beträgt 1.266.705.294 .
Wenn wir das zur Unix-Epoche hinzufügen, erreichen wir am Samstag den 20.02.2010 um 23:34:54 Uhr MESZ . Dies ist ungefähr ein Jahr vor dem letzten Zugriffsdatum, was es einigermaßen plausibel macht. Es könnte sich also um einen Unix-Zeitstempel handeln, der gegen die falsche Epoche interpretiert wurde.

SQB
quelle
Seltsamerweise ist die .NET-Epoche 0001-01-01 00:00 UTC (1600 Jahre früher). Siehe msdn.microsoft.com/en-us/library/…
Nayuki
2

Wie für diese Art von Fragen üblich, hat Raymond Chens Blog eine Antwort auf diese Frage aus dem Artikel "Warum ist die Win32-Epoche am 1. Januar 1601?". Eintrag vom 6. März 2009:

Die FILETIMEStruktur zeichnet die Zeit in 100-Nanosekunden-Intervallen seit dem 1. Januar 1601 auf. Warum wurde dieses Datum gewählt?

Der Gregorianische Kalender arbeitet in einem 400-Jahres-Zyklus, und 1601 ist das erste Jahr des Zyklus, der zu dem Zeitpunkt aktiv war, als Windows NT entworfen wurde. Mit anderen Worten, es wurde gewählt, um die Mathematik gut zu machen.

Ich habe tatsächlich die E-Mail von Dave Cutler, die dies bestätigt.

ErikF
quelle