Die wichtigsten Schwachstellen sind folgende:
1. Decompilen.
Benutze einen Packer, der möglichst schwer zu entpacken ist (z.B. Themida). Standard UPX ist keine Hürde.
Zusätzlich zum Packer noch nen Obfuscator nutzen, um das decompilete Script möglichst unbrauchbar zu machen, falls jemand es schafft, das Prog zu entpacken.
2. Auslesen des PWs.
Wenn du einfach ne Liste online stellst, in der die Lizenzen/PWs/HWIDs roh stehen, oder wenn irgendwo das richtige PW im Script steht, könnten die relativ leicht ausgelesen werden.
Sinnvoller wäre, die md5 Hashwerte o.ä. der gültigen PWs online zu speichern und abzufragen, ob der Hash des eingegebenen PWs enthalten ist. Selbst wenn jemand den gültigen Hash herausfindet, kann er daraus nicht einfach ein gültiges PW herleiten.
3. if Abfragen.
Abfragen wie 'if $pw = "abc" then' können leicht reversed werden. In OllyDbg ist das oft nur ein conditional jump, der durch ein NOP oder jmp ersetzt wird. Da würde auch ein Hashwert nicht helfen. Oder das PW wird direkt per HexEditor/Olly ausgelesen. In diesem Fall würde ein Hashwert es dem Hacker allerdings deutlich schwieriger machen.
Besser wäre, entscheidende Scriptbestandteile mit dem richtigen PW zu ver- und mit dem eingegebenen zu entschlüsseln. In nem Trainer wären das z.B. Offsets, Prozessnamen etc.
So steht das richtige PW nicht im Script, kann also nicht ausgelesen werden und es gibt keine einfache Fehlermeldung, die man umgehen kann bei falschem PW, sondern das Prog läuft, aber ist vollkommen unbrauchbar.
Wenn du diese 3 Punkte umsetzt, ist es zwar nicht unmöglich zu knacken, aber zumindest die ganzen Möchtegern Hacker, die hier rumlaufen, werden sich die Zähne dran ausbeißen.
Edit:
4. Einen Timestamp zu benutzen, wie von Alisami vorgeschlagen, würde die Sicherheit auch definitiv erhöhen.