Как уже сказал
Никита Пустовалов 100% защиты нет, конкретный метод зависит от языка программирования, к примеру на C# можно сделать примерно так, все "важные" данные выносятся в отдельный модуль, в него же выносится функция для вычисления хэша и она в идеале нестандартная или состоит из нескольких стандартных (чтобы усложнить). После загрузки модуля в память из него вычитывается "тело", телом фактически является dll в памяти, от "тела" с помощью метода из модуля вычисляется хэш и сравнивается с эталонным(т.к. операция не очень дорогая можно делать хоть перед каждым вызовом). В таком случае модуль нужно защищать всеми возможными средствами, на остальное можно забить, т.к. все критичное в модуле. И да, если модуль смогут деобфусцировать и перекомпилировать изменив метод расчета хэша и эталон то защиту обошли, поэтому в любом случае придется думать как защитить от декомпиляции модуль. Просто так "занопить" тут уже не получится, а деобфускация с возможностью перекомпилировать модуль даже на .net не всегда простая задача.