Защитить код .NET от реверс-инжиниринга?

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

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

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

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

3.02.2009 07:53:46
Andreas 4.06.2014 21:42:28
@ Андреас: Это круто! Я собираюсь попробовать. Кто-нибудь использует это?
Jack 5.04.2015 17:32:22
@ Джек, это только для приложений магазина окон. У настольных приложений нет графика времени (насколько я могу судить).
Tyler Long 27.12.2015 05:26:48
Если вы хотите нативный без архаичного C ++, используйте Delphi. В любом случае, простота .Net пришла от Delphi.
William Egge 4.01.2017 16:09:32
Nick Kovalsky 24.06.2019 20:41:08
30 ОТВЕТОВ

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

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

Еще несколько идей (ни одна не идеальна, поскольку нет идеальной).

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

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

9
24.02.2013 08:49:15
Не забывайте, что вполне возможно атаковать программную часть аппаратной блокировки.
Magnus Hoff 3.02.2009 08:07:52
Да, это правда, единственным реальным вариантом было бы частично реализовать аппаратное приложение (например, какое-то странное сочетание приложения VHDL с программным обеспечением). Это также может быть взломано, хотя ...
Anonymous 3.02.2009 08:14:53
Как насчет ключей, которые реализуют стратегию открытых / закрытых ключей. Только закрытый ключ ключа может расшифровать приложение и запустить его.
mmcdole 3.02.2009 08:28:06
Вот что обычно делает аппаратный ключ. Но вы можете либо атаковать ключ - клонировать его, либо программное обеспечение, отвечающее за общение с ключом (обход, отключение и т. Д.).
Anonymous 3.02.2009 08:32:03
В моем случае это действительно того стоило. После того, как я внедрил частичную проверку ключей и изменил схему регистрации ключей для существующего продукта, продажи значительно выросли. Все программное обеспечение может быть взломано, вопрос только в том, насколько высоко вы поднимаете планку для случайного программного пирата.
Adrian Grigore 3.02.2009 09:15:23

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

2
24.02.2013 08:51:06

Ты не можешь

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

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

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

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

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

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

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

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

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

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

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

670
24.02.2013 09:07:04
+1, что почти +2. Я бы хотел, чтобы больше людей наконец-то поняли, что вы просто не можете защитить свое программное обеспечение от решительного злоумышленника.
Bombe 3.02.2009 08:16:46
Вы достигли нирваны защиты программного обеспечения: речь идет не о том, чтобы добавить больше защиты, а о том, чтобы сосредоточиться на продукте и сделать его настолько хорошим, что люди ХОТЯТ платить за него. А тем, кто его пиратствует, они никогда бы не заплатили, так что как будто их никогда не существовало.
Arthur Chaparyan 3.02.2009 08:59:18
@ Артур Чапарян, согласен. Это заняло много времени, но я наконец увидел свет. Я пошел по пути более ограничительных мер защиты и борьбы с крекерами. Я узнал все, что мог о реверс-инжиниринге, пытаясь предотвратить свое собственное. Я наконец выяснил правильную идеологию
mmcdole 3.02.2009 09:03:56
Черт, для меня было честью узнать, что кто-то думает, что мое программное обеспечение стоит пиратства ...
Erik Forbes 4.02.2009 20:04:19
Когда вы начинаете полагаться на продажи своего программного обеспечения в большей части своего дохода, это меняет дело. Такое чувство, что кто-то крадет у тебя. Я понимаю, что вы говорите, хотя. Я был шокирован, когда впервые обнаружил кряки для моего программного обеспечения на торрент-сайтах.
mmcdole 4.02.2009 20:20:31

К сожалению, от этого не убежишь. Лучше всего написать код на C и P / вызвать его.

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

В конце концов, он работает так же, как ваш дом, достаточно хорошо защищает его, чтобы на него не затрачивалось слишком много усилий (здесь помог бы спагетти-код), и чтобы нападавший просто перешел к ближайшему соседу (соревнование :)). Посмотрите на Windows Vista, должно быть 10 различных способов взломать ее.

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

Механизмы активации и регистрации нацелены на «среднего Джо»: людей, у которых недостаточно технических знаний, чтобы обойти это (или в этом отношении знают, что они могут обойти это). Не беспокойтесь о крекерах, у них слишком много времени.

8
24.02.2013 09:09:45
Если вы действительно потрудились передать свой регистрационный код в dll, вы должны убедиться, что DLL должна отличаться в каждой новой версии вашего программного обеспечения. В противном случае вам будет еще проще взломать ваше программное обеспечение. Все, что им нужно сделать, это взломать вашу DLL один раз и использовать ее для всех последующих версий. Даже конечные пользователи могут сделать это, когда найдут старую взломанную DLL, и это даже хуже, чем встроить механизм регистрации в управляемый код.
Adrian Grigore 1.12.2009 11:57:56

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

У обоих одинаковый очень простой ответ: не передавайте объектный код ненадежным сторонам, таким как (очевидно) вашим клиентам. Возможно ли разместить приложение на ваших машинах, зависит только от того, что оно делает.

Если это не веб-приложение , возможно, вы можете разрешить SSH- вход с X-пересылкой на сервер приложений (или Remote Desktop Connection , я полагаю, для Windows).

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

Если вы мне не верите, обратите внимание на громкое приложение, которое не было взломано и пиратским.

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

Существуют пакеты, которые будут шифровать ваш EXE-файл и расшифровывать его, когда пользователю разрешено его использовать.

Конечно, можно обойти тест «can-I-use-it», чтобы он всегда возвращал значение true.

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

2
24.02.2013 09:12:13
не точка сбоя легко отладить, и переопределить код в .NET, чтобы обойти эту проверку. Также, как вы измените коды операций в .NET, можете ли вы уточнить это?
Priyank Bolia 3.02.2009 09:00:56
Ой. Я имел в виду трюки C; скажем, взять адрес функции проверки, сложить 10 первых байтов в этом массиве символов (приведите указатель на функцию); выберите любую функцию f и сохраните [адрес f минус предыдущую сумму] в fptr. Всегда называйте f как * (fptr + эта сумма). Предварительно вычислите «эту сумму»
Jonas Kölker 4.02.2009 08:38:30

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

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

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

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

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

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

23
27.01.2020 21:19:26
Использование надежной криптографии для защиты / проверки ваших лицензий совершенно бесполезно, если кто-то извлекает код, который прерывает работу приложения, если лицензия не проверяется. :)
Bombe 3.02.2009 08:33:27
Согласились, но, как я уже говорил, защита не для тех групп пользователей, которые прибегнут к использованию кряков (предположение, которое я сделал, будет существовать).
Mystic 3.02.2009 08:43:03
криптография с открытым ключом = асимметричная криптография. Я думаю, что вы имели в виду симметричный.
mmcdole 3.02.2009 09:29:25
Справедливости ради следует отметить, что третий пункт является предвзятым, поскольку он предполагает, что часть людей всегда составляет меньшинство. Я уверен, что в определенных рамках это явное большинство. У меня есть онлайны игры с многопользовательской особенностью в виде , потому что а) большинство пользователей дети с очень низким этическими стандартами ; б) стоимость может быть существенной для тех пользователей , если это ежемесячная плата , которая тащит в течение нескольких месяцев и т.д.
j riv 26.10.2017 04:26:12
  • Используйте онлайн-обновление, чтобы заблокировать эти нелицензионные копии.

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

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

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

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

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

16
26.06.2009 11:36:53

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

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

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

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

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

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

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

20
14.09.2009 08:09:59
как идея, вы также можете использовать разные пароли для ассиметричного шифрования в разных выпусках.
Priyank Bolia 3.02.2009 09:45:45
Интересная идея, но в чем конкретно проблема с длинным регистрационным кодом? В наши дни никто все равно не будет вводить это вручную - все копируют и вставляют его, поэтому не имеет значения, будет ли это 10 или 100 символов.
EMP 21.06.2010 07:39:51
@ Евгений: Это верно только в том случае, если ваши пользователи опытные пользователи. Мы создаем условно-бесплатные / казуальные игры уже много лет, и я могу вам сказать, что большинство наших пользователей не могут копировать и вставлять. В окне регистрации даже есть руководство по копированию и вставке, а некоторые даже не читают его.
Adrian Grigore 22.06.2010 10:06:17
Вот Это Да! Ладно, у тебя явно больше опыта, чем у меня, так что я не могу спорить, я могу только сказать, что я удивлен. Но я бы сказал, что если они не знают, как копировать и вставлять, то вы должны сделать код длиной в 200 символов, чтобы они выучили очень полезные навыки работы с компьютером. :)
EMP 22.06.2010 23:12:13
@Evgeny: Даже с короткими регистрационными кодами мы все еще получали много электронных писем от людей, которые неправильно набрали свои коды и поэтому думали, что код не может быть действительным, потому что они никогда не допустят ошибку, подобную этой, несколько раз за строка. Я предпочитаю оставить преподавание ИТ другим компаниям ... :-)
Adrian Grigore 23.06.2010 08:10:52

Вы можете..

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

UPDATE: (Раскрытие информации: Я работаю на Eazfuscator.NET) Что делает Microsoft SLP Services Software Потенциальный отличается способность виртуализировать код, так что вы определенно можете . Прошло несколько лет с тех пор, как вопрос был задан изначально; сегодня доступно больше продуктов, которые также работают на аналогичной основе, например:

14
21.10.2014 11:21:48
ценообразование мой друг, покупка лицензионного программного обеспечения от Microsoft слишком дорого для обычного ISV
Priyank Bolia 3.02.2009 09:36:42
Я пробовал, он работает очень хорошо, но он шифрует код только внутри метода, а не всей сборки или проекта, поэтому взломщик может легко изменить поток программы с помощью IL-инъекции
Mohsen Afshin 27.02.2013 07:54:01
@ogggre Если вы добавляете ссылки поставщиков, вам действительно нужно раскрывать свои связи в посте. Также текущая версия SLPS (над которой я работаю: D) поддерживает дженерики. Естественно, что у всех решений есть свои плюсы и минусы, которые только eval может правильно контекстуализировать для людей
Ruben Bartelink 19.10.2014 15:09:38
@MohsenAfshin Я не понимаю, что вы говорите, суть в том, что вам нужно защищать любые методы, в которых добавление / удаление / изменение IL будет представлять собой нарушение лицензии. Поскольку виртуализация вещей не может быть бесплатной, просто не имеет смысла «магически защищать все», как вы предлагаете. Возвращаясь к ключевому моменту: цель защиты SP состоит в том, чтобы предотвратить изменения IL в методах, которые вы выбираете, исходя из того, что они чувствительны (плюс, как правило, некоторые другие в качестве шума, чтобы избежать посадки, вам нужно взломать этот бит здесь -> знак )
Ruben Bartelink 19.10.2014 15:16:08
@RubenBartelink Я согласен с вами. К сожалению, эта тема слишком большая с несколькими страницами контента. Сначала я хотел добавить новый ответ, но StackOverflow предположил, что лучше расширить существующий. Так я и сделал. Надеюсь, мой маленький кусочек информации полезен. Спасибо за обновление общей поддержки в SLPS и ваши исправления.
ogggre 21.10.2014 11:28:38

.NET Reactor

Обновить

Джаред отметил, что de4dot утверждает, что может его декомпилировать.

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

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

5
18.11.2013 09:57:16
Я пытался связаться с этими парнями с каким-то вопросом, я имел об их продукте, но они никогда не отвечали. Вы пробовали их продукт. Я пошел с умной сборкой, и их продукт и поддержка очень хороши. Но, как я уже сказал в этом вопросе, запутывание является одним из способов, но не полным доказательством.
Priyank Bolia 3.02.2009 16:20:45
У меня были некоторые проблемы с их продуктом ранее, а затем я задал вопрос о значках высокого разрешения в groups.google.se/group/net-reactor-users, и я получил ответ и исправление, но теперь кажется, что их трудно получить за. К плохому - это отличный продукт, и я все еще использую его
loraderon 3.02.2009 20:22:00
Если «никакой существующий инструмент не может декомпилироваться», почему он указан как поддерживаемый обфускатор / упаковщик на странице возможностей de4dot
Jared Thirsk 17.11.2013 02:43:33
Возможно, потому что это старое утверждение, и они не обновили свою веб-страницу. Я больше не пользователь какого-либо инструмента запутывания.
loraderon 18.11.2013 09:53:02
de4dot - очень мощный инструмент. Я попробовал это против нескольких обфускаторов, и это делает большую работу. Однако он не смог обработать защищенные файлы .NET Reactor (v6.0). Может быть, de4dot не в курсе.
InputOutput 2.02.2020 16:46:06

Помимо защиты покупок вы (или ваши разработчики) можете научиться защищать от копирования.

Это идеи:

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

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

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

Переписать некоторую логику в C ++ / CLI и смешать управляемый код с неуправляемым. Это укрепит разборку. В этом случае не забудьте также предоставить двоичные файлы x64 .

8
24.02.2013 09:16:27
не можете объяснить подробно.
Priyank Bolia 4.02.2009 15:54:42

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

2
24.02.2013 09:17:01

Есть Salamander , который является родным компилятором .NET и компоновщиком от Remotesoft, который может развертывать приложения без .NET Framework. Я не знаю, насколько хорошо это соответствует его требованиям.

5
4.02.2009 20:04:21
Ответ довольно прост: жаль, что большинство ответов говорят о запутывании. Обфускация хороша для того, чтобы остановить первую (похожую на Reflector) попытку поиска в вашем коде, вот и все. Это не плохо. И, конечно, ничто не мешает настоящим хакерам, понимающим ассемблерный код, кроме написания приложения SAAS (даже тогда они могут попытаться взломать ваш сервер). Но есть еще кое-что, есть такие инструменты, как Salamander, .NET Reactor и др., Которые предоставляют (возможно) почти такую ​​же форму безопасности, которая не компилируется, как скомпилированный C ++ Win32 .exe. Какой из этих инструментов лучше, я пока не могу судить.
Philm 6.08.2013 20:23:09

Извините, невозможно полностью защитить приложение.

2
24.02.2013 09:17:22

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

5
23.05.2017 12:18:24

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

4
16.03.2009 17:12:41
Что если сервер не работает или пользователи не всегда имеют доступ к Интернету, ваш метод просто разочарует клиентов тем, что они часто посещают интернет-серверы, просто чтобы использовать приложение.
Priyank Bolia 17.03.2009 09:37:44
Я полностью согласен. Вот почему я сказал «это, вероятно, более агрессивно, чем вы хотите ...» в моей последней строке. Я просто предлагал ОП лучшее решение, которое, на мой взгляд, было технически выполнимым, а не лучший подход к удовлетворению клиентов :)
rmeador 17.03.2009 14:21:47
В первом квартале 2010 года (через несколько месяцев после написания этого ответа) компания по разработке игр Ubisoft попробовала это сделать, и, очевидно, нагрузка на компоненты на стороне сервера была настолько большой, что игры были неиграбельны. Общее впечатление от ПО: «хлопот в установке, нельзя использовать в автономном режиме, агрессивно и ненадежно ». Итак, если вы решите, что обработка на стороне сервера - это путь, убедитесь, что вы действительно можете масштабироваться по требованию.
Piskvor left the building 21.06.2010 07:11:07

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

46
27.09.2011 14:54:00

Когда дело доходит до .NET, если вы выпускаете приложение Windows Forms (или любое приложение, в котором у клиента есть файл Portable Executable), оно может быть взломано.

Если вы хотите придерживаться .NET и минимизировать вероятность получения исходного кода, то вы можете рассмотреть возможность его развертывания в качестве приложения ASP.NET на веб-сервере, а не в качестве приложения Windows Forms.

2
24.02.2013 10:38:19

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

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

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

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

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

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

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

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

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

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

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

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

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

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

264
15.04.2014 15:57:36
@Learning: он как бы вырос со временем и прошел автоматическое преобразование в CW порог.
Joel Coehoorn 17.03.2009 17:29:24
+1 Лучше, чем ответ, который я дал на предыдущую версию этого вопроса. @ Джоэл Не знал, что был предел.
pipTheGeek 23.07.2009 21:01:51
Я не полностью согласен со всем здесь, и это в любом случае легко +1 для чрезвычайно хорошо продуманной презентации и аргументации.
Beska 23.07.2009 21:23:16
Хороший аргумент, но пропускает пункт о защите интеллектуальной собственности. Если в вашем приложении есть какой-то код, который делает что-то более сложное, запутывание может обеспечить разницу между простым копированием и вставкой кода и попыткой интерпретировать и реинжинировать код, чтобы он работал. Это особенно важно с обновлениями: если кто-то скопировал ваш запутанный код, когда вы выпускаете обновление, они должны делать это снова - и, по крайней мере, это причиняет им больше боли / затрат / времени. Если у вас нет какой-либо защиты, они просто копируют / вставляют снова, и это работает.
gregmac 19.01.2010 19:28:00
Отличный пост - он действительно подробно описывает все причины, по которым не стоит беспокоиться о том, чтобы писать сложные средства защиты от копирования. Несмотря на то, что вопрос является дубликатом, стоит открыть его только для этого ответа. Может мод может слить это?
EMP 21.06.2010 07:55:36

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

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

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

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

10
24.02.2013 10:58:51

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

38
21.02.2010 06:13:52
Кстати, я делаю проект, в котором я хочу также активировать продукт "в автономном режиме" (я сделал сервис WCF, чтобы активировать онлайн). В этом случае, как вы будете манипулировать кодом? ты можешь дать мне несколько хитов?
Piyush 22.02.2010 11:26:08
Интересная идея, но какой курс действий вы бы порекомендовали кому-то, кто разрабатывает приложение, которое должно работать без подключения к данным, например, игры WP7?
Charlie Skilbeck 15.03.2011 17:51:49

Честно говоря, иногда нам нужно запутывать код (например, регистрировать классы лицензий и так далее). В этом случае ваш проект не является бесплатным. ИМО, ты должен заплатить за хороший обфукатор.

Dotfuscator скрывает ваш код, и .NET Reflector выдает ошибку при попытке декомпиляции.

2
24.02.2013 11:03:28

Я могу рекомендовать использовать Обфускатор .

2
24.02.2013 11:04:32

Запутать код! В Обфусцирующем коде C # есть пример .

3
24.02.2013 11:05:25

Если вы хотите, чтобы люди могли выполнять ваш код (а если нет, то почему вы написали его в первую очередь?), То их ЦП должен иметь возможность выполнять ваш код. Чтобы иметь возможность выполнять код, процессор должен уметь его понимать .

Поскольку процессоры тупые, а люди нет, это означает, что люди могут понимать и код.

Есть только один способ убедиться, что ваши пользователи не получают ваш код: не давайте им свой код.

Это может быть достигнуто двумя способами: Программное обеспечение как услуга (SaaS), то есть вы запускаете свое программное обеспечение на своем сервере и разрешаете своим пользователям только удаленный доступ к нему. Это модель, которую использует переполнение стека, например. Я уверен, что Stack Overflow не запутывает их код, но вы не можете его декомпилировать.

Другой способ - модель устройства: вместо того, чтобы предоставлять своим пользователям свой код, вы предоставляете им компьютер, содержащий код. Это модель, которую используют игровые приставки, большинство мобильных телефонов и TiVo . Обратите внимание, что это работает, только если вы «владеете» всем путем выполнения: вам нужно создать свой собственный ЦП, свой компьютер, написать свою собственную операционную систему и свою собственную реализацию CLI . Тогда и только тогда вы сможете защитить свой код. (Но учтите, что даже небольшая ошибка сделает все ваши средства защиты бесполезными. Microsoft, Apple, Sony, музыкальная индустрия и киноиндустрия могут это подтвердить.)

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

9
24.02.2013 11:08:17

Да. Это правда. Код .NET чрезвычайно легко перепроектировать, если код не запутан.

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

Visual Studio включает в себя версию Dotfuscator . Так как это пакетная версия, вы точно не получите самое сильное запутывание. Если вы посмотрите на их списки функций, вы увидите, что именно вам не хватает (и что именно сделает приложение, чтобы сделать ваш код более безопасным).

Есть пара других бесплатных или открытых исходных кодов .NET (но я не могу комментировать качество или различные методы, которые они используют):

В конце концов, нет ничего идеального. Если кто-то действительно хочет увидеть, как работает ваше программное обеспечение, он увидит.

7
24.02.2013 11:09:30
Это не просто «если они действительно хотят увидеть, как работает ваше программное обеспечение, они будут». Если они заботятся, они могут догадаться, не глядя. У 99,9% + программного обеспечения нет алгоритмов волшебной пыли. Сложная часть программирования не какая-то особая секретная техника. Это просто заставляет все части выстраиваться и работать.
Ken 22.06.2010 13:24:49
@ Кен - Тссс! Вы не можете позволить остальному миру знать, что большую часть времени мы не используем магические алгоритмы пыли.
Justin Niessner 22.06.2010 13:27:01
Джастин: Любовь считается магическим алгоритмом? Любовь - это то, что делает мои программы особенными. Я не думаю, что вы можете разобрать Любовь.
Ken 22.06.2010 13:49:57
Babel.NET больше не является бесплатным. Вы можете найти список наиболее распространенных обфускаторов (бесплатных и коммерческих) здесь .
InputOutput 2.02.2020 16:35:07

Все, что работает на клиенте, может быть декомпилировано и взломано. Обфусификация только усложняет. Я не знаю ваше заявление, но в 99% случаев я просто не думаю, что оно того стоит.

3
22.06.2010 13:13:45

Да, двоичные файлы .NET (EXE и DLL) могут быть легко декомпилированы почти до исходного кода. Проверьте инструмент .NET Reflector . Просто попробуйте против любого двоичного файла .NET. Наилучшим вариантом является обфускация файлов, они все еще могут быть декомпилированы .NET Reflector, но они создают нечитаемый беспорядок. Я не думаю, что хорошие обфускаторы будут бесплатными или дешевыми. Одним из них является Dotfuscator Community Edition, который поставляется с Visual Studio.

1
24.02.2013 11:11:06
Redgate, кажется, также имеет обфускатор. Я не использовал его, но мне понравились некоторые из их других инструментов. Это, конечно, не бесплатно, хотя. См. Red-gate.com/products/smartassembly/index.htm
WildCrustacean 22.06.2010 13:19:10
Является ли издание сообщества Dotfuscator наравне с другим обфускатором? Я проверил это сравнение msdn.microsoft.com/en-us/library/ms227240(VS.80).aspx , однако, большинство функций, не проверенных для выпуска сообщества, я действительно не понимал, будут ли они необходимы!
Jayesh 22.06.2010 13:22:30

Имейте в виду, что 99% ваших пользователей не будут заинтересованы в изучении вашего исполняемого файла, чтобы увидеть, как он работает.

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

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

2
22.06.2010 13:16:44

Просто чтобы добавить предупреждение: если вы собираетесь использовать запутывание, проверьте, что все еще работает! Запутывание может изменить такие вещи, как имена классов и методов. Поэтому, если вы используете рефлексию для вызова определенных методов и / или классов (как в плагин-архитектуре), ваше приложение может потерпеть неудачу после запутывания. Также трассировки стека могут быть бесполезны для отслеживания ошибок.

2
22.06.2010 13:20:18