Anti-Debug

Hallo zusammen,
für eine Anwendung (VB6) gehe ich davon ausgehe, dass sie über kurz oder lang manipuliert wird. Da der Kunde Programmlaufzeit kauft, kann auch erheblicher finanzieller Schaden entstehen.

Muss sagen, dass ich nicht so der Spezialist für das Anti-Debugging bin und habe mir folgendes überlegt.

In der Startsequenz werden an einigen Stellen die Funktionen

IsDebuggerPresent
NtQueryInformationProcess

aufgerufen.

Wird ein Debugger erkannt, erfolgen kleinere Abwehrmassnahmen und das Programm wird beendet. Der Nutzer wird mit seinem Debugger all diese Stellen im Programm bearbeiten und die veränderte manipulierte EXE abspeichern.

Der anschliessende Neustart bringt für den Nutzer dann erstmal nichts ungewöhnliches. Die Software ist "normal" nutzbar. Wenn er denn glaubt, er wäre mit seiner Manipulation schon durch, greift irgendwann/irgendwo eine zweite Massnahme, die an mehreren unverfänglichen Programmstellen integriert ist.

Es wird eine CRC-Prüfsumme der App.Exe gebildet. Der Vergleichs- oder Sollwert kommt von einem externen Server. Ergibt sich eine Abweichung, wurde die Anwendung manipuliert. Ist dann die Falle zugeschnappt, kann er nicht mehr reagieren und er wird schlimmstenfalls sein Windows neu installieren müssen.

Was haltet ihr davon? Ist das ein gangbarer Weg ?
Vielen Dank.
Gruss
 
Security through Obscurity ist kein guter Weg. In deinem Fall beobachte ich als Cracker einfach den Netzwerkstrom bevor und nachdem ich das Programm manipuliert habe und sorge dann dafür, dass "richtige" Werte geschickt werden. Was ist, wenn der Kunde keinen Internetanschluss hat (soll auch vorkommen)?

Was meinst du mit " Ist dann die Falle zugeschnappt, kann er nicht mehr reagieren und er wird schlimmstenfalls sein Windows neu installieren müssen."? Willst du den Rechner des Kunden manipulieren? Das ist aus betriebswirtschaftlicher Sicht nicht klug und juristisch wahrscheinlich unverantwortbar.

Wenn du deine Software schützen willst, hast du zwei Möglichkeiten, entweder du nutzt bereits vorhanden Schutzmechanismen oder du lagerst einen Teil des Codes auf einen deiner Server aus (gleiches Problem wie oben), sodass du Zugriff auf deiner Hardware kontrollieren kannst.

Lesenswert ist evtl: Amazon.com: Surreptitious Software: Obfuscation, Watermarking, and Tamperproofing for Software Protection (9780321549259): Christian Collberg, Jasvir Nagra: Books
 
st dann die Falle zugeschnappt, kann er nicht mehr reagieren und er wird schlimmstenfalls sein Windows neu installieren müssen.
Das ist ein absolutes NoGo. Habe das nämlich schon bei so einigen Programmen gesehen (genauer: "irgendein" Auto-Werkstätten-Programm, das bei einer nicht übereinstimmung der Checksumme das Programm mit einer Meldung beendete sowie einen verzögerten Thread startete, der die komplette NTFS-Datenstruktur am Anfang der Platte löschte :rolleyes:. Der Gedanke des Programmierers ging wohl in die Richtung, dass der böse Cracker erstmal die Beenderoutine entfernt und das Programm dann nochmal testet und damit in die Falle tapt).

In die Rechtmäßigkeit und die damit verbundenen Konsequenzen möchte ich mich gar nicht hineindenken (Anwälte können sehr böse sein und Du müsstest erstmal nachweisen, dass der Geschädigte tatsächlich an dem Programm rumgefummelt hat. Und auch in dem Fall wärest Du imho nicht vor Schadensersatzforderungen sicher).
Bezogen auf das obige Werkstätten Programm ergab sich nämlich die Situation, dass der Programmierer zwar an 100% Sicherheit für ehrliche Kunden geglaubt hat, allerdings IMHO 2-3 "Raceconditions" autreten konnten, bei denen auch ehrliche Kunden betroffen wären (z.B ein Fehler oder bloße Verzögerung beim Beenden des Programms, insbesondere auf MultiCore Plattformen wäre durchaus drin, so dass der Löschthread ungehindert walten dürfte).
Bei den Checksummen ist es auch schon durchaus vorgekommen (vor allem bei kleineren Shareware), dass der Programmierer nach einem Update diesen Teil vergass und das Programm trotz gültiger Lizenz und OriginalExe sich beendete.

Zum Schutz: Prinzipiell dürfte das schon gegen 95% aller Hobbycracker ausreichen. Ob die Anti-Debug API Aufrufe Sinn machen, sei aber dahingestellt ;). Denn StandardOllyDbg Packete beinhalten i.R 1-2 Anti-Anti Plugins, so dass man von diesen Maßnahmen gar nichts merken wird. Der Ansatz mit dem verzögerten CRC Check ist dagegen ganz ok. Mache am besten mehrere "Trampolin Code" Stellen (also eine "Kette" aus Timern und anderen Möglichkeiten, Code verzögert zu starten). Das wäre ein guter Komporimiss bezüglich Aufwand & Sicherheit.


Allerdings hat Dein CRC Schutz auch mehrere Schwächen:

1.Was erhoffst Du Dir von einem Onlinecheck? Ich sehe da keinerlei Vorteile gegenüber gespeicherten Checksummen.
Zum einen ist Deine Software beim Serverausfall nicht mehr verwendbar (und im schlimmsten Fall greift bei ehrlichen Kunden Dein "WorstcasePlattenlöschSzenario" :wink: . Es lassen sich aufjedenfall einige praxisrelevante Fälle konstruieren (die also tatsächlich auftreten können) bei denen es so abläuft).

2. Zum anderen wäre ein Memorypatch durch einen Loader fein raus. Ist auch keine Hexerei, sondern bei ExeCrypter/Themida/ASProtect schon länger Realität :wink: .

Habe zu diesem Thema schon mehrere Beiträge verfasst:
http://www.hackerboard.de/323225-post31.html
http://www.hackerboard.de/267414-post5.html
http://www.hackerboard.de/267557-post16.html
http://www.hackerboard.de/282567-post16.html

(da ist nicht nur allgemein blabla, sondern auch Vor/Nachteile eines Schutzkonzept sowie eigene Vorschläge, die i.R relativ Programmiersprachenunabhängig sind :wink: )
Im Prinzip geht es darum, dass jeder Schutz eine Gleichung ist:
Aufwand für Programmierer == Schutzfaktor == x*Aufwand für den Cracker
(wobei man das x möglichst groß halten möchte)
Hat man eine relativ kleine Zielgruppe, reicht schon ein simpler Ansatz aus. Ansonsten fährt man, wie schon von xrayn erwähnt, am besten "bewährte" Schutzsoftware. Die ist zwar auch crackbar, allerdings in 99% aller Fälle um Größenordnungen sicherer (und vor allem ausgetesteter) als eigene Lösungen und letzendlich deutlich günstiger (Lizenzpreis steht in keinem Verhältniss zu Deinem Aufwand, denn Du für einen annährend so guten Schutz betreiben müsstest).
Letzendlich reichen nämlich ein paar Anti-Tricks nicht aus und man muss sich ein komplettes Konzept überlegen und Umsetzen. Und dann auch pflegen. Sofern man keine Erfahrung darin hat, macht man da so einige Fehler.

Ein Tipp: wenn man Protectoren wie ExeCrypter/Themida nutzt, sollte man sich die Zeit nehmen die Dokumentation dazu zu lesen. Meistens bieten die namenhaften/größeren Protectoren nämlich Einbindungsmöglichkeiten auf Quellcodeebene, die den Schutz deutlich sicherer macht (auch wenn bei VB6 meiner Erfahrung nach Themida/ASProtect/ExeCrypter & Co öfters mal passen müssen :wink: )
 
Ant-Debug

Vielen Dank für eure Antworten.
Vermutlich ist es so, wie ihr schon sagtet. Der Aufwand für die Realisierung eigener Massnahmen wird wohl zu hoch sein und steht wohl in keinem Verhältnis zum evtl. finanziellen Schaden.

Hatte mir deshalb auch schon überlegt, eine Schutzsoftware einzusetzen. Hat natürlich den Nachteil, dass die Performance gewaltig in die Knie geht. Der Code wird ja zur Laufzeit erstmal entschlüsselt und muss anschliessend ja auch noch ausgeführt werden.

Also wollte ich eine "Kleine Lösung". Ein paar Massnahmen, mit nicht allzu hohem Aufwand zu realisieren, aber nervig genug, um den Nutzer zur Speicherung der geänderten Exe zu bewegen.

Und dann irgendwann und irgendwo, vllt. noch zufallsbedingt gesteuert, erfolgt dieser Prüfsummencheck. Glaube auch nicht, dass er selbst mit Olly, diese Stellen im Programm sofort erkennt und sie eleminieren kann.

Meine Überlegung war: Wenn jemand schon einen Debugger nutzt und die Software manipuliert, so hat er schon mal gegen das Agreement (EULA, Nutzungsbedingungen) verstossen und zweitens begeht er eine Straftat (zumindest Ordnungswidrigkeit).
Und weil er sich noch gut im OS und Programmierung auskennt und er schon Zeit verbracht hat, die Software zu manipulieren, so sollte er auch noch Zeit haben, sein Windows neu zu installieren.
Villeicht reicht es auch schon, Windows einzufrieren, so dass er zum Kaltstart gezwungen wird. Denke aber mal, dass so etwas nicht reicht.

Und dann steht noch im Agreement: Für Schäden, die durch Einsatz dieser Software entstehen, wird keine Haftung übernommen.

Gruss
Und nochmal Danke für eure Antworten
 
Meine Überlegung war: Wenn jemand schon einen Debugger nutzt und die Software manipuliert, so hat er schon mal gegen das Agreement (EULA, Nutzungsbedingungen) verstossen und zweitens begeht er eine Straftat (zumindest Ordnungswidrigkeit).
Obwohl ich kein Jurist bin, kann ich dir sagen, dass die EULA vor einem Gericht nicht anerkannt wird. Denn diese ist dem Kunden zu dem Zeitpunkt des Kaufes nicht bekannt. Du kannst es aber in den Kaufvertrag hineinschreiben, dass der Kunde im Falle einer Manipulation der Software für sämtliche entstandene Schäden aufkommen muss.

Und weil er sich noch gut im OS und Programmierung auskennt und er schon Zeit verbracht hat, die Software zu manipulieren, so sollte er auch noch Zeit haben, sein Windows neu zu installieren.
Villeicht reicht es auch schon, Windows einzufrieren, so dass er zum Kaltstart gezwungen wird. Denke aber mal, dass so etwas nicht reicht.
Nochmal, das verstößt gegen das Gesetz. Du darfst keine Daten löschen oder manipulieren. Stell dir vor in deinem Programm ist ein Fehler vorhanden und dieses nimmt irrtümlicher Weise an, dass es selbst manipuliert wurde und leitet daher "Abwehrmaßnahmen" ein. Dabei gehen für den Kunden wichtige Daten verloren und es entsteht ein Schaden von mehreren Tausend Euro. Nun zieht der Kunde vor Gericht und kann beweisen, dass die Abwehrfunktion durch einen Fehler im Programm ausgelöst wurde, nochmal ich bin kein Jurist, aber ich kann dir versichern, dass du für den Schaden haften wirst.

Und dann steht noch im Agreement: Für Schäden, die durch Einsatz dieser Software entstehen, wird keine Haftung übernommen.[...]
Wenn du in den Kaufvertrag hineinschreibst: "Die Software beinhaltet eine Routine, welche für Datenverlust sorgt und Windows unbrauchbar macht und der Käufer erklärt sich mit dem Risiko einverstanden sämtliche Daten zu verlieren und auf jegliche Schadensansprüche zu verzichten" könntest du vor Gericht damit durchkommen, die Frage ist, ob dann noch jemand deine Software überhaupt kauft.
 
Falls das Programm wirklich im alten VB6 programmiert ist, dann gibt es die Möglichkeit es als Pseudocode bzw. P-Code anstelle von Native-Code zu kompilieren. Dabei wird das Ganze als VM implementiert und im Gegensatz zu .NET ist über diese VM nicht wirklich viel bekannt. Das ist jetzt auch kein 100% Schutz, aber P-Code Programme zu debuggen ist ganz schön nervig.
Ansonsten lässt sich mit dem CRC32-Plugin für Peid einer Datei eine definierte CRC32-Prüfsumme zuweisen. Dazu werden die letzten Bytes der Datei so verändert, dass es passt. Das finde ich persönlich besser, als eine Onlineüberprüfung.
 
Nur 2 Anmerkungen:
Hatte mir deshalb auch schon überlegt, eine Schutzsoftware einzusetzen. Hat natürlich den Nachteil, dass die Performance gewaltig in die Knie geht. Der Code wird ja zur Laufzeit erstmal entschlüsselt und muss anschliessend ja auch noch ausgeführt werden.
Dafür gibt es die Einbindung des Protectors in den Quellcode - damit kann man dem Protector sagen, welche Codeteile nun geschützt werden sollen (die einfachsten Versionen davon funktionieren wie "Marker" - man platziert am Anfang und am Ende des zu schützenden Codes bestimmte Befehle, die dem Protector diesen Hinweis geben).
Initialisierung und alles, was mit der Lizenzprüfung zu tun hat zu schützen sollte schon ausreichen und da der Codeteil (hoffentlich ;) ) nicht 1000 mal pro Sekunde aufgerufen wird, sollte die Performanceeinbüßen nicht merkbar sein.

Meine Überlegung war: Wenn jemand schon einen Debugger nutzt und die Software manipuliert, so hat er schon mal gegen das Agreement (EULA, Nutzungsbedingungen) verstossen und zweitens begeht er eine Straftat (zumindest Ordnungswidrigkeit).
Und weil er sich noch gut im OS und Programmierung auskennt und er schon Zeit verbracht hat, die Software zu manipulieren, so sollte er auch noch Zeit haben, sein Windows neu zu installieren.
Stichwort Virtual Machine. Die ersten fingen schon 2003 auf VMWare & Co umzusteigen. Mit VirtualPC und schließlich VirtualBox sowie aktuelleren CPU Generationen bin ich mir relativ sicher, dass die meisten solche virtuellen Installationen nutzen ;). Denn Vorteile sind klar auf der Hand - man müllt nicht sein eigenes Arbeitssystem zu und kann das virtuelle sehr schnell wiederherstellen ("Snapshots") und vor allem auch locker Kerneldebugger&Co benutzen.
Zudem Deine Ideen nicht ganz so neu sind - auch "etabiliertere" Protectoren wie z.B Themida (aka xtreme protector) hatten am Anfang einen "paranoiden" Schutz, der bei Debuggerdetection einfach das System neustartete. Insofern sind dann nur, wenn überhaupt, die absoluten Anfänger (und eben im Worstcase die ehrlichen Kunden) betroffen.
 
Und weil er sich noch gut im OS und Programmierung auskennt und er schon Zeit verbracht hat, die Software zu manipulieren, so sollte er auch noch Zeit haben, sein Windows neu zu installieren.
Villeicht reicht es auch schon, Windows einzufrieren, so dass er zum Kaltstart gezwungen wird. Denke aber mal, dass so etwas nicht reicht.

Du kannst nicht wegen einer vermuteten(!) von Software festgestellten(!) Straftat im Gegenzug selbst eine Straftat begehen. :rolleyes:

Es ist auch nicht Notwehr, wenn du einen Angreifer abwehrst, ihn aber dann, wenn er schon schon am Boden liegt, noch weiter in den Magen trittst.

Und dann steht noch im Agreement: Für Schäden, die durch Einsatz dieser Software entstehen, wird keine Haftung übernommen.

Wenn du explizit hineinschreibst, dass unter bestimmten Bedigungen des Manipulationsversuchs, das Betriebssystem unbrauchbar gemacht wird, dann wäre das viiieeelllleeeeiichhttt noch koscher.

Ansonsten hilft dir die Klausel nichts. Ich glaube da liegt noch ein Unterschied im Rechtsgut vor. Du haftest zwar nicht entgeltlich für Datenverlust o.ä. aber sehr wohl für die mutwillige Zerstörung mit Vorsatz.
(Aber ich bin kein Jurist und damit keine zuverlässige Rechtsauskunft!)

Und zu guter letzt: Software in VB6, welches für Programmlaufzeit berechnet wird?
Da klingen bei mir irgnedwie die Abzocker-Alaramglocken, sorry.
Normalerweise kenne ich so etwas von großer Industriesoftware und Wartungsverträgen mit 24-Stunden Erreichbarkeit.

Aber ein Visual Basic App auf Windows? :rolleyes:

Was hat deine Software denn für eine innovative Schöpfungshöhe?
Wieviel Leute haben daran gearbeitet und wie lange?

Ich hoffe mal, dass keine Firma darauf reinfällt.
 
Zurück
Oben