Heikel: Programmlizensierung - Reading und Writing in Windows überschreiben?
-
Heyho,
folgendes Problem:
ist es möglich, grundsätzlich jede Datei, die im Betriebssystem gespeichert werden soll, auf ihren Inhalt zu überprüfen, und auch das Speichern bei bestimmten Bedingungen komplett zu unterbinden?
Und, zusätzlich, kann man das auch beim Laden tun? Wenn der Inhalt einer Datei geladen werden soll, kann man dann z.B. eine ganz andere Datei laden?
Der Hintergrund:
unsere Firma gibt für ein Programm erstellte Komponenten gegen Entgeld heraus. Diese Dateien sind Plain-Text. Sie liegen in Plain Text auf der Platte, sind in dem Programm, in das sie hereingeladen werden, Plaintext, und können von diesem Programm aus auch wieder Plaintext gespeichert werden. Sobald jemand den Plaintext hat, braucht er von unserer Firma für Kopien keine Lizensierung mehr.
Das Hauptprogramm, nennen wir es XYZ, kann nicht geändert werden.
Nun ist meine idee:- Die Dateien, nennen wir sie Komponente.txt, werden von uns verschlüsselt.
- Wir geben ein Tool, Hardwaregebunden an einen einzigen Rechner, heraus. Dieses muss, wenn die Komponente geladen werden soll, im Hintergrund laufen!
- Um sie in XYZ zu laden, muss man dieses Starten.In der entschlüsselten Datei, die nun in XYZ geladen ist, ist an oberster Stelle ein Kommentar eingefügt:
// LKNSFKLNSFLKNFSKLNFKLSNKLSNFSLKFN- Das Tool, welches im Hintergrund läuft, überprüft JEDE Datei, die im Betriebssystem gespeichert wird. Ich will also allgemein den kompletten Speichervorgang von Windows überwachen.
- WENN nun die obenstehende Zeile in der Datei, die gespeichert werden soll, erscheint, dann wird das Speichern unterbunden!
- Schiesst man unser Überwachungstool aus dem Speicher, wird die Komponente aus XYZ herausgeladen (dies ist möglich).
Ist das möglich??
-
Machbar: Ja
Sinnvoll: Nein
-
Hallo DrOetker,
grundsätzlich sollte dies schon möglich sein. Ein Ansatz wäre z.B. das Hooken der betroffenen API's.
Am besten geht man möglichst tief, soll heißen, gleich auf Kernelebene oder User32 API's möglichst tief hooken.
Also nicht "fwrite" und "WriteFile" hooken, sondern gleich "NTWriteFile", oder wie die API auch heißen mag.
War zu faul um nachzuschauen
Dann könnt ihr die Datei auf den Header scannen und bestimmen was passieren soll. Allerdings müsst ihr auf die Performance aufpassen!
Denn es wird ja jeder Dateilese/-schreibebefehl erst an die eigene Funktion umgeleitet und das kann ordentlich das System verlangsamen.
Auch würde ich mir vielleicht überlegen, ob das überhaupt der wirklich richtige Ansatz zur Lizensierung ist. Denn solch ein Vorgehen benötigt schon starke Kompromitierung des Systems und kann auch zu schweren Problemen führen. Ein großteil der Rootkit's und auch manche Kopierschutze benutzen genau solche Techniken, und geraten immer mehr in Verrufung! Siehe SonyBMG-Kopierschutz!Falls du dir aber das ganze doch mal anschauen willst, kann ich dir die madCodeHook Library nur empfehlen! Diese übernimmt den größten Teil der Arbeit.
Gruß
Hooker
-
Vielen Dank erstmal.
@junix: warum nicht sinnvoll? aus den im oben genannten posting genannten gründen?
was die performance betrifft... also, im grunde ist die ladefunktion nur ein filenameswitch -> eine if-abfrage, die prüft, ob die von uns bereitgestellte komponente geladen werden soll, oder etwas anderes - dazu genügt prüfung auf den dateinamen, was ja fix gehen sollte.
schreibvorgang: da muss man sich in der tat etwas überlegen, dass das sehr fix vonstatten geht. man könnte zumindest schon einmal die dateigröße ungefähr einschränken (z.b. 1kb - 50kb) und damit einige dateien direkt durchlassen. die größe ist im programm nicht modifizierbar.
ein pro-argument ist noch, dass virenscanner ja genau dasselbe tun. abgesehen davon läuft das programm ja auch nur, wenn der user die komponente verwendet werden soll, also hat er die kontrolle, ob es gestartet ist, oder nicht.
Für anderweitige Vorschläge bin ich natürlich offen! die Problematik sollte ja beschrieben sein, oder?
-
- WENN nun die obenstehende Zeile in der Datei, die gespeichert werden soll, erscheint, dann wird das Speichern unterbunden!
Und was ist wenn das eine andere Datei auch als Inhalt hat? Ich würd dein Programm sofort von der Platte löschen

MfG SideWinder
-
Hallo,
das mit dem Dateiheader kann natürlich zufällig, aber auch böswillig zu einem Problem werden.
Rein theoretisch wäre es ja möglich jede Datei mit diesem Header zu versehen und schon ließe sich keine Datei mehr öffnen wenn euer Programm läuft!
Nicht sonderlich wahrscheinlich aber dennoch möglich und daher ein mögliches Problem.Auch das mit der Performance ist nicht so einfach. Die wohl sinnvollste Variante für solch ein globales hooken wäre das Patchen von DLL-Funktionen im Speicher, was zur Folge hat, dass zuerst eine ganze weitere Reihe an Funktionen durchlaufen werden müssen, bevor eure eigene Funktion an die Reihe kommt.
Allerdings kann ich nicht genau sagen, wie stark die Performance durch so etwas leiden würde.
Ich persönlich würde versuchen die gesamte Lizensierung anderster zu gestalten. Denn ich schätze bei diesem gäbe es eine ganze Reihe Betrugsmöglichkeiten.
Gruß
HookforLicense
-
Das Tool, welches im Hintergrund läuft, überprüft JEDE Datei, die im Betriebssystem gespeichert wird. Ich will also allgemein den kompletten Speichervorgang von Windows überwachen.
Ich würde das als Computersabotage bezeichnen. Diese Funktion gehört sicher nicht zur Leistungsbeschreibung der vom Kunden erworbenen Software. Schadensersatzforderungen des Kunden wegen Fehlfunktionen des mit dieser Software bestückten Rechners wären nicht unwahrscheinlich.
-
nur mal zur info: es handelt sich nicht um eine software, die von tausenden leuten genutzt wird, und über dessen nutzerkreis wir keine kontrolle haben.
nungut, dann sollte man evtl. eine ebene höher ansetzen. und nicht so tief ins betriebssystem greifen. aber ein abgewandelter ansatz, und zwar, eine datei, die soeben gespeichert wurde, bei positiver überprüfung auf den header direkt wieder zu löschen, wird doch irgendwie möglich sein? oder gibt es keine handles, die mir melden, dass soeben eine datei gespeichert wurde?
um die sicherheit zu erhöhen, dass es sich um die richtige datei handelt, könnte man den header auch an vordefinierte stellen, sagen wir, 5 stück (aus performancegründen), in der datei verteilen. wenn er dann noch ausreichend lang ist, sollte die chance, dass eine andere datei diesen enthält, gegen null gehen.
-
noch ne andere frage, kann man feststellen, von welcher anwendung gerade ein Datenstream geschrieben wird? denn dann müsste man nicht direkt in die tiefen des betriebssystems, sondern ich könnte prüfen, ob von der anwendung XYZ geschrieben werden soll, und diese dann blocken. dazu müsste ich auch nur die ersten paar zeichen überprüfen und wüsste ausserdem, dass der header nicht in irgendeiner datei in genau dieser form vorkommt. denn die dateimuster der von diesem programm ausgehenden dateien sind bekannt!
-
Hallo,
ich halte die gesamte Lizensierungsystem für falsch. Wenn der Kunde die Demo??? in Plaintext hat und dieser angezeigt wird, gibt es etliche Möglichkeiten den zu klauen, würde ich mal behaupten. Da wären ganz einfach die Zwischenablage und z.B. kompliziertere Dinge wie Code/DLL-Injection um an den Text zu kommen und ihn dann nach Beenden des Programms abzuspeichern. Und jetzt nicht kommen mit "das Programm läuft dann halt immer im Hintergrund". Das wäre ganz schlecht.

Gruß
HookforLicense
-
naja, zwei punkte:
- plaintext ist im programm nicht anzuzeigen, damit scheidet die zwischenablage aus
- die kunden werden höchstwahrscheinlich keine programmierer sein, die sich supergut mit der winapi auskennen. wenn sie es doch auf dem weg schaffen, sei es ihnen gegönnt.ist es denn nun möglich, den schreibstream einer bestimmten anwendung zu blocken??
-
DrOetker schrieb:
naja, zwei punkte:
- die kunden werden höchstwahrscheinlich keine programmierer sein, die sich supergut mit der winapi auskennen. wenn sie es doch auf dem weg schaffen, sei es ihnen gegönnt.Wenn das Deiner wirklichen Meinung entspricht, warum willst Du dann auf diese umständlichste Weise irgendwie versuchen, Deinen PlainText zu schützen?
Überlege Dir lieber ein vernünftiges System anstatt den kompletten Lese- und Schreibforgang zu hooken!Es geht doch überhaupt nicht darum, dass der Anwender API-Kenntnisse hat oder nicht, sondern dass Du mit dieser Methode die Rechnerperformance in den Keller verlagerst!
-
Zu Punkt 2: Ich habe mir ja schon eine andere Möglichkeit überlegt:
Überwachen, ob das Programm etwas schreibt, wenn ja, die Datei prüfen, und ggf. löschen. Dazu muss man wissen, ob man soetwas machbar ist.Zu Punkt 1: Es ist ganz einfach extrem unwahrscheinlich, dass jemand das auf diese Weise knacken wird, und zwar aus genannten Gründen. Ist es nicht verschlüsselt, muss er nur auf "Speichern" klicken und fertig.
Zweitens muss ein solches Projekt in einem erträglichen Kosten- Nutzenverhältnis stehen, ganz einfach. Das gilt übrigens auch im Umkehrschluss, das Ding zu knacken würde wohl mehr Kosten verursachen, als eine Lizenz zu kaufen, also wird es mit 99prozentiger Wahrscheinlichkeit nicht passieren, das müsst ihr nun einfach so hinnehmen!Außerdem: ich will mir ja gerade ein vernünftiges System überlegen, deshalb frage ich ja auch hier um Rat. Aber für die Situation fällt mir ganz einfach nichts anderes ein!
- An die Ladefunktionen von XYZ kommt man nicht ran - An die Speicherfunktionen kommt man nicht ran - An die Kontextmenüs kommt man nicht ran - Datei darf auf Platte nicht im Plaintext liegen und nicht aus XYZ mit der integrierten Speicherfunktion geschrieben werden.Was bleibt also noch, ausser in irgendeiner Weise den Schreib und Ladevorgang zu überwachen? Nun gilt es eben, diese Überwachung einzig und allein an XYZ zu koppeln sowie sicherzustellen dass sie extrem einfach gehalten ist, um die Performance nicht zu drücken, und ich wäre für Vorschläge dankbar.
-
Für Dein Problem das einfachste ist:
Du verwendest einen Hardware Dongle mit Crypto-Chip (ca. 40 Eur), der kann dann das De-/Entschlüsseln der Daten auf der Festplatte vornehmen. Ist dieser Dongle nicht da, geht es halt nicht.
Das ist der sicherste Schutz.
Siehe:
http://www.safenet-inc.com/products/sentinel/hardware_keys.asp
http://www.safenet-inc.com/products/sentinel/sentProdHKFAQ.asp
-
Ich kann Jochen nur zustimmen.
Ihr solltet für die Übergangszeit eine fertige Lösung einkaufen, ud Du solltest lieber Deine Zeit darauf verwenden, einen passenden Ersatz hochzuziehen.Du verletzt Regel 1 und 2 des Lizenzschutzes:
(1) Verärgere Deine zahlenden Nutzer nicht
(2) Langfristiger Schutz ist nur über Updates und Support möglichNicht-technisch:
Wenn ihr keine Erfahrung mit sowas habt, dann kostet das eine Menge Zeit (sprich Geld), und ihr seid schneller geknackt als ihr denkt. Ein solches Programm würde ich nicht in die Firma lassen - es sei denn, wir sind auf Gedeih und Verderb darauf angewiesen. Nicht nur wegen des technischen Aufwands, sondern weil es eine Menge über euch verrät.
Das sich die angepeilte Lösung in einigen Staaten am Rande der Legalität bewegen mag ist da nur eine Fußnote.Daß die Lizenzkosten niedriger sein sollen als der Crack-Aufwand verwundert mich. Wenige Kunden, niedriger Preis, aber hochkomplizierter Kopierschutz - wie geht das?
Technisch:
Bei deinem Ansatz mußt du damit rechnen, regelmäßig Anpassungsarbeiten (für spezielle Systemkonfiguration, neue Sicherheits-Updates usw.) durchzuführen.
Ein besserer Ansatz wäre, XYZ.exe zu patchen und das laden/speichern auf 'anständige' Funktionen umzuleiten. Wie das geht findest DU auf jeder Hackerseite

-
okay, die hooking-variante ist dann gekippt.
hat noch einer etwas ahnung von diesen hardware-dongles, und kann mir die funktionsweise etwas genauer erklären? kann man mit diesem ding wirklich genau das abdecken, was gefordert ist?
-
Ich denke doch die Urheber der Site auf welche JOchen gelinkt hat und welche du bestimmt schon aus Interesse besucht hast, ist der schnellste und vor Allem auch der verlässlichste Auskunftsdienst was derlei Fragen anbetrifft. Jochen hat ja schliesslich auch auf eine FAQ gelinkt zu dem Thema..
-
Die Dongle-Lösung verschlüsseln die EXE und versehen sie mit einem Stub der
(1) Vorhandensein eines gültugen Dongles prüft und bei erfolg (2) den "Rest" der EXE entschlüsselt und ausführt.Erfüllt also nicht deine originalen Anforderungen (verschlüsseln der Textdateien), sondern reguliert den Zugriff aufs Programm - sollte aber auch funktionieren.
Das bietet auch nicht den "vollen" Schutz der per Dongle möglich ist (integration in Anwendung bringt mehr)
-
peterchen schrieb:
Die Dongle-Lösung verschlüsseln die EXE und versehen sie mit einem Stub der (1) Vorhandensein eines gültugen Dongles prüft und bei erfolg (2) den "Rest" der EXE entschlüsselt und ausführt. Erfüllt also nicht deine originalen Anforderungen (verschlüsseln der Textdateien)
Da kennst Du den Dongle aber schlecht!
Der erfüllt zu 100% die Anforderungen.
Auf dem Dongle befindet sich ein CHiffrier-Chip den man per API ansprechen kann. Damit kannst Du dann selber ver- und entschlüsseln was Du willst...Das obere, was Du zitierst, ist zwar auch möglich, aber würde hier ja nur als "Abfallprodukt" verwendung finden (wenn man will).
-
Der Firma habe ich schon eine Frage geschickt.
Mir ist das Ganze jetzt etwas unpräzise, weil ich es nicht ganz verstehe - also den Weg.Wir geben also verschlüsselte Dateien raus, die nur mit dem Dongle entschlüsselt werden können, und den Dongle.
Wie läuft das denn nun, dass man die Datei nicht speichern kann und bestimmen kann, von wo sie geladen wird?Setzt sich der Dongle auch tief ins Filesystem, oder was? Irgendwie ist mir die Verfahrensweise noch nicht ganz klar..
-
Auf dem Dongle befindet sich ein CHiffrier-Chip den man per API ansprechen kann. Damit kannst Du dann selber ver- und entschlüsseln was Du willst
Das ist natürlich neckisch

(Trotzdem bleibt bei Verschlüsselung der EXE ohne Source-Eingriff eine generische Attacke möglich)
@DrOetker: du verschlüsselst die EXE, nicht die Datendateien (solange du die EXE nicht ändern kannst)