kostenloser Webspace werbefrei: lima-city


C#: 30 Tage Testversion

lima-cityForumProgrammiersprachenProgrammieren mit .NET & Mono

  1. Ok ich will mal etwas theoretischer an das tag/problem">Problem rangehen:
    Ziel ist es irgendwie zu speichern, wie oft ode wie lange ein Nutzer das Programm schon benutzt hat.
    Das Problem ist, dass der Speicherort "feindliches Gebiet" ist.
    Solange ich den Zustand auf dem Rechner des Nutzers speichere gibt es immer die Möglichkeit für ihn,
    dass er alles wieder in den Originalzustand zurückversetzt(zb Ghost-Image).
    Nach Determinismus nach dem der Computer und seine Programme funktionieren bedeutet das, dass
    das Programm es nicht feststellen kann, ob das System zurück gesetzt wurde.
    Damit bietet sich nur die Zuhilfenahme eines vertrauenswürdigen Speichermediums an, sprich ein authentifizierungs Server.
    Letztlich läuft das Problem also darauf hinaus, dass dein Programm verstrickt genug sein muss, um den Authentifizierungspart uncrackbar zu machen und die Authentifizierung, darf nicht von fremden Servern aus vorgenommen werden können.

    Ich hoffe mal, dass das einleuchtend ist und mir kein Denkfehler unterlief.
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. sektor schrieb: Ok ich will mal etwas theoretischer an das Problem rangehen:
    Ziel ist es irgendwie zu speichern, wie oft ode wie lange ein Nutzer das Programm schon benutzt hat.
    Das Problem ist, dass der Speicherort "feindliches Gebiet" ist.
    Solange ich den Zustand auf dem Rechner des Nutzers speichere gibt es immer die Möglichkeit für ihn,
    dass er alles wieder in den Originalzustand zurückversetzt(zb Ghost-Image).
    Nach Determinismus nach dem der Computer und seine Programme funktionieren bedeutet das, dass
    das Programm es nicht feststellen kann, ob das System zurück gesetzt wurde.
    Damit bietet sich nur die Zuhilfenahme eines vertrauenswürdigen Speichermediums an, sprich ein authentifizierungs Server.
    Letztlich läuft das Problem also darauf hinaus, dass dein Programm verstrickt genug sein muss, um den Authentifizierungspart uncrackbar zu machen und die Authentifizierung, darf nicht von fremden Servern aus vorgenommen werden können.

    Ich hoffe mal, dass das einleuchtend ist und mir kein Denkfehler unterlief.


    Er möchte ja nicht den "EA-Weg" gehen. Er will, dass sein Programm möglichst offline verfügbar ist.

    Ich werde jetzt mal versuchen ein Programm zu schreiben, dass für norml-user nur sehr schwer zu knacken ist.


    SO... das Programm kann zwar in dieser Version noch leicht geknackt werden, aber es soll ja nur ein Beispiel und eine Anregung sein...
    Hier der Code:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
    using System.IO;
    
    namespace _30_Tage_Testversion
    {
        static class Program
        {
            static FileStream oKontrollFile;
            /// <summary>
            /// Der Haupteinstiegspunkt für die Anwendung.
            /// </summary>
            [STAThread]
            static void Main()
            {
                 //das programm unterstützt nur 3 teststarts...
                const string s3StartsLeft = "LKGDT_3";               //strings sind egal... naja fast^^
                const string s2StartsLeft = "IOSFI__2";              //damit dieses programm richtig funktionniert, 
                const string s1StartsLeft = "PSIFAOUG_1";            //muss ein string länger als der vorherige sein
                const string s0StartsLeft = "IJIIOASOF_";
    
                int iVerbleibendeStarts = -1;
                //installationszeit in erfahrung bringen
                FileInfo oFi = new FileInfo("liesmich.txt");
                DateTime oErstelltAm = oFi.CreationTime;
                //jetzt installationszeit mit erstellungszeit der "kontrolldatei" vergleichen;
                FileInfo oFi_Kontroll = new FileInfo("kontrolldatei.txt");
                DateTime oKontrollErstelltAm = oFi_Kontroll.CreationTime;
    
                if (oErstelltAm.Date != oKontrollErstelltAm.Date)
                {
                    //fehler dateien wurden manipuliert
                }
                else
                {
                    //jetzt noch die zeit (nur minuten) kontrollieren
                    if ((oErstelltAm.TimeOfDay.Hours != oKontrollErstelltAm.TimeOfDay.Hours)
                        || (oErstelltAm.TimeOfDay.Minutes != oKontrollErstelltAm.TimeOfDay.Minutes))
                    {
                        //wieder fehler, manipulation
                    }
                    else
                    {
                        //keine manipulation, jetzt können die verbleibenden tage "berechnet" werden
                        oKontrollFile = new FileStream("kontrolldatei.txt", FileMode.Open);
                        StreamReader oReader = new StreamReader(oKontrollFile);
                        StreamWriter oWriter = new StreamWriter(oKontrollFile);
    
                        string sVerbleibendeStarts = oReader.ReadLine();
                        oKontrollFile.Position = 0;
    
                        //Verbleibende Starts "parsen" und
                        //neue anzahl an verbleibenden starts in die datei schreiben (aber keine neue datei erzeugen(!)
    
                        switch (sVerbleibendeStarts)
                        {
                            case s3StartsLeft:
                                iVerbleibendeStarts = 3 - 1;
                                oWriter.WriteLine(s2StartsLeft);
                                break;
                            case s2StartsLeft:
                                iVerbleibendeStarts = 2 - 1;
                                oWriter.WriteLine(s1StartsLeft);
                                break;
                            case s1StartsLeft:
                                iVerbleibendeStarts = 1 - 1;
                                oWriter.WriteLine(s0StartsLeft);
                                break;
                            case s0StartsLeft:
                                iVerbleibendeStarts = -1; //das programm soll ja nichtmehr starten.
                                break;
                        }
    
                        oWriter.Close();
                        oReader.Close();
                        oKontrollFile.Close();
    
                    }
                }
    
                if (iVerbleibendeStarts != -1)
                {
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
                    Application.Run(new Form1());
                }
            }
        }
    }


    und der Download: http://nicolas.bplaced.net/30_Tage_Testversion.zip

    Natürlich sollte man das, was in die Datei geschrieben wird noch verschlüsseln. Man könnte auch einen (besser 2 oder mehr Einträge, die in unterschiedlichen Regionen stehen) Regeintrag machen und den dann zur Laufzeit laden.
    Die Datei "liesmich.txt" steht für alle "konstanten" Dateien im Anwendungsverzeichnis. Man kann die Erstellungsdaten vergleichen und so Manipulation ausschließen. Außerdem könnte man in einem anderen Verzeichnis (ich benutze gern das Verzeichnis für Anwendungsdateien) auf der Festplatte eine Vergleichsdatei erstellen. Der Name und Pfad dieser Datei sollte natürlich nicht offensichtlich sein...
    Also kurz gesagt: Das Programm hat noch viel Verbesserungspotential

    PS: Ich würde noch mit bedingter Kompilierung Funktionen für die Testversion sperren.

    EDIT:
    man kann auch ein eigenes Dateiformat entwerfen.
    Bsp:
    - Binärformat
    - bestehend aus verschiedenen Datenchuk-Typen
    - Reihenfolge der Datenchunks immer variieren
    - Datenchunks könnten aus Datenchunkheader, der den Typ enthält, und den Daten an sich bestehen

    Als Beispiel wie solche Datenchuks aufgebaut sein könnten kann man z.B. das .wav nennen. (einfach mal nach googlen)

    Beitrag zuletzt geändert: 7.7.2010 13:28:23 von primenic
  4. Ich wollte damit ausdrücken, dass es schon mit einem einfachen Spiegelprogramm möglich ist, jegliche Anwendung, die sich vollkommen auf den Computer des Nutzers stützt, auszuhebeln. Soll heißen absolute Sicherheit ist so nicht zu erreichen.
    Du setzt damit das System komplett zurück und egal wie viel du dir einfallen lässt und wie komplex dein Sicherungssystem ausfällt, sobald du es rein auf den Nutzerrechner basiert schreibst, kann es zurückgesetzt werden ohne großen Aufwand.
  5. Um was für ein Programm geht es dabei?

    Wenn es Dateien speichert, könnte man diesen im Dateiheader eine Information, dass sie mit einer Testversion erstellt wurden, hinzufügen. Außerdem ist ein Zeitstempel sinnvoll. Wenn man dann halt mit einer "neuen" Testversion versucht die Datei der "alten, abgelaufenen" Version zu öffnen, könnte man das blocken.

    Aber für absolute Sicherheit muss man halt einen Teil auf einen Server auslagern (wer hat heute denn keinen Computer, der ständig online ist).

    Beitrag zuletzt geändert: 7.7.2010 22:13:08 von primenic
  6. Autor dieses Themas

    vampiresilence

    Kostenloser Webspace von vampiresilence

    vampiresilence hat kostenlosen Webspace.

    @primenic
    Beide Vorschläge, die du jetzt noch gebracht hast sind im Prinzip zwar ganz gut, aber beide lassen sich schon alleine damit umgehen, dass man die Kontrolldatei einfach schreibschützt. Leichter könnte man es dem Benutzer also nicht machen.

    Und ehrlich gesagt wundere ich mich grade, wie knifflig sich das jetzt alles entwickelt hat. Ich meine, wieviele Programme gibt es bitte ? Wieviele sind geschützt ? Es gibt Millionen Stück, die alle absolut tadellos funktionieren, abgesehen von Cracks vllt. Das kann doch alles nicht so schwer sein.

    Evtl klappt das Ganze, wenn man einfach alle Daten ("Datums") je Programmstart verschlüsselt in eine Datei speichert und nachdem man 30 verschiedene Werte hat, ist die Testzeit abgelaufen. Dann müsste man zwar das Datum jeden Tag zurückstellen, aber das wird denke ich mal eine zunehmende Unannehmlichkeit für den Benutzer, den er irgendwann unterlassen wird. Prinzipiell kann man also nur darauf bauen, dass die Maßnahmen die zum Brechen des Schutzes erforderlich wären, für den Anwender besonders nervig sind. Was Besseres fiele mir momentan leider auch nicht ein.

    Liebe Grüße
    - VampireSilence
  7. Ja, das Problem, dass die Kontrolldateien dem User zugänglich sind, ist mir klar, aber wenn man das ganze nicht online machen will, dann kann man nur Dateien oder (besser) Reg.-einträge nutzen.

    Wenn man die Kontrolldatei in einem versteckten Verzeichnis auf der Festplatte speichert? - Kann mir nicht vorstellen, dass sich ein User die Mühe macht und die Datei sucht.

    PS: Wenn du (wer auch immer das Thema angefangen hat :rolleyes: ) wiklich nicht online arbeiten willst und dir das Risiko bei Kontrolldateien zu groß ist, dann musst du wohl eine unbegrenzte Version mit eingeschräkten Features ("bedingte Kompilierung") erstellen oder das Programm beim Start prüfen lassen, ob es registriert ist. (Registrierungsschlüssel in Registrierung schreiben).


    EDIT:

    Mir ist grad noch ne Idee gekommen. Die ist vielleicht nicht ganz elegant, aber... naja hörts euch einfach mal an:

    Es gibt im Bitmapdateiformat einen unbenutzten Wert im Dateiheader. (Byteoffset 6) da könnte man die verbleibenden Starts reinschreiben. Dann ist der Wert auf jedenfall vor dem User versteckt. Wenn man das jetzt noch z.B. in eine Icon-Bitmap schreibt... da würde ich sowas nicht vermuten... - ihr?
    (Ich hab noch ein weiteres mögliches Format gefunden: wav bzw. Wave)

    EDT2:

    vampiresilence schrieb:
    Dann müsste man zwar das Datum jeden Tag zurückstellen, aber das wird denke ich mal eine zunehmende Unannehmlichkeit für den Benutzer, den er irgendwann unterlassen wird. Prinzipiell kann man also nur darauf bauen, dass die Maßnahmen die zum Brechen des Schutzes erforderlich wären, für den Anwender besonders nervig sind.


    Wenn man das Programm in einer VM startet, kann man das Problem umgehen (dann kann man eigentlich jeden Schutz vergessen).

    Beitrag zuletzt geändert: 8.7.2010 17:25:17 von primenic
  8. hi Leute

    also ich weis ja nicht ob ich hier grad völlig falsch liege aber meines Wissens nach gibts Programme die einen den kompletten Zugriff und Ablauf eines anderes Programms anzeigen können, incl. evtl. Veränderungen an Dateien, so würd ich zumindest meine Analyseprogramme schreiben wenn ich Cracker wäre.
    -> jeder Zugriff wird analysiert und ausgewertet und nach ein paar Starts bzw Tagen wird dem findigen Cracker klar sein wo er rumschrauben muss

    die einzige Möglichkeit die ich sehe ist dein komplettes Programm auf einem Server laufen zu lassen und dem Benutzer nur noch die GUI gibst/anzeigst ->folgt nur das nächste Problem: wie verhindert man das einfache Neuanmelden unter neuem Namen?

    somit seh ich aktuell absolut keinen Weg eine unknackbare __unbeschnittene__ Testversion zu entwickeln
    aber wenn man schneidet entfällt der sinn, grad bei dem Compiler

    meine letzte Idee ist eine redundante Speicherung des Ablaufdatums an mehreren Orten, wobei das dann von einem Script dann auch schnell alles gleichzeitig umgeschrieben werden könnte, was mit mehreren Hash-Funktionen wie das sektor schon sagte erschwert werden könnte und da liegt vielleicht auch schon eine gute Verschleierung wenn man alle Hashfunktionen ineinanderbaut

    so genug gedacht ^^

    mfg
    Golem

    Beitrag zuletzt geändert: 8.7.2010 19:34:16 von golem235
  9. Ja solche analyse Programme sind nichtmal illegal - und man muss auch kein Cracker sein. Es gibt Tools, die z.B. bei der Installation mitlaufen um dann alles wieder restlos deistallieren zu können.

    golem235 schrieb: hi Leute

    die einzige Möglichkeit die ich sehe ist dein komplettes Programm auf einem Server laufen zu lassen und dem Benutzer nur noch die GUI gibst/anzeigst ->folgt nur das nächste Problem: wie verhindert man das einfache Neuanmelden unter neuem Namen?



    Man muss nicht das gesamte Programm auf einem Server laufen lassen. Man könnte es so wie EA machen. Jeder Computer hat bestimmte unverwechselbare Merkmale (z.B. die Seriennummer des MB) man könnte diese auf einem Server mit den Daten (verbleibende Starts, Tage, etc.) des Programms assoziieren. Die Kombination der Seriennummern, der Systemkomponenten, etc. sollte einmalig sein. Wenn jetzt ein User versucht sich mit anderem Namen erneut anzumelden, dann kann man im Server gucken, ob diese Systemkonfiguration schon vorhanden ist.
    - Allerdings sehe ich ein Problem darin, wenn man Systemkomponenten ändert...

    PS: Mit Hashcodes sollte man vorsichtig sein, wenn man nun z.B. einen MD5 erstellt (was weiter oben schon vorgeschlagen wurde), dann kann man den MD5 nichtmehr in den Klartext zurückführen.

    Beitrag zuletzt geändert: 9.7.2010 15:31:39 von primenic
  10. naja aber wenn das programm systemdaten sammelt und die schickt kann auch grade da wieder der hebel kommen, indem ich einfach falsche daten sende
  11. Naja "einfach falsche Datensenden" ist nicht grade leicht. :wink:
    Du musst den Aufbau der Datenpakete kennen, usw.

    Außerdem gibt es ja diverse Verschlüsselungstechniken für solche Verbindungen.
  12. bigdiddy schrieb:
    Ich kenn mich null mit coding etc. aus, aber wie währs mit der DB auf irgendeinen server wo gecheckt wird ob die zeit schon abgelaufen ist?


    ich kann mir vorstellen das es ein großes problem geben kann und zwar wenn das
    programm von einer firewall geblockt wird, dann kann das programm nicht die zeit abrufen dementsprechend 30 tage 4ever ^^




    man könnte noch hinzufügen, dass wenn keine Internet Verbindung besteht , das Programm sich einfach schließt
    somit geht es dann nicht ohne Verbindung

  13. das kenne ich von der Uni, da gibts CAD-Programme die über ein Lizensserver laufen, das Problem, nur weil ich kein Internet habe kann ich das Programm nicht nutzen->ich suche mir ein anderes Programm, da mir deins nicht gefällt wegen solcher "Lapalien"

    somit ist ein Demolizenssystem via Internet eine Produkthemmende Methode, wer Beweise für ein solches Denken will, der schaut bitte im Forum bei Computerspielen unter dem Thema mit dem neuen Ubisoft-Kopierschutz

    also ist es empfehlenswert ein lokales System zu machen, was zumindest nicht wie bei M$-Works ist, wo man in einer Datei nur 2 Zeilen ändern muss. Was ich sagen will ist, dass es einfach funktionieren sollte und sich aber ein übermäßiger Schutzerstellungsaufwand nicht lohnt. Da dieser entweder die "Verkaufszahlen" senkt oder genau so wirkungsvoll wie ein Standartschutz ist

    mfg
    golem
  14. em4servertreff

    em4servertreff hat kostenlosen Webspace.

    Wie wäre es wenn wir das ganze ganz einfach machen. Du schreibst die Öffnungen die das Programm machen darf in eine .txt oder .ini. Jedes mal wenn es startet erhöt es dann den wert.
    So das ist schon das grundlegende, jetzt kommen wir zu dem eigentlichem Problem. Du kannst die .txt oder .ini passwort schützen, oder aber du speicherst das ganze in einem verschlüsseltem code, das z.B. die eins = saofdzhodgfhosidfu394836/$§"()(/%(&/7853 ist und die anderen Starts andere Codes, bis die letzte zahl erreicht ist. Dies kannst du auch in der regestrie machen, und nicht in der txt oder ini. Aber ich muss jetzt echt sagen, man kann alles knacken wenn man es will,also würde ich da nicht so viel Arbeit rein stecken.
  15. em4servertreff schrieb:
    Wie wäre es wenn wir das ganze ganz einfach machen. Du schreibst die Öffnungen die das Programm machen darf in eine .txt oder .ini. Jedes mal wenn es startet erhöt es dann den wert.
    So das ist schon das grundlegende, jetzt kommen wir zu dem eigentlichem Problem. Du kannst die .txt oder .ini passwort schützen, oder aber du speicherst das ganze in einem verschlüsseltem code, das z.B. die eins = saofdzhodgfhosidfu394836/$§"()(/%(&/7853 ist und die anderen Starts andere Codes, bis die letzte zahl erreicht ist. Dies kannst du auch in der regestrie machen, und nicht in der txt oder ini. Aber ich muss jetzt echt sagen, man kann alles knacken wenn man es will,also würde ich da nicht so viel Arbeit rein stecken.


    Hmm... hast wohl nicht die vorherigen Antworten gelesen?

    Ich hab so ziemlich das Selbe schonmal ein paar Antworten vorher geschrieben... und hatte sogar noch ein Beispiel dabei...

    PS: Wenn du richtig gelesen hättest, dann hättest du auch gesehen, das wir diesen Lösungsansatz schon ausgeschlossen haben.
  16. o-uamanagement

    o-uamanagement hat kostenlosen Webspace.

    Schreibe in die Registry den Wert deines letzten Programmstartes und die damit verbundenen Resttage. Nun prüfst du im Programm nach ob das eingetragene Datum kleiner ist als das Datum, welches das System zur Zeit hat. Ist die Systemzeit kleiner, wurde die Zeit zurückgestellt und du könntest direkt drauf reagieren (wie ist dir überlassen).
    Oder aber du schreibst ein kleines Helfertool, welches bei Systemstart mitstartet und in der Registry n Wert hochschraubt, somit bleibt dem Nutzer im laufenden Betrieb gar nicht die Möglichkeit, die Zeit zu ändern.
    Dritte Möglichkeit wäre noch, die BIOS Zeit auszulesen, damit arbeiten dann nämlich auch die großen Fische im Teich der Programmierer. Denn da wird am wenigsten rumgespielt.
    AutoCAD macht es zudem so, dass sie sich vor den Bootsektor schreiben und darin die Zeit festlegen. Somit hast du in diesem Fall fast keine Möglichkeiten, dass ganze zu umgehen...
  17. Da wir im .NET Bereich sind gehe ich davon aus dass du dein Werk auch entsprechend gegen de-compiling geschützt hast, also warum nicht gleich richtig und z.B. NET-Reactor verwenden, denn NET-Reactor hat diese Test-Modus sogar schon on board. d.h. beim verschleiern des Projects kann du schon festlegen, wieviele Tage das Programm laufen darf. Wie NET-Reactor das macht, frage micht bitte nicht, aber sie machen das wirklich gut. Hier ist der link zur Website: http://www.eziriz.com/
  18. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!