Сообщество программистов Autodesk в СНГ
		ADN Club => AutoCAD .NET API => Тема начата: sash-2007 от 04-06-2018, 14:32:24
		
			
			- 
				Здравствуйте !
 
 Подскажите пожалуйста  как можно скрыть часть кода от посторонних  глаз  :)
 делаю DLL  для Автокада 2010   на NET
 нужно чтоб,  нельзя было посмотреть часть кода ILDASM , NET Reflector  и другими дизассемблерами.
 
 пробовал:  подключать класс С++(unmanaged),   подключать библиотеку DLL на С++(unmanaged) не работает
 может я не правильно делаю.
 
 windows 7  x64 , Автокад 2010, Visual Studio 2008
 
 Может кто то сталкивался с чем то подобным, подскажите в какую сторону смотреть( копать)  :)
 
 Еще вопрос: Можно ли в принципе подключить библиотеку DLL на С++(unmanaged) ,  к DLL для Автокада .NET
 
- 
				пробовал:  подключать класс С++(unmanaged),   подключать библиотеку DLL на С++(unmanaged) не работает
 может я не правильно делаю.
 
 Наверное делаешь неправильно.Еще вопрос: Можно ли в принципе подключить библиотеку DLL на С++(unmanaged) ,  к DLL для Автокада .NET Да. Можно.
 
- 
				Спасибо за ответы :) 
 
 Не могли бы дать какую нибудь ссылку на данный материал
 или пример кода.
 
- 
				sash-2007, 
 Встречный вопрос. Что должна делать dll (C++)? Она должна обращаться к AutoCAD (использовать ObjectARX) ? От этого многое зависит.
- 
				Добрый день :)
 
 DLL на С++  должна шифровать строку  по ключу
 переданную из NET  DLL
 
 к ObjectARX  обращаться   не нужно
- 
				к ObjectARX  обращаться   не нужно Ну тогда всё еще проще. Читай статью: https://docs.microsoft.com/ru-ru/cpp/dotnet/how-to-call-native-dlls-from-managed-code-using-pinvoke
- 
				Вот еще цикл статей:
 P/Invoke Tutorial: Basics (Part 1) [Technical Blog] (https://www.codeproject.com/Articles/403285/P-Invoke-Tutorial-Basics-Part)
 P/Invoke Tutorial: Passing strings (Part 2) [Technical Blog] (https://www.codeproject.com/Articles/401922/P-Invoke-Tutorial-Passing-strings-Part)
 P/Invoke Tutorial: Passing parameters (Part 3) [Technical Blog] (https://www.codeproject.com/Articles/401921/P-Invoke-Tutorial-Passing-parameters-Part)
 P/Invoke Tutorial: Pinning (Part 4) [Technical Blog] (https://www.codeproject.com/Articles/401920/P-Invoke-Tutorial-Pinning-Part)
- 
				Можно использовать обфускаторы кода.
 Но на мой взгляд, прежде чем тратить время на скрытие кода, нужно ответить на один простой вопрос - а он (код) кому-то нужен?
- 
				Можно использовать обфускаторы кода. Именно так. Посмотрите готовые решения по защите .NET библиотек. Даже если Вы вынесете проверку лицензии в C++, всё равно код .NET останется незащищённым. Можно будет выполнить, например, подмену C++ библиотеку проверки. Либо пересобрать .NET библиотеку таким образом, чтобы она вообще не обращалась к функциям проверки в библиотеке C++. Так что, обфускация, хоть и не гарантирует 100% надёжности, но сильно усложнит жизнь тому, кто захочет покопаться во внутренностях вашей dll. В большинстве случаев этого будет достаточно.
- 
				Спасибо за ответы  :)
 
 Обфускаторы  +  DLL на С++  = хорошая защита
- 
				Даже если Вы вынесете проверку лицензии в C++, всё равно код .NET останется незащищённым.  Только если C++ код занимается проверкой лицензии, а не выполняет какую-то нетривиальную работу на основе информации из лицензии.
 
- 
				Единственное, обфускаторы надо проверять на возможность использования именно в контексте приложений под AutoCAD. У меня был опыт использования такого, который все ссылочные DLL упаковывал вместе с основной в одну сборку, даже AcDbMgd, AсMgd и AcCoreMgd. Естественно, что эта сборка потом не грузилась в AutoCAD.
 Только если C++ код занимается проверкой лицензии, а не выполняет какую-то нетривиальную работу на основе информации из лицензии. Да, конечно, согласен.
- 
				Кстати, если интересно, сейчас как раз изучаю Sentinel LDK. Помимо, собственно, обширнейшего механизма лицензирования, у них достаточно неплохой обфускатор. И после него сборка нормально грузится в AutoCAD и работает как надо, но уже зашифрована и защищена. Правда, использование этого механизма в среднем добавляет 1,5-2,0 тыс руб к стоимости одного рабочего места для приложения. Так что, имеет смысл использовать, если цена рабочего места сопоставима с этой суммой.
			
- 
				Кстати, если интересно, сейчас как раз изучаю Sentinel LDK Это которая с аппаратным (USB) ключом? Когда-то мы пользовались такими для защиты МАЭСТРО. Стоимость ключа была около $20, т.е. это была добавка к стоимости нашего ПО. Аналогичную систему защиты использовал и Autodesk до 2000-го года.
- 
				Да, когда-то давно изначально у них был только аппаратный ключ. Сейчас у них есть как аппаратные ключи защиты, так и программные ключи. Есть API, что позволяет наиболее полно итегрировать их механизм лицензирования в свою систему реализации ПО. Очень интересный продукт.
			
- 
				Хотелось бы эту тему раскрыть по подробней, т.к. на днях обнаружил как пользователь копается в моих исходниках. Наличие JustDecompile у него на рабочем столе открыло мне глаза, что даже простой инженер в 2 клика может залезть в мои исходники. Поэтому у меня несколько более конкретных вопросов по теме:
 1. Все обфускаторы платные? Даже если мне достаточно просто тотального все переименовать?
 2. Нашел невнятный комментарий, что вроде бы в C# есть атрибут для пометки части кода как unmanaged и такой код уже не виден через reflection. Есть такое? Простые декомпиляторы без деобфускаторов с таким кодом не справятся?
 3. Я отправляю из плагина почту по SMTP. Соответсвенно в коде лежит логин/пароль. Для защиты от просмотра бинарника я пароль зашифровал. Но метод дешифровки в декомпилированном коде не просто виден - он прекрасно работает...  Ключ шифрования тоже бросается в глаза. Что посоветуете, где спрятать пароль?
- 
				1. Все обфускаторы платные? Даже если мне достаточно просто тотального все переименовать? В Visual Studio 2017 обнаружил недавно дополнительный компонент - Dotfuscator. Можно попробовать с помощью него обфусцировать сборку. Сам ещё не пробовал - руки не доходят.
 Если что, устанавливается через Visual Studio Installer. Надо покопаться и найти его в дополнительных компонентах.
- 
				В Visual Studio 2017 обнаружил недавно дополнительный компонент - Dotfuscator. Он есть и в VS 2015 Update 3. Я не запускал и не пробовал, мне пока без надобности.
- 
				Я помню он был ещё в версии 2010 "из коробки". Потом в следующих версиях пропал и был доступен только отдельно за деньги. Теперь вот снова появился в виде версии "Community Edition": https://docs.microsoft.com/ru-ru/visualstudio/ide/dotfuscator/?view=vs-2017
 Хе-хе:
 Ваша копия Microsoft Visual Studio 2017 включает копию PreEmptive Protection - Dotfuscator Community Edition (или Dotfuscator CE), доступную для бесплатного личного использования. Почитал внимательно лицензионное соглашение. Вроде как, нигде не сказано, что только для некоммерческих разработок. Делается только упор на то, что лицензия должна использоваться лично разработчиком.
- 
				dotfuscator проверил. Работает, все переименовывает, кроме public. Пришлось повозиться, заменяя где возможно на internal. Автокад не возражает.... вроде бы. Надо еще по тестировать, но на первый взгляд все хорошо. Код делает чудовищно не читаемым. Спасибо!
 Первый вопрос снят.
- 
				2. Нашел невнятный комментарий, что вроде бы в C# есть атрибут для пометки части кода как unmanaged и такой код уже не виден через reflection. Есть такое? Простые декомпиляторы без деобфускаторов с таким кодом не справятся? Ты ничего не путаешь? Может речь идёт про unsafe, а не про unmanaged? В любом случае от декомпилятора это не спасёт. Спасти может только если мудуль написал на mixed C++, когда часть кода managed (и соответственно может быть декомпилирован) и часть кода native и соответственно .NET-декомпиляторы с ним ничего сделать не могут.
- 
				3. Я отправляю из плагина почту по SMTP. Соответсвенно в коде лежит логин/пароль. Для защиты от просмотра бинарника я пароль зашифровал. Но метод дешифровки в декомпилированном коде не просто виден - он прекрасно работает...  Ключ шифрования тоже бросается в глаза. Что посоветуете, где спрятать пароль? Я бы сделал native (написанную на C++) dll-ку с функцией - дешифровки (ключ зашит в ней) и ей передавал бы строку для дешифровки. Впрочем и отправку e-mail можно в ней реализовать. Это конечно не обезопасит от нормального хакера.
- 
				Первый вопрос снят. А я  уж подумал, что обфускатор снимет оставшиеся вопросы :)
 2. Нашел невнятный комментарий, что вроде бы в C# есть атрибут для пометки части кода как unmanaged и такой код уже не виден через reflection. Есть такое? Есть ссылочка почитать о чём там речь? Вроде как, никаких простых решений для борьбы с декомпиляцией C# кода не существует. Я так понимаю, что это актуально для языка C++. На C# неуправляемый код не написать. Рекомендуют делать такие куски неуправляемого кода, пряча внутрь важную функциональность. Неуправляемый код действительно довольно сложно декомпилировать. Пока писал, Александр Наумович уже всё объяснил, в принципе :)
 3. Я отправляю из плагина почту по SMTP. Соответсвенно в коде лежит логин/пароль. Для защиты от просмотра бинарника я пароль зашифровал. Но метод дешифровки в декомпилированном коде не просто виден - он прекрасно работает...  Ключ шифрования тоже бросается в глаза. Что посоветуете, где спрятать пароль? Чем глубже - тем лучше. Насколько фантазии хватит :). У меня есть некоторые хитрости для усложнения жизни взломщикам. Но они не сказать что прямо железобетонные. Ну и раскрывать их хотя бы из соображения безопасности не хочу. Тут ещё такой момент - автору хорошо видно где и что смотреть. А когда с чужим, да ещё и обфусцированным кодом разбираться придётся - сдаётся мне, что даже неспрятанные пароли будет тяжеловато найти. Без нормальных имён, без комментариев. Задачка явно непростая, я думаю.
- 
				Ты ничего не путаешь? Столько начитался по теме, что конечно же все перепуталось в голове. Наверно unsafe, да. И ссылку уже теперь не найду. Но раз ни что не мешает декомпилятору, то значит и вопрос про атрибуты отпадает.
 
- 
				Чем глубже - тем лучше. Я просто подумал, что есть какие-то общие рекомендации или даже может специальный API. Задачка-то вроде общеупотребимая. Но раз каждый пилит свой велосипед - буду пилить, куда деваться....
- 
				Я просто подумал, что есть какие-то общие рекомендации или даже может специальный API. Ну кое-что есть: https://docs.microsoft.com/ru-ru/dotnet/standard/security/cryptographic-services
 Только чтобы в этом всём разбираться, надо хорошенько изучить теорию криптографии.
- 
				Интересная тема, тоже в свое время изучал форумы по защите NET, информации не очень много, все что я понял:
 1. Языки типа .NET и JAVA более уязвимы, чем C++, BASIC и т.д., в силу своей природы кроссплатформенности,  у них описание типов данных вынесено отдельно и хорошо читаются. Т.е. обфускаторы прячут имя Ваших классов, методов, но базовые типы данных .NET, а возможно и типы из dll AutoCAD будут читаться.
 2. Обфускаторов много, есть бесплатные, эффективность их разная. Но вот как определить после которого код легко взломать а который "крепкий орешек"? Поделитесь ссылками если есть на сравнение.
 3. Деобфускаторы существуют и позволяют легко прочитать структуру программ с "корявыми именами", останется только в полуавтоматическом режиме вновь присвоить имена классам и методам на свой вкус . Есть ролики на ютубе, вроде все просто.
 4. В комментах к статьям видел что человек жаловался, что после платного обфускатора хакер получил его исходники и потом по почте прикалывался и говорил что взломать было легко.
 
 Если увидели инфу что какой-то обфускатор взломан или не надежен кидайте инфу сюда, всем будет полезно знать. :-)
- 
				В меня конечно сейчас камни полетят, но.... может кто-то привести пример, факт, того, как у кого-то "сперли" плагин для автокада и нанесли этим финансовый (или еще какой) урон?
			
- 
				В меня конечно сейчас камни полетят, но.... может кто-то привести пример, факт, того, как у кого-то "сперли" плагин для автокада и нанесли этим финансовый (или еще какой) урон?
 
 Подробностей раскрывать не буду, хотя прошло очень много лет, но в своё время защита МАЭСТРО (http://maestrogroup.com.ua/), которая была построена на ключах Sentinel была взломана. Мы сами были виноваты, так было одно место, через которое проходила проверка на уровне Да/Нет, которую нашли и обошли. Очевидно, что какой-то финансовый урон был. Пришлось тогда заняться защитой всерьез и потратить на неё несколько месяцев. Конечно сказать, что МАЭСТРО - это "плагин для автокада" будет неким преуменьшением, но в принципе это конечно плагин или множество плагинов...
 
 
- 
				может кто-то привести пример, факт, того, как у кого-то "сперли" плагин для автокада и нанесли этим финансовый (или еще какой) урон?
 
 Так ведь не побегут же к разработчику хвастаться: "смотри, мы твой плагин сломали и бесплатно юзаем!". Вскрыли, обошли защиту, установили всем в какой-нибудь шаражкиной конторе на 20 проектировщиков и пользуются тихонько.
- 
				Так ведь не побегут же к разработчику хвастаться: "смотри, мы твой плагин сломали и бесплатно юзаем!".  Можешь не сомневаться, что почти так и было. На e-mail написали...
- 
				может кто-то привести пример, факт, того, как у кого-то "сперли" плагин для автокада и нанесли этим финансовый (или еще какой) урон? К сожалению у меня ссылок не сохранилось, остались на одной из предыдущих работ.((
 
 Кажется А. Бушман отмечал, что часть кода в Autodesk App Store вообще без защиты лежит. Т.е. можно устанавливать триальные версии и искать не защищенные исходники и автор никогда не узнает кто и когда.
 
 А про финансовый урон это все относительно, можно же спереть приложение и выпустить свое конкурирующее и отобрать в будущем часть прибыли разработчика.
 
- 
				Вскрыли, обошли защиту, установили всем в какой-нибудь шаражкиной конторе на 20 проектировщиков и пользуются тихонько. Именно это я и заметил. Для серьезных хакеров плагины конечно не интересны. Но уж больно легко взломать - ломают простые инженеры с минимальным опытом в VS.
 
- 
				Кстати. Слышал такое мнение, что защиту надо делать довольно простой, но в несколько уровней. Первый уровень защиты - проверка при каждом запуске. Легко обнаружить, легко взломать. Второй уровень - проверка раз в месяц или по другому знаковому событию. Например - после 150-го вывода на печать. Если не прошла проверка второго уровня - поперёк экрана большими буквами "ваша копия нелегальна и будет заблокирована" с контактами для оплаты. Этот пример приводили для бухгалтерских программ и защита второго уровня срабатывала в период квартальных отчётов. Идея, как минимум, интересная.
			
- 
				Интересная тема, тоже в свое время изучал форумы по защите NET, информации не очень много, все что я понял:
 1. Языки типа .NET и JAVA более уязвимы, чем C++, BASIC и т.д., в силу своей природы кроссплатформенности,  у них описание типов данных вынесено отдельно и хорошо читаются. Т.е. обфускаторы прячут имя Ваших классов, методов, но базовые типы данных .NET, а возможно и типы из dll AutoCAD будут читаться.
 2. Обфускаторов много, есть бесплатные, эффективность их разная. Но вот как определить после которого код легко взломать а который "крепкий орешек"? Поделитесь ссылками если есть на сравнение.
 3. Деобфускаторы существуют и позволяют легко прочитать структуру программ с "корявыми именами", останется только в полуавтоматическом режиме вновь присвоить имена классам и методам на свой вкус . Есть ролики на ютубе, вроде все просто.
 4. В комментах к статьям видел что человек жаловался, что после платного обфускатора хакер получил его исходники и потом по почте прикалывался и говорил что взломать было легко.
 
 Если увидели инфу что какой-то обфускатор взломан или не надежен кидайте инфу сюда, всем будет полезно знать. :-)
 
 Все статьи по теме говорят одно и то же - все гораздо хуже чем вы думаете. Никакой защиты нет вообще. Обфускаторы только путают код, удлиняют анализ, но никак его не защищают. Считайте, что они все взломаны.
 Запутывание кода поможет если цель - не дать разрабатывать на основе этого кода что-то еще. После обфускатора проще переписать все заново. А вот защиты ваших ноу-хау, паролей, ограничений триалов и т.п. нет вообще никакой. Все внешние вызовы, в том числе API Аавтокада прекрасно видны. Как и все public объявления - обфускатор их не трогает.
- 
				Кстати. Слышал такое мнение, что защиту надо делать довольно простой, но в несколько уровней.  У нас было в результате как минимум три уровня. Одним из интересных был уровень дешифровки по ключу имени lisp-функции, которая должна была дальше выполняться.
 P.S.: Только .NET'а у нас не было. C++ и AutoLisp.
- 
				Для серьезных хакеров плагины конечно не интересны. Серьезному хакеру не интересно, пока это для него бесплатно. Как только появляется человек-заказчик с деньгами, ему становится интересно. Сам был свидетелем пары эпизодов, когда люди готовы платить за взлом.
- 
				Для серьезных хакеров плагины конечно не интересны. Серьезному хакеру не интересно, пока это для него бесплатно. Как только появляется человек-заказчик с деньгами, ему становится интересно. Сам был свидетелем пары эпизодов, когда люди готовы платить за взлом.
 
 Всё зависит от стоимости и востребованности "плагинов".
- 
				Одним из интересных был уровень дешифровки по ключу имени lisp-функции, которая должна была дальше выполняться.
 
 Оригинально! Вот да, что-то такое и надо придумывать. Не то, что можно найти на просторах сети, а что-то своё уникальное.
 Кстати, ещё, как вариант, можно же прятать функционал в компилированный LISP (файлы FAS). Мне, например, не удалось найти ни одного декомпилятора для них.
- 
				Кстати, ещё, как вариант, можно же прятать функционал в компилированный LISP (файлы FAS). Мне, например, не удалось найти ни одного декомпилятора для них. Есть такие. Так что FAS не советую...
- 
				В кулуарах бытует мнение, что взломщики для программ всем нам известной фирмы делает... эта же самая фирма! И это гениальная идея на самом деле. Прибыль приносит известность.
 Если вашими плагинами пользуются какие-то мелкие шаражки по 20 человек, которые взломали эти плагины - да и флаг им в руки. Главное - чтобы они рассказывали об этих плагинах другим людям. И самое главное - чтобы такое сарафанное радио доходило уже до крупных организаций. А вот эти крупные организации не будут замарачиваться - они купят! И несколько таких крупных принесут прибыли больше, чем много мелких
 ИМХО
- 
				В кулуарах бытует мнение, что взломщики для программ всем нам известной фирмы делает... эта же самая фирма! Не повторяй пожалуйста глупости.
- 
				В кулуарах бытует мнение, что взломщики для программ всем нам известной фирмы делает... эта же самая фирма! Не повторяй пожалуйста глупости.
 
 Так это или не так - не важно на самом деле. Просто я неоднократно слышал такое мнение, но ни соглашусь с ним, ни опровергну - просто я не знаю. Мысль моя была в другом
- 
				Мысль моя была в другом Она тоже далеко не бесспорная... Но в ту область я лезть не хочу.
- 
				Просто я неоднократно слышал такое мнение, но ни соглашусь с ним, ни опровергну - просто я не знаю У меня сложилось такое-же мнение. И главная цель - захват и удержание доли рынка любой ценой. Кто не готов платить все равно не заплатят, но могут уйти к конкурентам. Недавно читал статистику что доля лицензий AutoCAD 2млн.  а пираток 12млн.
 /* Александр Ривилис:
 Если речь идёт об этой статье: https://www.worldcadaccess.com/blog/2018/05/about-those-12-million-pirates-autodesk-has-eyes-on.html, то цифры 2млн и 12млн. */
 да все верно, цифры исправил.
 вот ссылка:
 https://mikhailov-andrey-s.blogspot.com/2018/03/chto-novogo-v-autocad-2019-1.html (https://mikhailov-andrey-s.blogspot.com/2018/03/chto-novogo-v-autocad-2019-1.html)
 
- 
				Привалов Дмитрий, 
 Александр Пекшев aka Modis,
 С оффтопом заканчиваем.
- 
				Все статьи по теме говорят одно и то же - все гораздо хуже чем вы думаете. Никакой защиты нет вообще. Обфускаторы только путают код, удлиняют анализ, но никак его не защищают. Считайте, что они все взломаны.  Ну так логично, если код находится локально и работает его можно читать, править. Рекомендации выносить важные функции во вне - на сайт, в ключ электронной защиты, шифровать прятать.
 
 Интересно читать форумы хакеров. Переписка примерно следующая
 1. .NET защищен, как определить каким обфускатором?
 2. Парни подскажите чем взломать обфускатор .....
 3. Че пока не смогли взломать?
 4. Через год вышла утилита ххх ей можно.
 
 В одной статье было упоминание что нормальны обфускаторы стараются спрятать вызовы методов используя различные механизмы. У распространенных(популярных)  обфускаторов эти механизмы ломают и пишут дешифраторы вызовов. И новые версии обфускаторов могут ничего не давать в плане защиты, если механизм сокрытия вызовов тот-же. Автор статьи тогда сказал, что по изучению обфускаторов решил написать свой, для того, чтобы у хакеров не было в распоряжения механизма сокрытия вызовов методов.
- 
				Оригинально! Вот да, что-то такое и надо придумывать. Есть еще сложная идея. Некоторые вирусы не содержат зловредного кода и антивирусник ничего в них не находит. Через некоторое время они скачивают код из сети и запускают.
 Наверняка сложно анализировать такой код, т.к. надо найти блок подгрузки и перехватить кусок подгружаемого кода, что добавляет сложности. ;-)
- 
				Через некоторое время они скачивают код из сети и запускают. Это если их пускают в сеть.
- 
				Возникла еще одна идея по теме. Можно ли как-то проверить, что плагин запущен из-под отладчика? Первое, что приходит в голову - поискать в процессах exe отладчика VS (как его там... devenv.exe ?) 
 Или еще лучше в самом коде обнаружить, что он перекомпилирован в DEBUG. Это возможно?
- 
				 Можно ли как-то проверить, что плагин запущен из-под отладчика? Можно, но сложно, так как для таких случаев используют скрывающие себя отладчики. Вот эта функция в Win32 API проверяет запущен ли код из под отладчика: IsDebuggerPresent (https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms680345)
 И вообще посмотри эту статью: https://www.codeproject.com/Articles/670193/Csharp-Detect-if-Debugger-is-Attached
 Но и на неё находят противоядие.
- 
				Можно, но сложно, так как для таких случаев используют скрывающие себя отладчики. 
 
 От тех, кто использует скрывающие себе отладчики уже ничто не спасет :) А вот System.Diagnostics.Debugger.IsAttached - это то что надо! Спасибо.
- 
				А вот System.Diagnostics.Debugger.IsAttached - это то что надо!  Ты комментарий прочитал, что он отслеживает только managed отладку?
- 
				Ты комментарий прочитал, что он отслеживает только managed отладку? Да, конечно. Я от отладки в VS защищаюсь. От более опытных "отладчиков" защищает низкая цена плагинов.
- 
				Если что, устанавливается через Visual Studio Installer. Надо покопаться и найти его в дополнительных компонентах. Или тут скачать: https://www.preemptive.com/products/dotfuscator/downloads
- 
				Попробовал бесплатный обфускатор ConfuserEx - https://yck1509.github.io/ConfuserEx/ (https://yck1509.github.io/ConfuserEx/)
 
 (https://i.postimg.cc/Jtr9V0QJ/confuser.jpg) (https://postimg.cc/Jtr9V0QJ)