Как я могу предотвратить кражу моего кода?
Что именно происходит, когда я запускаю.NET exe? Я знаю, что C# скомпилирован в код IL, и я думаю, что сгенерированный exe-файл - всего лишь средство запуска, которое запускает среду выполнения и передает ему код IL. Но как? И насколько это сложный процесс?
IL код встроен в exe. Я думаю, что это может быть выполнено из памяти, не записывая это на диск, в то время как обычные исполняемые файлы - нет (хорошо, да, но это очень сложно).
Моя конечная цель - извлечь IL-код и написать собственный зашифрованный модуль запуска, чтобы скрипт-скрипты не открывали мой код в Reflector и просто легко крали все мои классы. Ну, я не могу полностью предотвратить реверс-инжиниринг. Если они могут проверить память и поймать момент, когда я передаю чистый IL во время выполнения, тогда не имеет значения, является ли он.net exe или нет, не так ли? Я знаю, что есть несколько инструментов для запутывания, но я не хочу портить сам код IL.
РЕДАКТИРОВАТЬ: так что, кажется, не стоит пытаться то, что я хотел. Они все равно взломают... Так что я буду искать средство для запутывания. И да, мои друзья тоже говорили, что достаточно переименовать все символы в бессмысленные имена. И обратный инжиниринг не будет так просто в конце концов.
7 ответов
Если вы абсолютно настаиваете на шифровании своей сборки, возможно, лучший способ сделать это - поместить программный код в сборки библиотеки классов и зашифровать их. Затем вы должны написать небольшой исполняемый файл-заглушку, который расшифровывает сборки в память и выполняет их.
Это очень плохая идея по двум причинам:
- Вы должны будете включить ключ шифрования в свою заглушку. Если хакер 1337 может осмысленно использовать ваши отраженные сборки, он может так же легко украсть ваш ключ шифрования и дешифровать их сам. (Это в основном аналоговое отверстие)
- Никто не заботится о вашем коде 1337. Извините, но это жесткая любовь. Никто другой никогда не думает, что чей-либо код настолько интересен, как автор.
"Секрет", которым вы делитесь с тысячами людей, не является секретом. Помните, что ваши злоумышленники должны только один раз взломать вашу тривиальную схему "шифрования", потому что ключ-это-там-правильно ".
Если ваш код настолько ценен, что его нужно хранить в секрете, храните его в секрете. Оставьте код только на своих серверах; напишите свое программное обеспечение как веб-сервис. Затем защитите сервер.
сгенерированный exe-файл просто средство запуска, которое запускает среду выполнения и передает ей код IL.
Не совсем. Существуют различные способы настройки вашей программы, но обычно код IL компилируется в собственный машинный код, который выполняется во время выполнения.
Что касается детишек - вы обманываете себя, если думаете, что можете продать им или кому-либо, кто использует то, что они распространяют. Если они не смогут разблокировать ваше приложение, они будут двигаться дальше и найдут то, без которого они могут или не смогут. Они представляют ровно 0 долларов в потенциальных продажах; бессмысленно тратить слишком много усилий, пытаясь помешать им, потому что ваши инвестиции не окупятся. Базовый обфускатор может быть в порядке, но не намного.
Реально, большинство разработчиков сталкиваются с гораздо большей проблемой из-за неясности, чем из-за пиратства. Все, что вы делаете, что мешает вам рассказать о вашем продукте, причиняет вам боль больше, чем пираты. Это включает в себя заставить людей платить деньги, чтобы получить их. В большинстве случаев лучшим подходом будет иметь бесплатную версию вашего приложения, которую детям даже не нужно разблокировать; что-то, что уже работает для них достаточно хорошо, так что взлом вашего приложения будет пустой тратой их времени, а не просто временем или испытанием с ограниченным набором функций. Пусть они и как можно больше других распространят его повсюду.
Теперь я знаю, что в конечном итоге вам нужны платящие клиенты. Ключ в том, чтобы теперь использовать все внимание, которое вы получаете от бесплатного продукта, для перепродажи или продвижения чего-то более выгодного. Один из вариантов здесь - иметь премиум-версию с дополнительными функциями, ориентированными в основном на бизнес-аудиторию; такие вещи, как упрощение развертывания во всей сети и управления этим способом. Предприятия имеют более глубокие карманы и с большей вероятностью будут платить ваши лицензионные сборы. Ваша бесплатная версия служит для продвижения вашего продукта и обеспечения его легитимности для ваших бизнес-клиентов.
Конечно, есть и другие модели, но независимо от того, что вы делаете, стоит помнить, что неясность является более сложной задачей, и что пиратские копии вашего программного обеспечения никогда не приведут к продажам. В конечном итоге (и, конечно, это зависит от вашего исполнения), вы сможете заработать больше денег с помощью бизнес-модели, которая использует эти преимущества, чем пытаясь бороться с ними.
"... не позволяйте скриптам открывать мой код в Reflector и просто красть все мои классы легко".
К сожалению, независимо от того, как вы запутываете запуск, полдюжины команд в отладчике позволяют вывести текущую сборку в файл по выбору пользователя. Таким образом, даже если вы можете запустить свое приложение, как предложил Брайан, нетрудно вставить компоненты этого приложения в Reflector после его запуска (я могу опубликовать пример из WinDbg, если кому-то будет интересно).
Инструменты запутывания создаются на основе огромного технического опыта и часто предназначены для того, чтобы затруднить отладчикам надежное присоединение к процессу или извлечение информации из него. Как сказал Брайан: "Я не уверен, почему вы полны решимости сохранить IL, и, если вам нужна какая-либо значимая защита от сценаристов, вам, возможно, придется передумать.
"Они копировали все, что могли, но не могли копировать мои мысли, поэтому я оставил их потеть и красть за полтора года". - Р. Киплинг
Лично я думаю, что запутывание - путь. Это просто и может быть эффективно, особенно если весь ваш код находится внутри exe-файла (я не уверен, что проблема в том, чтобы "испортить IL").
Однако, если вы чувствуете, что это не сработает, возможно, вы сможете зашифровать свой exe-файл и встроить его в качестве ресурса в панель запуска. Простейший способ справиться с этим - расшифровать ресурс exe, записать его в файл и выполнить. Как только исполняемый файл завершится, удалите файл. Вы также можете запустить его через функции Emit. Я понятия не имею, как это будет работать, но вот статья для начала - Использование Reflection Emit для кэширования сборок.NET.
Конечно, ваш ключ дешифрования, вероятно, также должен быть встроен в исполняемый файл, так что кто-то действительно определенно сможет дешифровать вашу сборку в любом случае. Вот почему запутывание, вероятно, лучший подход.
Копирование моего ответа на этот вопрос (который не является точно дублированным, но на него можно ответить тем же ответом, следовательно, CW):
Windows EXE содержит несколько "частей". Упрощенно,.net-код (=MSIL) - это только часть EXE-файла, а внутри EXE-файла также есть "настоящая" нативная часть Windows, которая служит своего рода средством запуска для.net Framework, который затем выполняет MSIL.
Mono просто возьмет MSIL и выполнит его, не обращая внимания на нативный материал Windows Launcher.
Опять же, это упрощенный обзор.
Редактировать: я боюсь, что мое понимание глубоких деталей depp недостаточно для очень подробной детализации (я примерно знаю, что такое PE Header, но не совсем детали), но я нашел эти ссылки полезными:
Чистая сборочная структура - часть II
Основы.NET - структура сборки.NET
Приложение: Если вы действительно хотите углубиться, подберите копию в Advanced.net Debugging. В самой первой главе объясняется, как именно.net Assembly загружается до и после Windows XP (начиная с XP загрузчик Windows знает.net, что радикально меняет способ запуска приложений.net).