Wenn Du gar nichts machst, dann hast Du auch gar keinen Schutz. Es gibt Tools wie den Reflektor (oder auch neue freie Tools), die Dir aus dem Assembly wieder C# und VB.NET (ggf. auch Pascal Code) erzeugen. Es fehlen nur Deine originalen Kommentare
. Dann suche ich nach der Fehlerausgabe "License not found", finde die Stelle und kann mit Plugins (z.B. Reflexil) diese Stelle ändern. Lustig ist aus einem brtrue.s ein brfalse.s zu machen. Dann geht die Software nur, wenn die Lizenz nicht da ist. Ansonsten finde ich Deine "CheckLicense" Funktion und ändere die um in "return true;". Dies macht sogar mein Azubi nach den ersten Tagen C# in der Schule.
Eine Option ist zu Obfuskieren. Da wird der Code verwurschtelt, Namen umbenannt ("CheckLicense" heißt dann "aa", oder besser noch ungültige Zeichen), und ggf. Strings verschlüsselt. Je nach Einstellungen und verwendeten Obfusktor (SmartAssembly von RedGate ist da ganz gut, wobei man RedGate wegen der Politik um den Reflektor eigentlich boykottieren müsste), muss der Azubi mich dann dazurufen, um den Code zu verstehen. Ich habe aber immer noch
IL Code. Wenn die Strings verschlüsselt sind, finde ich Deine Abfrage auch nicht mehr über die Suche nach "License not found". Aber ich suche, wo Deine Anwendung MessageBox.Show aufruft. Und hangle mich von da auch zurück. WICHTIG: Nie Kopierschutzfehlermeldung mit der StandardMessageBox ausgeben. Manche empfehlen das ganze in einem Statusflag zu merken und später auszugeben. Tools wie IDA Pro finde, aber alle Stellen, in dem diese Variable geschrieben wird. Aber auch dies macht es nur etwas komplexer.
Eine bessere Option ist Verschlüsseln. Bei Wibu (für die arbeite ich, das Produkt heißt CodeMeter) wird Dein
IL Code verschlüsselt und an die Anwendung angehängt. Dort wo Deine originalen Methoden waren liegt dann Code von uns. Dieser Code entschlüsselt dynamsich zur Laufzeit Deine Methoden und ruft diese dann auf. D.h. jemand der sich mit dem Reflektor oder IDA Pro Deinen Code anschauen will, sieht nichts mehr, da dieser verschlüsselt ist. Er kann maximal unseren Entschlüsselungscode sehen. Damit das ganze funktioniert benötigist Du eine Runtime von Wibu (CodeMeter.exe), welche als Dienst installiert wird. In Deiner Anwendung ist der der Aufruf für die Entschlüsselung drin, die wirkliche Entschlüsselung passiert dann in der Runtime (im Falle einer Softwarelizenz) oder im Dongle (im Falle von Kopierschutzhardware). Ein potentieller Angreifer der die Lizenz (Dongle oder Lizenzdatei) nicht hat, kann die Anwendung nicht mehr analysieren. Ein Angreifer, der die Lizenz besitzt müsste entweder versuchen alle Methoden zu entschlüsseln oder alle Methoden nach dem Entschlüsseln aus dem Speicher zu dumpen. Im ersten Fall hat Wibu Fallen eingebaut (nicht verwendete Methoden), die bei der Entschlüsslung ein Sperren der Lizenz auslösen. D.h. alle bis dahin nicht entschlüsselten Methoden sind dann auch für den Angreifer nicht mehr erreichbar. Im zweiten Fall müsstes Du dafür sorgen, dass alle Methoden zum Dumpen im Speicher liegen (also einmal aufgerufen wurde). Wenn Du ein Tool schreibst, was genau dies kann, dann kannst Du Dich damit "Dumm und Dämlich verdienen", wenn Du dies an Testabteilungen verkaufst.
Dies war natürlich nur die Spitze des Eisbergs. Du kannst Verschlüsselung mit eigenen Abfragen kombinieren. Teilweise auch Verschlüsselung und Obfuskierung, je nach "Schweinereilevel" ist dies aber ggf. inkompatibel. Du kannst die eigenen Abfragen verschleiern (Aufruf von CheckLicense über Reflektion, wobei Du den Namen CheckLicense verschlüsselt im Source ablegst). Im Entwickler Magazin 1.2011 habe ich dazu einen Artikel geschrieben ("Kein Platz für Cracker"). Als kommerzielle Produkte würde ich mir CodeMeter (von Wibu, natürlich mein Favorit) und HASP (von Aladdin/Safenet) anschauen. In beiden Fällen kannst Du zwischen Dongle und Softwarelizenz wählen, bzw. beides kombinieren.
Die Performance ist natürlich etwas, was Du testen musst. Die Entschlüsslung passiert zur Laufzeit und kostet damit natürlich Zeit. Da gibt es aber viele Stelleschrauben (Caching, Ausnahmen, ...), um dies zu optimieren.