C#: 30 Tage Testversion
lima-city → Forum → Programmiersprachen → Programmieren mit .NET & Mono
code
datei
datum
funktion
grad
idee
knacken
laufen
machen
problem
programm
schutz
server
start
string
system
tag
uhr
url
windows
-
Ich sitze gerade daran eine 30 Tage Testversion zu schreiben. Dabei geht es eigentlich viel mehr um die logischen Schritte die dahinter stecken, als um konkrete Inhalte. Ich habe mir nämlich ein paar Techniken angesehen und ausprobiert, die man aber allesamt leicht aushebeln könnte.
1. Zum einen könnte ich nen Registry-Eintrag mit dem End-Datum hinterlassen. Da würde es aber schon reichen, wenn man die Windows-Uhr zurückdreht.
2. Dann könnte ich pro Tag einfach manuell einen Ticker runterlaufen lassen und in der Registry oder einer Datei speichern, aber auch hier ließe sich das manipulieren.
3. Ich könnte auch einfach die chronologische Testphase komplett über Bord werfen und einfach die Startvorgänge des Programms zu Grunde legen, so wie es bei den Office OEM-Versionen ist, aber das macht kaum einen Unterschied zu Variante 2.
Die Frage ist also, welche Daten speichert man da am besten und wo überhaupt ? Das ganze soll schließlich nicht so leicht zu manipulieren sein. Sonst ist die Begrenzung witzlos. Ich bitte um Anregungen.
Liebe Grüße
- VampireSilence -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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?
Max -
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 ^^
1. Zum einen könnte ich nen Registry-Eintrag mit dem End-Datum hinterlassen. Da würde es aber schon reichen, wenn man die Windows-Uhr zurückdreht.
das klingt schon nach der ordentlichsten Lösung, da auch neue und professionelle Programme sich einfach
auszutricksen lassen indem man die Uhr zurück dreht
-
linuxworld 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?
Max
Das wäre theoretisch sogar möglich, aber genauso manipulierbar. Und ich wollte eigtl auch nicht wie Ubisoft & Konsorten anfangen. Also das ganze sollte am besten offline umsetzbar sein.
Liebe Grüße
- VampireSilence -
du könntest doch ganz sicher auch in der haubt .exe datei einen counter reinsetzen sodas das programm maximal 30 Tage laufen kann oder ist sowas nicht möglich?
da man ja sobalt er versuct das zu ändern gleich die ausfürbahre datei mitlöscht und so das unutzbar macht.
Geht das net? -
bigdiddy schrieb:
das klingt schon nach der ordentlichsten Lösung, da auch neue und professionelle Programme sich einfach
auszutricksen lassen indem man die Uhr zurück dreht
Ne, also die richtig guten lassen sich durch nichts und niemanden austricksen und genau das will ich auch schaffen.
linuxworld schrieb: du könntest doch ganz sicher auch in der haubt .exe datei einen counter reinsetzen sodas das programm maximal 30 Tage laufen kann oder ist sowas nicht möglich?
Ja, genau darum gehts doch hier.
da man ja sobalt er versuct das zu ändern gleich die ausfürbahre datei mitlöscht und so das unutzbar macht.
Geht das net?
Ne du, da biste komplett aufm falschen Dampfer. Wenn man eine Datei manipuliert, löscht man die nicht, sondern manipuliert die nur. Also das is die falsche Taktik.
Das bringt mich leider alles noch nicht weiter.
Liebe Grüße
- VampireSilence -
Ne, also die richtig guten lassen sich durch nichts und niemanden austricksen und genau das will ich auch schaffen.
ne das ist nicht ganz richtig, egal was du für einen Schutz baust wenn paar Leute genug zeit
investieren lässt sich ziemlich alles knacken egal ob Software oder Websites.
Dementsprechend weiß ich nicht ob du dir wirklich über so etwas
den Kopf zerbrechen willst , woran sehr große Firmen gescheitert sind , siehe Ubisoft und Assassins Creed 2 wo
die geglaubt haben das nichts und niemand so einen Schutz umgehen kann. -
okaay dann weis ich vieleicht weiter ;P
es gibt doch ganz sicher einendienst in windows der fortlaufend die zeit oder irgendwelche aktionen immer in einem bestimmten zeitabschnitt tun, mir fällt so keiner ein da ich linux benutze aber okay,
dannkönnte man sich doch an einem solchen dienst orientieren welcher z.b alle 3 Tage durchgeführt wird, so musste in dein programm schaun das dieser dienst 3 mal gestartet ist.
oder du machst das nicht mit 30 Taagen, sondern das das Programm nur 1 Stunde Laufen kann und dann sich automatisch beendet, das ist doch auc eine möglichkeit, dann lässt du beim programmstart einen counter starten der das programm nach 60minuten beendet.
Ich weis ich hab nie die besten ideen abba okee :)
Max -
Wie wäre es denn, nicht 30 Tage, sondern 30 Startvorgänge zu nehmen. Also anstatt das Programm 30 Tage lang zu testen, kann man das Programm 30 mal aufrufen.
Per Counter zählst du das beim Startvorgang dann einfach mit. Diese Lösung habe ich schon bei diversen Programmen gesehen und kann per Systemzeit auch nicht ausgetrickst werden. -
Die Idee von karpfen währe mir ganz sicher auch noch gekommen ;P
Ich muss karpfen recht geben, das mit den Startvorgängen gibt es auch gein vielen Produkten, Ich glaub bei Adobe gabs das auch mal, dann sinds auf die 30 Tage umgestiegen :)
Max -
ok anstatt zu allen ideen das negative herauszuholen ^^, schlag ich auch mal was vor,
du müsstest an die windows ereignisse kommen, wenn mann die Uhr ändert steht
da soetwas änhliches wie
http://img295.imageshack.us/img295/825/unbenanntrx.png
damit könnte man aufjeden fall etwas anfangen, das man dann die ursprungzeit nimmt
-
bigdiddy schrieb:
ne das ist nicht ganz richtig, egal was du für einen Schutz baust wenn paar Leute genug zeit
investieren lässt sich ziemlich alles knacken egal ob Software oder Websites.
Dementsprechend weiß ich nicht ob du dir wirklich über so etwas
den Kopf zerbrechen willst , woran sehr große Firmen gescheitert sind , siehe Ubisoft und Assassins Creed 2 wo
die geglaubt haben das nichts und niemand so einen Schutz umgehen kann.
Ok da hab ich keine Argumente dagegen, aber ich will zumindest die ganz plumpen Manipulationen ausschließen können.
linuxworld schrieb:
oder du machst das nicht mit 30 Taagen, sondern das das Programm nur 1 Stunde Laufen kann und dann sich automatisch beendet, das ist doch auc eine möglichkeit, dann lässt du beim programmstart einen counter starten der das programm nach 60minuten beendet.
An sich auch eine gute Idee, aber in meinem speziellen Fall leider nicht umsetzbar, da das Programm, dass ich damit begrenzen will, dann nutzlos ist.
karpfen schrieb: Wie wäre es denn, nicht 30 Tage, sondern 30 Startvorgänge zu nehmen. Also anstatt das Programm 30 Tage lang zu testen, kann man das Programm 30 mal aufrufen.
Per Counter zählst du das beim Startvorgang dann einfach mit. Diese Lösung habe ich schon bei diversen Programmen gesehen und kann per Systemzeit auch nicht ausgetrickst werden.
Ja, das habe ich eingangs ja auch schon überlegt (Methode 3), die Frage ist hier halt nur, wie ich das dann so speichere, dass der Wert auch nur vom Ursprungsprogramm verändert werden kann. Denn wenn ich jetzt in einen Registryschlüssel, die verbleibenden Tage speichere, geht einfach einer hin und ändert die Zahl, dann ist die Begrenzung schon wieder überwunden.
bigdiddy schrieb: ok anstatt zu allen ideen das negative herauszuholen ^^, schlag ich auch mal was vor,
du müsstest an die windows ereignisse kommen, wenn mann die Uhr ändert steht
da soetwas änhliches wie
http://img295.imageshack.us/img295/825/unbenanntrx.png
damit könnte man aufjeden fall etwas anfangen, das man dann die ursprungzeit nimmt
Wenn ichs hinbekäme, wäre das ideale Lösung, allerdings muss ich dann natürlich permanent ein Wächter-Programm laufen lassen, dass diesen Vorgang erkennt und den Zeitraum anpasst. Die Frage ist nur, ob der Anwender dieses Programm dann auch brav laufen lässt und nicht irgendwann einfach über den Task-Manager beendet.
Liebe Grüße
- VampireSilence -
Ah ok, ich habs nur überflogen und das wohl übersehen. Wie man dies abchecken kann ist eine gute Frage. Aber ich finde es sowieso schon fragwürdig, ein Programm so auszustatten, dass es mehr als nur plumpe Versuche feststellt.
Ich kann nachvollziehen, dass man sich irgendwo gegen die unerlaubte Vervielfältigung schützt, aber wenn man übertreibt (Wächterprogramme und Co) dann fliegt man irgendwann auf die Schnauze, weil man dann immer unseriöser wirkt, vor allem bei Laien, die nicht wissen, was diese Programme machen und wozu sie notwendig sind. Aber das wäre ein anderes Thema! -
Sicherlich kann man das ganze beliebig kompliziert machen. Auch könnte ich das gesamte Programm polymorph mit den verbleibenden Tagen rekodieren, allerdings nimmt das dann irgendwann trojanerähnliche Züge an, daher stehe ich dem Ganzen kategorisch eher negativ gegenüber. Zumal die Anwender dann auch einfach eine erste Version in Archiven "konservieren" könnten, daher wäre auch diese Idee wieder hinfällig.
Warscheinlich ist es auch grade das Problem, dass man die Sachen ablehnt, die man sich selber ausdenkt, weil man ja quasi schon weiss, wie man sie aushebelt. Ich hoffe, ich oder irgendwer hat noch einen wirklich genialen Geistesblitz, der mich zu einer geeigneten Begrenzung inspiriert.
Liebe Grüße
- VampireSilence
Beitrag zuletzt geändert: 5.7.2010 1:20:25 von vampiresilence -
Eine weitere Möglichkeit wäre vielleicht eine Datei zu Programmlaufzeit aus der Exe zu laden und diese nach Beendigung in die Exe zu schreiben und wieder zu löschen. Das wäre dann vollkommen unabhängig von Registry und co. Der Nachteil ich habe echt keinen Schimmer wie man so was programmiert, wenn wer Erfahrung hat schreibt es bitte hier rein und wenn es geht den Quelltext bitte noch nach Delphi umwandeln, ja?
-
aber wenn man dan das programm via taskmanager beendet, hatt das programm nicht die chance das in die exe zu schreiben....
Max -
Hey du bist gut ! Hab das garnicht in Betracht gezogen, eventuell kann man noch sowas reinbauen, das der bei Programmabbruch nen Tag oder so abzieht? Sry jetzt bin ich echt überfragt, wie gesagt es gibt keinen guten Kopierschutz, irgendnen schlauer Fuchs schafft es ja dann doch wieder, am besten wäre es nicht den selben Fehler wie Ubi zu machen und vielleicht auch etwas Geld in das Programm an sich investieren^^
-
Hm also ich kann dazu nur das Zauberwort hashing bemühen.
Du hast irgendeine "Funktion", die aus dem gespeicherten Wert einen neuen Wert macht.
Zb sowas wie MD5.
Dann speicherst du den Wert und den durch die Funktion gejagten Hash-Wert.
Wenn jetzt ein netter User den Wert ändern will, muss er erstmal deine Hash-Funktion kennen, um
dann daraus noch den passenden Hash-Wert zu machen. Schafft er dies nicht, dann sagt dein Programm
einfach, dass er betrügen wollte und nicht mehr das Recht dazu hat es zu benutzen.
Die ganze Sache steht und fällt mit der Knackbarkeit deiner Hashfunktion oder besser deren Geheimhaltung.
Letztlich ist es durch Reverse-Engeneering immer möglich die Funktion rauszufinden aber das ist schon
ziemlich schwer, wenn du dich nur richtig anstellst.
Damit würde ich dir jetzt auch nicht viele Tipps geben, wie genau du die Hashingfunktion gestalten solltest,
denn sonst wäre sie ja schon bekannt
Such einfach mal nach solchen sachen wie MD5 oder SHA und lass dich inspirieren.
PS: Die Methode mit dem Hashing hab ich mir jetzt nur für den Zähler, wie oft die Anwendung gestartet wurde, gedacht aber ich denke mit etwas Phantasie kriegst das bestimmt auch auf andere Lösungen gebogen. ^^ -
gauss-design schrieb: Eine weitere Möglichkeit wäre vielleicht eine Datei zu Programmlaufzeit aus der Exe zu laden und diese nach Beendigung in die Exe zu schreiben und wieder zu löschen. Das wäre dann vollkommen unabhängig von Registry und co. Der Nachteil ich habe echt keinen Schimmer wie man so was programmiert, wenn wer Erfahrung hat schreibt es bitte hier rein und wenn es geht den Quelltext bitte noch nach Delphi umwandeln, ja?
Dazu könnte ich dann aber auch direkt die *.exe benutzen, indem ich vor dem compilieren einfach einen byte definiere, den ich nie benutze. In dessen Offset könnte ich dann prima herummanipulieren und bspw. die "30" Tage speichern. Und das ganze nicht bei Programmende, sondern bei Programmstart. Dabei wäre es dann sogar egal, ob man das Programm durch den Task-Manager beendet, oder nicht.
sektor schrieb: Hm also ich kann dazu nur das Zauberwort hashing bemühen.
Du hast irgendeine "Funktion", die aus dem gespeicherten Wert einen neuen Wert macht.
Zb sowas wie MD5.
[...]
Such einfach mal nach solchen sachen wie MD5 oder SHA und lass dich inspirieren.
Ich habe schonmal einen eigenen Algorithmus geschrieben, den CCK. Der ist zwar kein Hash, sondern ein Cryptoalgorithmus, aber er erfüllt beide Zwecke, daher bräuchte ich sogar nur einen Wert zu speichern. Dadurch dass der CCK Polymorph ist, dürfte es auch eine Weile dauern, bis man ihn gezielt manipulieren kann. Es sei denn, man schaut einfach, was am ersten Tag in verschlüsselter Form in der Datei gestanden hat und kopiert genau diesen Wert einfach immer wieder rein. Verstehst du, wo das Problem liegt ?
Und Copy&Paste traue ich selbst dem Dümmsten zu..
Liebe Grüße
- VampireSilence -
Hab das Thema jetzt nur überflogen un hoffe, dass meine Idee noch nicht gekommen ist^^.
Also da du das ganze mit C# programmierst kannst du (wenn du von der Zeit unabhänig bleiben willst) die Starts zählen. ...ok so weit nichts neues
Aber statt das ganze in die Reg oder in eine Datei (als Text o.ä.) zu schreiben kannst du einfach eine entsprechende Klasse als DLL kompilieren (auch zur laufzeit).
Hab jetzt keine lust das zu versuchen. Als Stichworte kann ich dir CSharpCodeProvider nennen. Da kann man aus einem String eine DLL kompilieren. Du kannst z.B. eine Klasse (als string) erstellen und dann iht eine public Funktion zum Abrufen der verbleibenden Starts hinzufügen. Dann kannst du von den verbleibenden Starts ein abziehen und dann eine neue DLL erstellen. Um die DLL dynamisch zu Laufzeit zu laden kannst du [DLLImport] (könnte auch ein bisschen anders heißen^^) verwenden. Such in der MSDN oder bei Google einfach mal nach DLLImport und CSharpCodeProvider.
PS: Hab grad gesehen, dass MD5 empfolen wurde, dass würde ich nicht nehmen, da man das nicht wieder "zurückverschlüseln" kann.
Eine weitere öglichkeit wäre es im Code einfach für jeden Tag einen Code zu definieren (kann z.B. so aussehen:
)string OneDayLeft = "HJK4458KJ_1"; string TwoDayLeft = "HEZPD456K_2"; //etc. //beim beenden die Verbleibenden Tage (den Code in Datei schreiben und beim nächsten Start wieder auslesen und dann "Parsen"
dann kannst du die verbleibende Zeit als Reintext in eine Datei schreiben (und das ist für normale User nich zu knacken).
Und bei jeden Programmstart dann aus der Datei auslesen und dann die Verbleibenden Tage damit verbinden. z.B. mit switch-case
PS: Ich schreib heute Nachmittag mal ein Beispiel und werds auf meiner Homepage zeigen.
Beitrag zuletzt geändert: 7.7.2010 11:51:10 von primenic -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage