Wenn du es Crackern etwas schwieriger machen willst, pack die Hash-Überprüfung an ungewöhnliche Stellen im Code, und am besten an mehrere Stellen (und zwar möglichst, indem du den Code an diese Stellen kopierst und nicht per Funktionsaufruf - z.B. per Include). Am besten ein paar verschiedene Überprüfungsroutinen verwenden und eventuell ein paar verdächtige Fake-Routinen, die nie aufgerufen werden. Außerdem die Sprungadressen wenn möglich nicht direkt als „Klartext“ in den Code schreiben, sondern irgendwie zur Laufzeit berechnen, sodass man nicht einfach nach ihnen suchen kann und sofort die Überprüfungsroutine findet. Das zusammen sollte hoffentlich aufwändig genug sein, dass der Wald-und-Wiesen-Cracker die Lust verliert.
Und wenn du das dann nach einem halben Jahr geschafft hast, will niemand mehr dein Programm, weil es mittlerweile ein besseres als Freeware gibt.