Хотя это может быть немного проще с промежуточными языками байт-кода, но дело в том, что вы можете сделать это на любом языке.
Исполняемый код можно легко разобрать и пройти. IDA-Pro может загружать собственные исполняемые файлы, разбирать их и с помощью плагина Hex-Rays может даже предоставлять псевдокод, подобный C, для перехода. Даже без Hex-Rays не очень сложно пройти через ассемблерный код и определить, что происходит. Так создаются кейгены для лицензионных продуктов. Они разобраны, и программисты изучают соответствующий код сборки, отвечающий за генерацию и проверку ключей продукта.
Однако стоимость возврата какой-либо важной функции из приложения довольно высока. Поэтому, если это не какая-то высококонкурентная особенность, включающая секретные алгоритмы, почти всегда проще и экономически выгоднее просто нанять программистов, чтобы написать ее с нуля, чем перепроектировать ее.
Если вы ищете более высокий уровень защиты, вы можете запутать свой код и использовать коммерческий упаковщик, который делает разборку программы более сложной (и предотвращает использование любых отражателей во время упаковки приложения). Тем не менее, их можно обойти и распаковать, и запутанный код на самом деле совсем не тормозит хороший RE. Так что не стоит слишком сильно напрягаться, по моему мнению, .NET так же подходит, как и любой другой язык не байт-кода.