Thema: Kopierschutz

Einzelnen Beitrag anzeigen

Peter666

Registriert seit: 11. Aug 2007
357 Beiträge
 
#1

Kopierschutz

  Alt 30. Dez 2010, 16:22
Hallo allerseits Sicherlich werden einige Leute hier ein ähnliches Problem haben, wie ich hier beschreibe: Wer gute Software produziert muss auch damit rechnen dass diese raubkopiert und/oder gecracked wird. Als Entwickler nimmt man das selbstverständlich ziemlich persönlich und es ist denke ich ein Ammenmärchen, dass alle die eine Raubkopie nutzen sich niemals die Software legal erwerben würden.
Wie dem auch seih, in der Regel sollte man nicht zu viel Arbeit in das Entwickeln eines Kopierschutzes stecken, da professionelle Teams nahezu jeden Kopierschutz auf Kurz oder Lang aushebeln.
Aber niemand hat behauptet man sollte es ihnen leicht machen
Was waren also meine Schritte bis zu meiner jetzigen Lösung (sieht man von der Webrecherche ab)? Zu allererst kauft man sich einen Exepacker für den es keinen One-Click Unpacker gibt. Gute Beispiele finden sich im Netz, deswegen gehe ich nicht darauf ein.
Der zweite Ansatz ist eine dezentrale Schlüssellogik die nicht auf eine einfache: "If Key=GenerateKey(Nutzerkennung)" hinausläuft. Auch sollte man sowas wie: If Keyeingabe=False then Showmessage('Falscher Schlüssel') tunlichst vermeiden..
Aber dennoch gibt es diverse Codestellen die man gerne unleserlich machen möchte. Mein Ansatz schaut hierfür wie folgt aus:
Man packt einen Marker an den Beginn der zu verschlüsselnden Codezeile und einen an das Ende.

Delphi-Quellcode:
 lblBlockStart:
    asm
     db $EB, $0B; // Jmp +10 -> die Position hinter dem MarkerStart- Text
     db "MarkerStart"
    end;

 lblBlockEnd:
    asm
     db $EB, $09
     db "MarkerEnd"
    end;
Die Adressen der beiden Labels kann man via mov eax, offset lblBlockStart bzw. lblBlockEnd ja auslesen.
Zum Verschlüsseln reicht ein einfaches:

Delphi-Quellcode:
 data:= pointer(StartPosition);
 VirtualProtect(data, EndPosition-StartPosition, PAGE_EXECUTE_READWRITE, @OldProtect);
 // verschlüssele den Data Pointer mit einem Algorithmus
 VirtualProtect(Data, EndPosition-StartPosition, OldProtect, @oldProtect);
vollkommen aus.
Jetzt braucht man nur noch ein Patchtool zu schreiben, dass nach $EB, $0B, "MarkerStart" bzw. dem Endmarker sucht und verschlüsselt das ganze mit dem gleichen Passwort.

Das ganze kann man sicherlich verfeinern, dass bleibt ja jedem selber überlassen..

Hat jemand eventuell noch irgendwelche Ideen, die das Debuggen vermiesen? Ich denke da an Funktionen die in einem separaten Thread aufgerufen werden und nach Debuggern ausschau halten bzw. im Zweifel die Anwendung beenden.
Alles was sich so im Internet befindet ist irgendwie Stand <=2005

Peter
  Mit Zitat antworten Zitat