Motherboard Time / Schutz vor Manipulation von Zeit und Datum



  • Hallo,

    ich bin auf der Suche nach einer Möglichkeit einer Zeitabfrage/Datumsabfrage die etwas schwerer zu manipulieren ist als die Systemzeit. Ich habe ein kleines Programm geschrieben, was ich gerne zeitlich limitiert zum Testen vergeben möchte. Danach ist es mir egal, es soll endlos laufen. Aber die Testphase sollte nicht unbedingt an die Zeit des Betriebssystems gekoppelt sein, das wäre zu leicht zu manipulieren.

    Gibt es da Möglichkeiten, wie zum Beispiel die Abfrage der im MB hinterlegten Zeit oder gar die Verbindung zu einer offiziellen Webseite?

    Danke!



  • Mit ansi-c kannste das vergessen. In msdn steht, dass die Systemzeit direkt von der Hardware gelesen wird, einen Link weiter steht man soll die Systemzeit nicht für Zeitmessung benutzen weil sie einstellbar ist. Damit hast du auf dem Rechner komplett verloren, es bleibt dir nur noch die Zeit von irgendwo zu nehmen.
    http://isotropic.org/date/ bietet sich an, Julian day ist ein int, leicht zu parsen. Du machst dein Programm damit aber internetabhängig.
    Im übrigen solltest du lieber Featurebegrenzung als Zeitbegrenzung benutzen, Zeit kann man leicht umgehen, Features in dein Programm einbauen ist deutlich schwieriger.



  • Okay. Das ist ja schonmal eine klare Aussage.

    Das mit dem Internet ist kein Problem, das Programm interagiert mit einer anderen Software die wiederum eine Internet-Verbindung braucht. Kurzum, auch mein Programm wird nur laufen wenn Internet vorhanden ist.

    Das mit dem Features hört sich auch sehr gut an, allerdings habe ich keine Ahnung was du damit meinst.

    Was wird leichter zu implementieren sein?

    Danke!



  • Leichter zu implementieren ist die Zeitabfrage zu einem Server. Wenn du eh schon eine Internetverbindung mit einer anderen Software hast kannst du doch die fragen wie spät es ist.
    Features rausnehmen ist eigentlich auch leicht. Kommt natürlich auf dein Programm an. Versuche Funktionen zu finden die nicht allzu wichtig aber nett sind. Zum Beispiel ein Komprimierprogramm was Dateien verkleinert könnte man so machen, dass man zwar Dateien normal komprimieren kann, aber immer nur einzeln. Irgendwann hat der Nutzer keine Lust mehr jede Datei einzeln anzuklicken und bezahlt oder sucht sich was anderes.
    Implementationstechnisch ist das einfach, man braucht ja nur eine Funktion aus dem Quelltext durch eine Ausgabe "Feature nur in der Vollversion" ersetzen, aber man muss sich sehr genau überlegen was man für Funktionen rausnimmt. Dafür ist es natürlich auch extrem sicher. Bei der Zeitabfrage kann man per Debugger einen jump über die Zeitabfrage machen und fertig, bei fehlenden Features geht sowas nicht.



  • Okay, das mit den Features geht dann wohl leider nicht. Das Programm soll bis zum Laufzeitende zu 100% funktionieren, das geht leider nicht anders.

    Ich werde dann also wohl die Abfrage der Zeit aus dem Netz nehmen müssen.

    Gibt es da schon vorgefertigte Skripte? Kann ich mir das irgendwo anschauen wie das funktioniert, das habe ich so noch nicht programmiert.

    Danke!



  • Die aktuelle Zeit ist leider nur die eine Hälfte. Wie oder wo speicherst Du die Zeit, ab der die 40 Tage zählen?



  • Hier gibts ein Beispiel das fast tut was du willst: http://curl.haxx.se/libcurl/c/sendrecv.html
    Du musst nur statt "GET /" ein "GET /date/" verwenden und "curl.haxx.se" durch "isotropic.org" ersetzen und statt die Bytes der Rückgabe zu zählen kannst du per strstr nach "Julian day:</strong></td><td>" suchen und die folgenden Zahlen bis zum nächsten '<' als Zeit nehmen. Ist nur auf den Tag genau, sollte aber für deine Zwecke reichen.
    Wenn sich der Server verabschiedet oder sich die Formatierung ändert klappts natürlich nicht mehr.



  • so wie ich es zur Zeit auch mache.
    an dem Zeitpunkt an dem ich die DLL rausgebe, mache ich eine Abfrage rein, in der ich die Systemzeit mit einer in der DLL gespeicherten Lizenz-Ablauf-Zeit vergleiche. das funktioniert dann halt so lange, wie die (manuell zu ändernde) Systemzeit < als die gespeicherte Zeit

    time_t seconds;
    int dayDiff;
    seconds = time (NULL);
    
    // hier trage ich dann die in Tagen umgerechnete Gültigkeit ein
    dayDiff = 14735 - seconds/3600/24;
    
    //if (dayDiff > 0) sprintf(s, "das Programm läuft noch %u Tage >>> \n", dayDiff);
    //else sprintf(s, "Lizenz ist abgelaufen");
    //WriteConsole(cons,s,strlen(s),&written,NULL);
    

    ich würde also wenn ich alles richtig verstehe einfach die Abfrage von time durch die "richtige" Zeit ersetzen



  • Yup. Wobei es recht aufwändig ist die "richtige" Zeit zu kriegen, aber das steht ja auf der Seite wie es geht.



  • nun muss ich doch nochmal fragen:

    wie lese ich die Motherboard Time aus? weiter oben steht das wäre einfacher als das Abfragen der Webseite.

    Danke!



  • Magic-Champ schrieb:

    ich würde also wenn ich alles richtig verstehe einfach die Abfrage von time durch die "richtige" Zeit ersetzen

    die kriegste z.b. von da: http://support.ntp.org/bin/view/Servers/WebHome
    caesium-atomuhr-genau, sozusagen. *fg*
    🙂





  • Das hier? http://www.cplusplus.com/reference/clibrary/ctime/time/

    Nein. das ist ja nur die Systemuhrzeit vom Betriebssystem.

    man muss noch irgendwie die Zeit von verschiedenen Hardware Komponenten auslesen, können, die haben wohl auch einen Timestamp



  • Magic-Champ schrieb:

    wie lese ich die Motherboard Time aus?

    meinste die RTC auf'm mainboard? die kann man doch verstellen, d.h. die hilft nicht viel (ausser du machst sowas wie 'FlexLM', das zwug erkennt verstellen der zeit und disabled dann die ganze lizenz).
    🙂



  • Es gibt da noch http://msdn.microsoft.com/en-us/library/ms724950(VS.85).aspx
    Das ist die Zeit der Hardwareuhr was identisch zur Systemzeit ist wenn MSDN nicht lügt. Und mehr Uhren gibts im Rechner nicht soweit ich weiß.



  • Magic-Champ schrieb:

    man muss noch irgendwie die Zeit von verschiedenen Hardware Komponenten auslesen, können, die haben wohl auch einen Timestamp

    ja, dolche timer starten aber jedesmal neu, wenn der PC eingeschaltet wird.
    🙂



  • Es gibt da noch http://msdn.microsoft.com/en-us/library/ms724950(VS.85).aspx
    Das ist die Zeit der Hardwareuhr was identisch zur Systemzeit ist wenn MSDN nicht lügt. Und mehr Uhren gibts im Rechner nicht soweit ich weiß.

    das hier habe ich gerade gefunden, das sieht doch sehr danach aus. oder?

    http://msdn.microsoft.com/en-us/library/ms725475(VS.85).aspx



  • Hatte ich auch gesehen, aber keine Ahnung wie man es benutzt und was genau es tut. Mehrere Uhren im Rechner zu haben ist eigentlich Quatsch, aber wer weiß, vielleicht gibt es mehrere. Jedenfalls weiß ich auch nicht mehr als da steht. Viel Glück.



  • Magic-Champ schrieb:

    das hier habe ich gerade gefunden, das sieht doch sehr danach aus. oder?
    http://msdn.microsoft.com/en-us/library/ms725475(VS.85).aspx

    sieht aber ziemlich komplex aus, musste extra 'ne dll schreiben und so. ich schätze, 'ping-pong kommunikation' mit 'nem NTP-server über UDP dürfte einfacher sein.
    🙂



  • Magic-Champ schrieb:

    Nein. das ist ja nur die Systemuhrzeit vom Betriebssystem.

    Eigentlich egal. Wenn die Laufzeit, wie weiter oben geschrieben, am Tag der Auslieferung "hardgecoded" wird, dann sollte time () völlig ausreichen.


Anmelden zum Antworten