Forum: PC-Programmierung Zugriff auf pagefile.sys


von Peter (Gast)


Lesenswert?

Hallo,

ich möchte das Erstellungsdatum von pagefile.sys mit C++ (WIN32 API) 
auslesen.

Leider bekomme ich mit CreateFile(), GetFileAttributeEx() und _stat() 
keinen Zugriff darauf.

Kennt jemand noch einen weitere Möglichkeit?

Alternativ geht auch 'irgendwas anderes'. Es geht nur darum, ein 
(möglichst) aktuelles Datum auszulesen - ohne die System-Uhr zu 
benutzen.

Danke, Peter

von Jan H. (j_hansen)


Lesenswert?

Temporäre Datei anlegen und davon Erstellungsdatum lesen?

von Peter (Gast)


Lesenswert?

Jan H. schrieb:
> Temporäre Datei anlegen und davon Erstellungsdatum lesen?

Es müsste wohl was sein, was von Windows beim Start selber generiert 
wird, um Uhrzeit-Manipulationen (größtenteils) auszuschließen.

Wenn ich sowas anlege, dann bekomm ich vermutlich auch nur die 
System-Uhr.

von Jan H. (j_hansen)


Lesenswert?

Am besten beschreibst du erst einmal, was du bezweckst.

Windows kann ich auch mit einer geänderten Zeit neustarten, damit 
schließt du schon einmal keine Manipulationen aus.

Ein Webservice kann dir die echte Zeit geben, wenn du Internetzugriff 
voraussetzen kannst.

Du könntest auch das Systemlog durchforsten, oder folgendes Dokument für 
Tipps: 
https://digital-forensics.sans.org/community/papers/gcfe/detection-backdating-system-clock-windows_2870

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ganz primitiv:

"dir c:\pagefile.sys" aufrufen und Ausgabe parsen.

Anderer Ansatz:

System-Eventlog parsen und Eintrag für Systemstart extrahieren.

Noch ein Ansatz:

Wmic os get lastbootuptime

und Ausgabe parsen -- oder das API-Äquivalent davon herausfinden und 
aufrufen.

von Jens G. (jensig)


Lesenswert?

Rufus Τ. F. (rufus) schrieb:

>Ganz primitiv:

>"dir c:\pagefile.sys" aufrufen und Ausgabe parsen.

pagefile.sys ist üblicherweise hidden. Also wenn schon, dann "dir /a 
..."

Allerdings zeigt das wohl nur die Änderungszeit an. Wenn es wirklich um 
die Zeit der Erstellung geht, dann "dir /a /tc ...".

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ja, dir /ah ist irgendwie untergegangen.

> Allerdings zeigt das wohl nur die Änderungszeit an.

Die ist die Zeit des letzten Systemstarts.

von Peter (Gast)


Lesenswert?

Parsen ist nicht so meine Sache. Ich lese jetzt ein paar Systemordner 
ein und nehme das neueste Datum. Das ist genau genug.

Danke für die Tipps.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Peter schrieb:
> Ich lese jetzt ein paar Systemordner ein und nehme das neueste Datum.

Was möchtest Du denn damit bestimmen?

Welche Flags hast Du bei Deinem CreateFile-Aufruf für dwDesiredAccess 
verwendet?

von Peter (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Was möchtest Du denn damit bestimmen?
>
> Welche Flags hast Du bei Deinem CreateFile-Aufruf für dwDesiredAccess
> verwendet?

Es geht um eine Laufzeitbegrenzung einer Software. Die Demo soll bis zum 
Tag X laufen. Wenns dann ein paar Tage mehr sind macht es auch nichts.

Ich nehme dazu FindFirstFile() und FindNextFile() und lese dann immer 
das letzte Änderungsdatum verschiedener Ordner aus. Das neueste Datum 
nehm ich dann.

Danach kann ich das gefundene Datum dann noch einmal mit der Systemzeit 
vergleichen und erneut das neuere Datum nehmen.

Danke.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Aha. Dann hilft Dir pagefile.sys nicht, das verändert nämlich seine 
Änderungszeit nur beim Booten, danach aber nicht mehr. Damit kann man 
sehr schön rausfinden, wann das System das letzte Mal gebootet wurde, 
aber das kann --je nach Uptime des Rechners-- auch schon mehrere Monate 
bis Jahre her sein.

Du willst also abfangen, daß jemand die Systemzeit zurückstellt, um Dein 
Programm für längere Zeit nutzen zu können.

Alternativ könntest Du die Aufrufe Deines Programmes und die 
(kumulierte) Laufzeit bestimmen, und nach X Aufrufen oder Y Stunden die 
Segel streichen.

Natürlich kann jemand, der es drauf anlegt, auch solche Mechanismen 
umgehen.

Du könntest natürlich auch einfach einen ntp-Zugriff auf einen 
Zeitserver im Internet machen -- und wenn der nicht möglich ist, die 
Funktion verweigern.


Andererseits: Meinst Du, daß Deine Software so interessant ist, daß 
dieser ganze Benutzergängelungsaufriss nötig ist?

von werner (Gast)


Lesenswert?

Das ist doch Pfusch. Viele haben heute gar keine Auslagerungsdatei mehr. 
RAM ist billig und die SSD wird auch geschont.

von Peter (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Alternativ könntest Du die Aufrufe Deines Programmes und die
> (kumulierte) Laufzeit bestimmen, und nach X Aufrufen oder Y Stunden die
> Segel streichen.
>
> Natürlich kann jemand, der es drauf anlegt, auch solche Mechanismen
> umgehen.
>
> Du könntest natürlich auch einfach einen ntp-Zugriff auf einen
> Zeitserver im Internet machen -- und wenn der nicht möglich ist, die
> Funktion verweigern.
>
> Andererseits: Meinst Du, daß Deine Software so interessant ist, daß
> dieser ganze Benutzergängelungsaufriss nötig ist?

Nein, meine Software ist bei weitem nicht so interessant.

Deshalb spar ich mir das Alles was Du da aufzählst und lese statt dessen 
nur ein paar Ordner-Infos ein.

von MiWi (Gast)


Lesenswert?

Jan H. schrieb:
> Am besten beschreibst du erst einmal, was du bezweckst.
>
> Windows kann ich auch mit einer geänderten Zeit neustarten, damit
> schließt du schon einmal keine Manipulationen aus.
>

Dann starte W10 einmal mit der vorher im Bios vollkommen verstellten Uhr 
und wundere Dich über die Uhrzeit im Anmeldeschirm...

von oszi40 (Gast)


Lesenswert?

Peter schrieb:
> und lese statt dessen nur ein paar Ordner-Infos ein.

Wenns genauer werden soll, wäre NTP-Eintrag nützlich?
NtpServer Registry Key?

Wichtiger als Klimmzüge, die Kunden verärgern, ist ein guter Service. 
Schreib nach dem x-ten Aufruf nach x Tagen Deine Serviceadresse + 
Bestellhotline auf den Monitor. Die könnte ja jede Woche etwas größer 
werden?

von Rainer V. (rudi994)


Lesenswert?

Peter schrieb:
> pagefile.sys mit C++ (WIN32 API) auslesen... Leider bekomme ich mit
> CreateFile(), GetFileAttributeEx() und _stat() keinen Zugriff darauf.

Bei mir geht es ohne W32API in C++ einfach mit stat() aus <sys/stat.h>, 
auch dann, wenn pagefile.sys versteckt ist. Neuestes Datum/Uhrzeit in 
struct stat liefert bei mir der Member st_ctime (Datum der letzten 
Statusänderung). Dies gilt hier zumind. für das Administrator-Konto 
meines Rechners. LG

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.