Как я могу предотвратить кражу моего кода? - PullRequest
27 голосов
/ 26 февраля 2010

Что именно происходит, когда я запускаю .NET exe? Я знаю, что C # скомпилирован в код IL, и я думаю, что сгенерированный exe-файл - всего лишь средство запуска, которое запускает среду выполнения и передает ему код IL. Но как? И насколько это сложный процесс?

IL-код встроен в исполняемый файл. Я думаю, что это может быть выполнено из памяти, не записывая это на диск, в то время как обычные exe не (хорошо, да, но это очень сложно).

Моя последняя цель - извлечь IL-код и написать свой собственный зашифрованный модуль запуска, чтобы не дать скриптам открывать мой код в Reflector и просто красть все мои классы легко. Ну, я не могу полностью предотвратить реверс-инжиниринг. Если они могут проверить память и поймать момент, когда я передаю чистый IL во время выполнения, тогда не имеет значения, является ли он .net exe или нет, не так ли? Я знаю, что есть несколько инструментов для запутывания, но я не хочу портить сам код IL.

РЕДАКТИРОВАТЬ: так что, кажется, не стоит пытаться делать то, что я хотел. Они все равно взломают ... Так что я буду искать средство для запутывания. И да, мои друзья тоже говорили, что достаточно переименовать все символы в бессмысленные имена. И обратный инжиниринг не будет так просто в конце концов.

Ответы [ 7 ]

36 голосов
/ 26 февраля 2010

Если вы абсолютно настаиваете на шифровании вашей сборки, возможно, лучший способ сделать это - поместить код вашей программы в сборки библиотеки классов и зашифровать их. Затем вы должны написать небольшой исполняемый файл-заглушку, который расшифровывает сборки в памяти и выполняет их.

Это очень плохая идея по двум причинам:

  1. Вы должны будете включить ключ шифрования в свою заглушку. Если хакер 1337 может осмысленно использовать ваши отраженные сборки, он может так же легко украсть ваш ключ шифрования и дешифровать их сам. (Это в основном Аналоговое отверстие )
  2. Никому нет дела до вашего кода 1337. Извините, но это жесткая любовь. Никто больше не думает, что чей-то код настолько интересен, как автор.
26 голосов
/ 26 февраля 2010

«Секрет», которым вы делитесь с тысячами людей, не является секретом. Помните, что ваши злоумышленники должны только один раз взломать вашу тривиальную схему «шифрования», потому что ключ-это-там-правильно »

Если ваш код настолько ценен, что его нужно хранить в секрете, тогда держите его в секрете . Оставьте код только на своих серверах; напишите свое программное обеспечение как веб-сервис. Затем защитите сервер.

20 голосов
/ 26 февраля 2010

сгенерированный exe-файл - просто средство запуска, которое запускает среду выполнения и передает ему код IL.

Не совсем. Существуют разные способы настройки программы, но обычно IL-код компилируется в собственный машинный код, который выполняется в процессе выполнения.

Что касается детишек & mdash; вы обманываете себя, если думаете, что можете продать им или кому-либо, кто использует то, что они распространяют. Если они не смогут разблокировать ваше приложение, они будут двигаться дальше и найдут то, без которого они могут или не смогут. Они представляют ровно 0 долларов в потенциальных продажах; бессмысленно тратить слишком много усилий, пытаясь помешать им, потому что ваши инвестиции не окупятся. Базовый обфускатор может быть в порядке, но не намного.

Реально, большинство разработчиков сталкиваются с гораздо большей проблемой из-за неясности, чем из-за пиратства. Все, что вы делаете, что мешает вам рассказать о вашем продукте, причиняет вам боль больше, чем пираты. Это включает в себя заставить людей платить деньги, чтобы получить их. В большинстве случаев лучшим подходом будет иметь бесплатную версию вашего приложения, которую детям даже не нужно разблокировать; что-то, что уже работает для них достаточно хорошо, так что взлом вашего приложения будет пустой тратой их времени, а не просто временем или испытанием с ограниченным набором функций. Пусть они и многие другие распространят его повсюду.

Теперь я знаю, что в конце концов вам нужны платящие клиенты. Ключ в том, чтобы теперь использовать все внимание, которое вы получаете от бесплатного продукта, для перепродажи или продвижения чего-то более выгодного. Один из вариантов здесь - иметь премиум-версию с дополнительными функциями, ориентированными в основном на бизнес-аудиторию; такие вещи, как упрощение развертывания во всей сети и управления этим способом. Предприятия имеют более глубокие карманы и с большей вероятностью будут платить лицензионные сборы. Ваша бесплатная версия служит для продвижения вашего продукта и обеспечения его легитимности для ваших бизнес-клиентов.

Конечно, есть и другие модели, но независимо от того, что вы делаете, стоит помнить, что неясность является более сложной задачей и что пиратские копии вашего программного обеспечения никогда не приведут к продажам. В конечном счете (и, конечно, это зависит от вашего исполнения) вы сможете заработать больше денег с помощью бизнес-модели, использующей эти преимущества, чем пытаясь с ними бороться.

6 голосов
/ 20 апреля 2010

«Они скопировали все, что могли, но не смогли скопировать мои мысли, поэтому я оставил их потеть и красть за полтора года». - Р. Киплинг

6 голосов
/ 26 февраля 2010

"... запретить скриптам открывать мой код в Reflector и просто украсть все мои занятия легко. "

К сожалению, независимо от того, как вы запутываете запуск, требуется от полдюжины команд в отладчике, чтобы выгрузить текущую сборку в файл по выбору пользователя. Таким образом, даже если вы можете запустить свое приложение, как предложил Брайан, нетрудно вставить компоненты этого приложения в Reflector после его запуска (я могу опубликовать пример из WinDbg, если кому-то будет интересно).

Инструменты запутывания создаются на основе огромного технического опыта и часто предназначены для того, чтобы затруднить отладчикам надежное подключение к процессу или извлечение информации из него. Как сказал Брайан: «Я не уверен, почему вы полны решимости сохранить IL, и, если вам нужна какая-либо значимая защита от сценаристов, вам, возможно, придется передумать».

3 голосов
/ 26 февраля 2010

Лично я думаю, что запутывание - путь.Это просто и может быть эффективно, особенно если весь ваш код находится внутри exe-файла (я не уверен, что проблема в том, чтобы "испортить IL").

Однако, если вы чувствуете, что выигралэто не работает для вас, возможно, вы можете зашифровать свой exe-файл и встроить его в качестве ресурса в панель запуска.Самый простой способ справиться с этим - расшифровать ресурс exe, записать его в файл и выполнить.Как только исполняемый файл завершится, удалите файл.Вы также можете запустить его через функции Emit.Я понятия не имею, как это будет работать, но вот статья для начала - Использование Reflection Emit для кэширования сборок .NET .

Конечно, ваш ключ дешифрования, вероятно, должен бытьвстроенный в exe, так что кто-то действительно решительный сможет дешифровать вашу сборку в любом случае.Вот почему запутывание, вероятно, лучший подход.

2 голосов
/ 26 февраля 2010

Копирование моего ответа из этого вопроса (который не совсем повторяется, но на него можно ответить тем же ответом, следовательно, CW):

Windows EXE содержит несколько «частей». Упрощенно , .net-код (= MSIL) является только частью EXE, а внутри EXE-файла также есть «настоящая» нативная часть Windows, которая служит своего рода средством запуска для .net Framework. который затем выполняет MSIL.

Mono просто возьмет MSIL и выполнит его, игнорируя встроенные средства запуска Windows.

Опять же, это упрощенный обзор.

Редактировать: Я боюсь, что мое понимание деталей глубокой депы не достаточно хорошее для очень подробной детализации (я примерно знаю, что такое PE Header, но не совсем детали), но я нашел эти ссылки полезно:

Чистая сборочная конструкция - часть II

.NET Foundations - структура сборки .NET

Приложение: Если вы действительно хотите углубиться, подберите копию на Advanced .net Debugging . В самой первой главе объясняется, как именно .net Assembly загружается до и после Windows XP (начиная с XP загрузчик Windows знает .net, что радикально меняет способ запуска приложений .net)

...