Защищать .NET-код от обратного инжиниринга? - PullRequest
475 голосов
/ 03 февраля 2009

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

Также возможно преобразовать приложение C # в собственный код, и Xenocode слишком дорогой.

C # предоставляет множество функций и является идеальным языком для моего кода, поэтому о повторной записи всей базы кода в C ++ не может быть и речи.

Безопасные сертификаты можно легко удалить из подписанных сборок в .NET.

Ответы [ 34 ]

649 голосов
/ 03 февраля 2009

Вы не можете.

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

То, что вы хотите сделать, это просто сделать его достаточно трудным для взлома, чтобы оно не стоило проблем людям.

Некоторые предложения, которые я могу предложить для защиты вашего приложения:

  • Запутать ваш код. Dotfuscator имеет бесплатную версию и поставляется с Visual Studio.
  • Используйте открытый / закрытый ключ или асимметричное шифрование для генерации лицензий на ваш продукт. Это гарантирует, что только вы могут генерировать ваши лицензионные коды. Даже если ваше приложение взломано , вы можете быть уверены, что оно не выпустит генератор ключей для вашего приложения, поскольку невозможно изменить алгоритм генерации ключа.
  • Используйте сторонний упаковщик , чтобы упаковать ваш исполняемый файл .NET в зашифрованное приложение-оболочку Win32. Themida - одна из лучших. Это мешает людям отображать ваше приложение в .NET Reflector и затрудняет распаковку для реверса.
  • Напишите свой собственный пользовательский упаковщик . Если сторонние упаковщики слишком дороги, подумайте над написанием своего. Иногда пользовательские упаковщики могут быть очень эффективными, потому что нет хорошо опубликованных методов, как их распаковать. Учебное пособие Как написать собственный упаковщик дает массу полезной информации о написании собственного упаковщика Win32.

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

Опытный реверс-инженер может запустить IDA-Pro и нарезать ваше приложение, как масло, независимо от того, что вы делаете. Упакованное приложение можно распаковать, а запутывание мешает ему прогуляться по парку. Вся ваша тяжелая работа с вашим сложным лицензионным кодом может быть отменена с помощью одного байта патча.

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

Однако есть много компаний, которые никогда не рискнули бы судебным иском и не с удовольствием купили бы лицензии на программное обеспечение, и многие пользователи компьютеров, которые либо не хотят рисковать, либо ошибаются, либо недостаточно разбираются в технологиях для пиратства. Это ваши настоящие клиенты, и вы должны сосредоточить свои усилия на предоставлении им хорошего пользовательского опыта и не обращать внимания на тех, кто взламывает ваше программное обеспечение.

У меня раньше было пиратское заявление, и я воспринял это как личное оскорбление. Здесь я был маленьким разработчиком, вкладывающим мое сердце и душу в приложение, и эти люди имели право на пиратство от меня ?! Они брали деньги прямо из моего кармана!

Я немедленно добавил кучу драконовского кода DRM и попытался саботировать любого человека, используя незаконную или взломанную копию. Конечно, я должен был работать над улучшением своего приложения, а не пытаться остановить неизбежное. Не только это, но я причинял боль своим истинным клиентам, которые будут пользоваться всеми этими дополнительными средствами защиты, которые я использовал.

После долгой битвы я понял, что борюсь с потоками, и все это время было потрачено впустую. Я вытащил весь код телефона-дома, за исключением функций лицензии barebones, и никогда не оглядывался назад.

260 голосов
/ 16 марта 2009

Вы не можете полностью защитить любое приложение (управляемое или нет). Если такие системы, как Playstation и iPad, могут быть взломаны & mdash; где поставщик даже контролирует оборудование & ndash; какая надежда у вашего приложения? К счастью, вы действительно не хотите. На мой взгляд, вам нужно защитить приложение настолько, чтобы кто-то не смог случайно пиратствовать ваш продукт, и не более.

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

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

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

Итак, это объясняет, что это значит, делать так много. Но почему бы не пойти дальше? Почему бы не закрыть каждую маленькую дырочку, которую вы можете найти? Ответ состоит из двух частей. Во-первых, если кто-то переступит этический порог в сознательно , нарушив условия вашей лицензии & mdash; даже простым способом & mdash; они также захотят сделать что-то более сложное или опасное, например вытащить ваше приложение с сайта torrent & mdash; и есть определенная опасность, связанная с запуском приложений, загружаемых из ненадежных источников. Сложность усложняет работу этих пользователей и создает проблемы с вашими платящими клиентами. Проще говоря, это может помешать кому-то копаться в вашем приложении и выпустить более полный взлом. Во-вторых, у вас мало глаз, чтобы искать недостатки; у хакеров их много, и у них больше практики их поиска. Вам нужно пропустить только один маленький недостаток, и ваше приложение будет иметь такой же дистрибутив на пиратских сайтах, как если бы вы ничего не делали. Вы должны быть правы каждый раз; им только повезет один раз. Таким образом, требуемые усилия очень высоки, а вероятность любого показателя успеха очень мала.

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

Поскольку вы не можете остановить пользователей от пиратства вашего продукта, лучше всего привлекать этот класс пользователей таким образом, чтобы он использовал их в ваших интересах. Часто можно заставить их работать на вас, а не против вас. Имея это в виду, независимо от того, какое у вас приложение, вероятно, стоит сохранить бесплатную версию, которая почти полностью функциональна и не имеет срока действия. Разница между ценой даже в 1 доллар США и бесплатной огромна, если только по той причине, что клиент не должен доверять вам свою кредитную карту. Бесплатная версия вашего продукта не только эффективно убьет пиратскую дистрибуцию (зачем рисковать пиратской версией, если вы можете быть легитимной по той же цене?), Но и может значительно расширить вашу аудиторию.

В результате вам может потребоваться увеличить цену за платную версию, чтобы в итоге вместо 2000 пользователей по 20 долларов у вас было 100 000 бесплатных пользователей, из которых 500 готовы заплатить 99 долларов за " профессиональное "издание. Это зарабатывает вам больше денег, чем если бы вы потратили кучу времени, запирая свой продукт. Более того, вы можете привлечь этих бесплатных пользователей и использовать отношения несколькими важными способами.

Одним из них является поддержка. Пессимист воспользовался бы этой возможностью, чтобы пожаловаться на возросшую стоимость поддержки 100 000 бесплатных пользователей, но вместо этого происходит нечто удивительное: ваш продукт становится в значительной степени самостоятельным. Вы видите это все время с большими проектами с открытым исходным кодом, у которых нет денег на расходы на поддержку. Пользователи подойдут и сделают это.

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

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

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

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

Хотя психологически может быть трудно отдать свой продукт так много, надеюсь, вы поймете, как это действительно лучший путь. Мало того, это единственный путь в долгосрочной перспективе. Я знаю, что кто-то там думает, что он не хочет делать это таким образом. В конце концов, они просто отлично продавали свой заблокированный продукт за 20 долларов в течение многих лет. Но это очень плохо, потому что если вы не сделаете это таким образом, в конце концов, кто-то другой будет . И их продукт будет таким же хорошим, как ваш, или достаточно близким, чтобы они могли с этим смириться. Внезапно ваши цены выглядят возмутительно, продажи резко падают, и вы ничего не можете сделать. Вы можете выбрать дополнительный средний уровень, если это необходимо, но вряд ли он вам поможет.

45 голосов
/ 16 марта 2009

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

38 голосов
/ 21 февраля 2010

Секрет, которым вы делитесь со многими людьми, не является секретом. Если у вас есть секретный материал в вашем коде, запутывание его не является защитой; необходимо только деобфусцировать один раз . Если у вас есть секрет, которым вы не хотите делиться с вашими клиентами, то не делитесь им с вашими клиентами . Напишите свой код в виде веб-службы и храните свой суперсекретный код на своем собственном сервере, где только вы можете его увидеть.

23 голосов
/ 03 февраля 2009

Вообще говоря, есть три группы людей.

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

  • Группа законных пользователей, которые будут покупать (оплачивать) ваше программное обеспечение независимо от того, какой механизм защиты вы используете. Не усложняйте жизнь своим законным пользователям, используя сложный механизм защиты, поскольку они в любом случае будут платить за него. Сложный механизм защиты может легко испортить пользовательский опыт, и вы не хотите, чтобы это случилось с этой группой. Лично я бы проголосовал против любого аппаратного решения, которое увеличивает стоимость вашего программного обеспечения.

  • Меньшинство, которое не будет прибегать к «неэтичному» взлому и будет платить за ваше программное обеспечение , поскольку его функции защищены механизмом лицензирования. Вы, вероятно, не хотите, чтобы эта группа очень легко обходила вашу защиту. Однако все ваши усилия по защите программного обеспечения окупятся в зависимости от того, насколько велика эта группа людей. Это полностью зависит от типа программного обеспечения, которое вы создаете.

Учитывая то, что вы сказали, если вы думаете, что существует достаточно большое меньшинство, которое может быть подтолкнуто к покупке вашего программного обеспечения, продолжайте внедрять некоторую форму защиты. Подумайте о том, сколько денег вы можете заработать на этом меньшинстве по сравнению с тем временем, которое вы тратите на работу по защите, или суммой, которую вы тратите на сторонний API / инструмент защиты.

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

19 голосов
/ 03 февраля 2009

Вы не можете помешать людям взломать ваше программное обеспечение.

Однако вы можете заставить их создавать трещины, которые меньше повредят вашим продажам. Генераторы ключей, которые могут выдать действительный регистрационный код для вашего программного обеспечения, намного хуже, чем простые исправления, которые удаляют стимулы регистрации из вашего программного обеспечения. Это потому, что кряк будет работать только для одной версии программного обеспечения и перестанет работать со следующим выпущенным вами обновлением программного обеспечения. Генератор ключей будет продолжать работать до тех пор, пока вы не измените алгоритм регистрации ключа, и вам не стоит часто этим заниматься, потому что это отпугнет ваших честных клиентов.

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

Частичная проверка ключа гарантирует, что каждый нелегальный генератор ключей работает только для одного конкретного выпуска вашего программного обеспечения. По сути, вы должны убедиться, что каждый выпуск вашего программного обеспечения связан только с кодом для проверки НЕКОТОРЫХ цифр регистрационного кода. Точные цифры случайны, поэтому взломщикам придется перепроектировать много разных версий вашего программного обеспечения и объединить все это в один генератор ключей, чтобы выпустить генератор ключей, который работает для всех версий вашего программного обеспечения.

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

Я использовал Partial Key Verification в моих новых (C ++) новых условно-бесплатных играх, и это было очень эффективно. Раньше у нас было много проблем с генераторами ключей, с которыми мы не могли бороться. После этого было много кряков и несколько генераторов ключей, которые работали только для этой конкретной версии игры, но не было генератора ключей, который работал бы со всеми версиями. Мы регулярно выпускаем очень незначительные обновления игры и делаем все ранее существующие кряки бесполезными.

Кажется, есть открытый исходный код .NET Framework для частичной верификации ключей , хотя я не пробовал его.

16 голосов
/ 03 февраля 2009
  • Используйте онлайн-обновление, чтобы заблокировать эти нелицензионные копии.

  • Проверьте серийный номер из разных модулей вашего приложения и не используйте один вызов функции для выполнения проверки (чтобы взломщики не могли легко обойти проверку).

  • Не только проверить серийный номер на при запуске, сделайте проверку пока сохраняя данные, делайте это каждую пятницу вечером, делайте это, когда пользователь простаивает ...

  • Проверить проверку файла приложения сумма, сохраните вашу контрольную сумму в разные места.

  • Не заходите слишком далеко на такого рода трюки, убедитесь, что ваше приложение никогда не врезаться в работу при проверке регистрационного кода.

  • Создать полезное приложение для пользователей гораздо важнее, чем сделать
    небьющийся бинарный файл для взломщиков.

14 голосов
/ 03 февраля 2009

Вы можете ..

Microsoft SLP Services Потенциал программного обеспечения InishTech позволяет защитить код без ущерба для функциональности ваших приложений.

ОБНОВЛЕНИЕ: (Раскрытие: я работаю в Eazfuscator.NET) Что делает Microsoft SLP Services Потенциал программного обеспечения Отличается возможностью виртуализации кода, Вы определенно можете . Прошло несколько лет с тех пор, как вопрос был задан изначально; сегодня доступно больше продуктов, которые также работают на аналогичной основе, например:

10 голосов
/ 21 февраля 2010

.NET Reflector может открывать только «управляемый код», что в основном означает «код .NET». Таким образом, вы не можете использовать его для дизассемблирования файлов COM DLL, нативного C ++, классического Visual Basic 6.0 кода и т. Д. Структура скомпилированного кода .NET делает его очень удобным, переносимым, обнаруживаемым, проверяемым и т. Д. .NET Reflector использует это преимущество, чтобы позволить вам вглядываться в скомпилированные сборки, но декомпиляторы и дизассемблеры ни в коем случае не являются специфическими для .NET и существуют до тех пор, пока существуют компиляторы.

Вы можете использовать обфускаторы, чтобы сделать код более трудным для чтения, но вы не можете точно предотвратить его декомпиляцию, не сделав его нечитаемым для .NET. Существует несколько продуктов (обычно дорогих), которые утверждают, что "связывают" ваше приложение с управляемым кодом с приложением с собственным кодом, но даже если они действительно работают, определенный человек всегда найдет способ.

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

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

9 голосов
/ 03 февраля 2009

Это действительно того стоит? Каждый защитный механизм может быть сломан с достаточной решимостью. Учитывайте свой рынок, цену товара, количество покупателей и т. Д.

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

Мало других идей (ни одна не идеальна, поскольку нет идеальной).

  • AntiDuplicate
  • Измените язык, используйте приятные трюки, которые использовали авторы Skype
  • Сервер лицензий

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

...