C # Скрыть внешние DLL [дублировать]

Часто этот вопрос связан как дубликат вопросов, связанных с кодом типа

printf("%d %d\n", i, i++);

или

printf("%d %d\n", ++i, i++);

или схожими вариантами.

Пока это также неопределенное поведение , как уже было сказано, существуют тонкие различия, когда printf() участвует в сравнении с выражением, таким как:

   x = i++ + i++;

В следующем statement:

printf("%d %d\n", ++i, i++);

порядок оценки аргументов в printf() является неуказанным . Это означает, что выражения i++ и ++i могут быть оценены в любом порядке. Стандарт C11 содержит некоторые соответствующие описания:

Приложение J, неуказанное поведение

Порядок, в котором обозначение функции, аргументы и подвыражения в аргументах вычисляются в вызове функции (6.5.2.2).

blockquote>

3.4.4, неуказанное поведение

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

ПРИМЕР Пример неуказанного поведения - это порядок, в котором оцениваются аргументы функции.

blockquote>

Неисправное поведение НЕ является проблемой. Рассмотрим этот пример:

printf("%d %d\n", ++x, y++);

Это также имеет неуказанное поведение , потому что порядок оценки ++x и y++ не указан. Но это совершенно законное и достоверное утверждение. В этом утверждении есть неопределенное поведение no undefined. Поскольку модификации (++x и y++) выполняются с различными объектами.

Что делает следующий оператор

printf("%d %d\n", ++i, i++);

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


] Еще одна деталь заключается в том, что запятая , участвующая в вызове printf (), является разделителем , а не оператором запятой .

Это важное различие, потому что -коммутатор вводит точку последовательности между оценкой их операндов, что делает следующий законным:

int i = 5;
int j;

j = (++i, i++);  // No undefined behaviour here because the comma operator 
                 // introduces a sequence point between '++i' and 'i++'

printf("i=%d j=%d\n",i, j); // prints: i=7 j=6

Оператор запятой оценивает свои операнды слева направо и дает только значение последнего операнда. Таким образом, в j = (++i, i++); приращения ++i i до 6 и i++ дают старое значение i (6), которое назначено на j. Затем i становится 7 из-за пост-приращения.

Итак, если запятая в вызове функции должна была быть оператором запятой, то

printf("%d %d\n", ++i, i++);

не будет проблемой. Но он вызывает неопределенное поведение , потому что запятая здесь является разделителем .


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

Это сообщение: Неопределенное, неопределенное и определенное по реализации поведение также актуально.

26
задан Gray 3 October 2013 в 18:29
поделиться

4 ответа

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

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

2
ответ дан carpenterjc 28 August 2018 в 18:13
поделиться

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

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

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

6
ответ дан Gray 28 August 2018 в 18:13
поделиться

Вы могли бы взглянуть на многие инструменты обфускации, которые есть там, например те, которые упомянуты в https://stackoverflow.com/questions/805549/free-obfuscation-tools-for-net (обратите внимание: вопрос недоступен для просмотра).

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

http://gapotchenko.com/eazfuscator.net http://codefort.org/download http://orangeheap.blogspot.nl http://confuser.codeplex.com (сменил https://yck1509.github.io/ConfuserEx/ ) http://ntoolbox.com

24
ответ дан Sebastiaan van den Broek 28 August 2018 в 18:13
поделиться

Есть Dotfuscator ( http://www.preemptive.com/products/dotfuscator/overview ). Но лучшим решением в некоторых случаях является предложение того, что вы делаете в качестве веб-сайта (Программное обеспечение как услуга).

Рассмотрим этот инструмент, например, для преобразования VB в C #: http: // converter .telerik.com /

Или этот инструмент для форматирования JSON: http://jsonformatter.curiousconcept.com/

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

2
ответ дан Trevor Elliott 28 August 2018 в 18:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: