Как защитить код c

от admin

Обфусация кода, Защита от декомпиляции

Собственно, кто какие способы защиты от декомпиляции программы и кто какие способы обфуксации кода написанного на c# знает?

Но я вижу, что здесь только издеваются, так что, закройте кто-нибудь тему

@MadKeks никто над вами не издевается, не преувеличивайте. Дело в том, что необходимость в обфускации программ на C# сама по себе довольно сомнительна — очень существенная часть C# кода — это веб-приложения, веб-сервисы и прочий код, который работает на сервере, а следовательно, конечный пользователь его не видит и покопаться в нем не сможет даже с помощью ildasm’a или Reflector’a. Большая часть оставшегося софта — это программы, используемые очень ограниченным кругом лиц (внутрикорпоративные десктоп-приложения например), а следовательно, никому не придет в голову воровать их исходный код, не представляющий особой ценности. К примеру, на своей первой работе я получил в сопровождение кучу адского говнокода, нарушающего все возможные и невозможные каноны чистоты кода и в каккой-то степени благодаря этому уже являвшийся обфусцированным (справедливости ради, мои навыки на тот момент как раз того и стоили — из под моих пальцев вытекал точно такой же кривой говнокод). Так вот что тогда, что сейчас я бы не только не стал этот код воровать с помощью декомпиляции, я бы не стал брать его даже даром из исходников.

В подобной защите, вероятно, нуждается серьезное проприетарное ПО, скажем, какой-нибудь Photoshop, но оно на C# обычно не пишется.

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

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

Впрочем, при желании материалов на эту тему можно найти достаточно. Например вот и вот

UPD

Стоит кстати заметить, что обфускация во многом зависит от средств конкретного языка

Статья NETрогай! Как защитить программу от лишних глаз.

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

  1. Spices.Net
  2. Smart Assembly
  3. NET Reactor

Программа для тестов
Чтобы что-то защищать нужно что-то создать. Я не стал далеко ходить и написал самую простую утилиту с большой, красной кнопкой. При нажатии на нее операционная система выходит из строя. Поэтому если какой-то любопытный пользователь захочет ее вскрыть мы этого не позволим. Открываем Visual Studio и выбираем проект Windows Forms.

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

В первом мы создаем критический процесс и присвоим ее значение 1. Ниже задаем значение для флага BreakOnTermination в шестнадцатиричной системе счисления. После делаем запрос отладочных привилегий в строчке 3 и после присваиваем нашему флагу значение один. Все это дело происходит под четвертым комментарием.

Сохраняем результат и собираем проект. Только не думай нажимать на эту кнопку! Иначе придется перезагружать систему, а это сейчас будет лишним действием. Давай загрузим PE-файл в DiE и убедимся, что все работает корректно.

DiE.jpg

Библиотека никуда не пропала как и линковщик. Все строки хорошо просматриваются, а энтропия остается на статусе в 68%. Значит ничего не зашифровано и мы можем спокойно работать с софтом. Если ты до сих пор не понял, где хранится твой PE-файл из проекта, то загляни в папку bin и там же перейди на Debug. Ну а теперь стоит приступить к защите.

Как работает защита
Для начала предлагаю ознакомиться с теоретической частью нашей статьи. Прежде всего существует два типа защиты NET приложений. Это использование обфускаторов и протекторов. Разберем их плюсы и минусы работы.

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

Spices.Net ​

spices.net.jpg

Spices.Net — инструментальное средство следующего поколения для .Net разработчиков, которое содержит функции защиты .NET кода и множество других возможностей. Программа состоит из ядра системы и 2-х внешних модулей Spices.Obfuscator и Spices.Decompiler. Spices.Decompiler содержит функции декомпилирования для 6 языков IL, C#, C++, VB.Net, J#. В ближайшем будущем в программе появятся новые дополнения, Spices.Investigator (.Net PE metadata browser) и Spices.Informer. Как ты понимаешь по мимо защиты он умеет и декомпилировать некоторые программы. Но наша задача защитить исходный код, чтобы до него не мог добраться пользователь. Поэтому чтобы это сделать открываем нашу программу во вкладке File и далее переходим на Tools, кликаем по кнопке Obfuscate! и ждем результата. В итоге у тебя должен появиться файл и папка Output, где лежит готовая работа.

Теперь давай посмотрим, что у нас получилось. Первым делом заливаем все это в наш любимый DiE.

DiE_OBF1.jpg

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

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

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

Smart Assembly ​

smartassembly.jpg

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

Первым делом нас встречает окно с просьбой загрузить исполняемый файл. Берем в руки нашу программу и выгружаем ее в приложение. Далее настраиваем обфускацию из предложенных функций. Нам доступно создание отчетов, создание сложного ключа, автоматическая отправка ошибок, удаление ненужных строк, настройка уровня обфускации и настройка динамического прокси. Ставим все по хардкору и компилируем наш софт, попутно молясь, что все сработает. Ну а если ты хочешь знать, что конкретно я использовал, то выставляй в настройках следующие функции: Obfuscation (3 level), Compression and Encryption, Strings Encoding, MSIL Disassembelr Protection. Ждем несколько минут и радуемся успешной сборке. Переходим в DiE и смотрим изменения.

DiE_OBF2.jpg

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

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

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

Читать:
Как найти ускорение электрона

NET Reactor ​

netreactor.jpg

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

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

DiE_OBF3.jpg

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

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

Подводим итоги
Итак, сегодня я рассказал тебе о трех утилитах, которые помогут тебе скрыть свой код от пользователей. К сожалению одна из них отказалась работать и от обфускации осталось лишь одно слово. Но это только подтверждает факт того, что не любая программа способна защитить софт. Что лучше использовать в работе решать тебе. Лично я отдаю свой голос в пользу NET Reactor, так как в работе это незаменимый софт. Но не стоит забывать про его конкурента Smart Assembly, ведь он тоже имеет место быть. Хоть и есть в нем минус, который выражается в отсутствии адекватной бесплатной версии.

Как я могу защитить свои сборки .NET от декомпиляции?

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

Защита от декомпиляции по-прежнему остается сложной задачей. Я все еще ищу быстрый, простой и безопасный способ сделать это. Я не хочу запутывать свой код, чтобы имена моих методов были a, b, c или около того. Reflector или другие инструменты должны вообще не распознавать мое приложение как сборку .NET. Я уже знаю о некоторых инструментах, но они очень дорогие. Есть ли другой способ защитить мои приложения?

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

задан 19 марта ’10, 11:03

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

Re «Я не хочу запутывать свой код, чтобы имена моих методов были a, b, c или около того». Почему нет? Это очевидная вещь, которую нужно сделать, чтобы конкурентам было сложнее разобраться в вашей логике. — ToolmakerSteve

Да уж, запутывание 100% «просто работает». Во-первых, вы не должны вкладывать в свой код «секреты», то, что «однажды обнаруженное в коде может поставить под угрозу безопасность». Во-вторых, вы когда-нибудь брали код на GitHub и пытались его перепрофилировать? Я имею в виду, что даже не обфусцированный код может быть безумным для перепрофилирования из-за используемых парадигм, связывания классов, размытых обязанностей класса, фестиваля зависимостей, фестивалей обратного вызова и многого другого. Это означает, что ваш запутанный код совершенно безопасен, пока мы не получим программистов-роботов, способных понимать логику программирования и быстро переписывать / реорганизовывать код, что произойдет не скоро. — Felype

13 ответы

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

Предотвращение пиратства? Эта цель недостижима. Даже собственный код можно декомпилировать или взломать; множество программных продуктов, доступных в Интернете (даже для таких продуктов, как Windows и Photoshop), является доказательством того, что решительный хакер всегда может получить к ним доступ.

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

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

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

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

Как защитить код c

Gray Pipe

Лучший отвечающий

Вопрос

Ответы

This posting is provided "AS IS" with no warranties, and confers no rights.

  • Предложено в качестве ответа Алексей Лосев Editor 14 сентября 2015 г. 6:30
  • Помечено в качестве ответа Maksim Marinov Microsoft contingent staff, Moderator 5 октября 2015 г. 7:16

Все ответы

единственно нормальный способ защиты .Net приложений — вывести защищаемую логику в отдельные dll на C, а в них уже встроить анти-отладочные приёмы на asm.

Другой способ — клиент-серверная реализация с размещением защищаемых методов на стороне сервера.

Ну и патентование-копирайтинг ни кто не отменял.

This posting is provided "AS IS" with no warranties, and confers no rights.

  • Предложено в качестве ответа Алексей Лосев Editor 14 сентября 2015 г. 6:30
  • Помечено в качестве ответа Maksim Marinov Microsoft contingent staff, Moderator 5 октября 2015 г. 7:16

Поставляется с VS, доступен через меню Tools.

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

This posting is provided "AS IS" with no warranties, and confers no rights.

Похожие статьи