Это принципиально невозможно, на очень фундаментальном уровне.
Вы хотите дать кому-нибудь некоторую информацию (ваш код).Вы хотите, чтобы они могли выполнять код один раз, в одном конкретном состоянии (которое вы не очень хорошо определяете).Но вы не хотите, чтобы они могли проверять этот код или выполнять его при других обстоятельствах.Невозможно.
Программа на компьютере этого человека (которая будет выполнять код) должна иметь возможность проверять код, чтобы иметь возможность его выполнить.Поэтому другие программы на этом компьютере также смогут проверять код.
Вы можете зашифровать свой код, чтобы произвольные программы не могли его проверить, и вы восстановили контроль.Но программа, предназначенная для выполнения кода, все еще нуждается в его проверке, поэтому вам нужно каким-то образом получить информацию, необходимую для расшифровки кода.
Но теперь вы вернулись к исходному состоянию.Проблема: У вас есть некоторая информация (ключ дешифрования), которую вы хотите предоставить пользователю для одного конкретного использования (дешифрование и запуск кода только при указанных вами обстоятельствах), а не для каких-либо других.
Что еще интереснее, вы могли бы вместо этого зашифровать свой код с помощью хеш-значения, полученного из частей среды, которую вы хотите проверить (как именно вы получаете ключ, невозможно сказать, не зная, что вы хотите проверить).Затем, если пользователь (или программа, выполняющая ваш код от его имени) хочет проверить код, он должен будет выполнить тот же процесс получения значения хеша из среды , а имеют правильную среду.Но пользователь может организовать сбор значения хеша из этой среды и сохранить его, позволяя ему проверять ваш код в любое время.
Кроме того, я понятия не имею, что вы могли бы проверить, что на самом деле гарантирует правильную среду.Если программа должна проверить, что она работает правильно (без изменений, чтобы шпионить за вашим кодом), прежде чем расшифровывать секретную часть себя и запускать ее, то шпион может легко извлечь зашифрованные данные, полученные из (незашифрованный) проверка кода, какие вычисления выполняются для проверки среды, а затем выполнять свои собственные вычисления на основе «правильной» среды, а не той, которая действительно существует.
В конце концов, все, что вы можете сделать, этосделать процесс восстановления вашего сверхсекретного кода более раздражающим, чтобы он не мешал.Большинство людей никогда не будут смотреть на ваш код;им просто все равно.Большинство из оставшихся сдаются при малейшем сопротивлении (хотя это может оттолкнуть их с помощью вашего программного обеспечения).Те, кто все еще пытаются после этого ... всегда есть шанс (если ваш секретный код действительно настолько ценен / интересен), что найдутся достаточно мотивированные люди, которые обойдут все, что вы делаете (если вы просто никогда никому не дадите свой кодна первом месте).Так что я склонен просто приложить небольшие легкие усилия, чтобы скрыть ваш секретный код и не беспокоиться о достижении идеальной безопасности, потому что это невозможно.