Думая об этом, есть несколько различных типов запутывания. Давайте начнем с запутывания исходного кода, что является пустой тратой времени; это достаточно сложно понять без этого! Итак, давайте вместо этого сосредоточимся на запутывании пакета доставки, на том, как код доставляется пользователю.
Незначительная запутанность
Незначительное запутывание существует, чтобы не дать обычному пользователю легко ткнуть пальцами и сломать вещи. Это не удерживает решительного хакера, но оно имеет ценность, помогая гарантировать, что вещи, которые вас просят поддержать, - это то, что вы на самом деле доставили. Уровень защиты, необходимый для такого рода вещей, действительно довольно низок; пакет поставки просто не должен выглядеть читабельным и редактируемым (без специальных инструментов), и это достаточно хорошо.
Минимизация Javascript является примером этого, хотя он не продается как таковой. Никто в здравом уме не захочет читать и редактировать минимизированный JS-файл, даже если это технически возможно сделать, если вы настроены / достаточно настойчивы.
Аналогично с доставкой приложений Java. Простая упаковка кода в исполняемый JAR-файл остановит большую часть глупости, даже несмотря на то, что в городском парке он имеет всю силу вежливого знака «Пожалуйста, держите подальше от травы».
Даже при доставке кода на C ++ извлечение ненужных символов из исполняемого файла будет достаточным для того, чтобы считаться незначительной путаницей. Ключевым моментом является то, что неудобно читать результат как пользователь, но не проблема выполнить его как компьютер.
Сильное запутывание
Основное запутывание - это сохранение решительного и знающего пользователя. Это также полная проигрышная игра; если компьютер может выполнить это, человек может отделить его и понять, что он делает. Самое близкое, что вы могли бы получить, - это заставить программу постоянно расшифровывать себя, превращая то, что она делает в одно время, в совершенно другое, чем в другое время. Создать такую штуку было бы довольно сложно и все равно не помешало бы действительно хорошему хакеру (хотя к концу этого процесса они действительно сильно разошлись бы с вами из-за количества усилий, необходимых для расшифровки всего этого самоизменяющегося кода).
Намного лучше думать с точки зрения других решений. Например, вы можете хранить «драгоценности короны» кода на серверах, которые вы контролируете, и разрешать только сервисные вызовы к нему, делая клиента по существу бесплатной раздачей, которая является входной частью для ценных битов. Или вы можете пойти по более контрактному / легальному пути и передавать только исполняемые файлы организациям, которые формально соглашаются не копаться в вашем коде или не выплачивать вам компенсацию, если они это делают (так что это будет своего рода NDA). Цель состоит в том, чтобы создать сильный стимул для хакера, чтобы не взломать, и чтобы пользователи держали код подальше от любых хакеров, не связанных соглашением.
Но вы не должны предполагать, что ваш код никогда не будет взломан. С помощью виртуализации любое состояние программы выполнения может быть проверено и отслежено, и все, что пытается от него избавиться (например, отслеживание часов до внешнего источника времени), с гораздо большей вероятностью вызовет проблемы у законных пользователей, чем у хакеров. (См. Историю DRM о том, как даже очень целеустремленные издатели информации не могут обеспечить безопасность своих систем, когда код находится в руках их противников.) Гораздо лучше сосредоточиться на том, чтобы на самом деле сделать счастливых законных пользователей. Потери от случайного взлома будут ничем по сравнению с дополнительными деньгами, приносимыми для удовлетворения клиентов должным образом.