R grepl найти строку со значением / строкой [дубликат]

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

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

Крайняя легкость, с которой файлы Java .class могут быть восстановлены в источниках Java, которые очень напоминают оригиналы, имеет много, чтобы сделать с Java байт-кода целей дизайна и компромиссов. Помимо всего прочего, байт-код Java был разработан для компактности, независимости платформы, мобильности сети и простоты анализа с помощью интерпретаторов байтового кода и динамических компиляторов JIT (точно в срок) / HotSpot. Возможно, скомпилированные файлы .class выражают намерение программиста настолько четко, что их легче анализировать, чем исходный исходный код.

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

К сожалению, оба подхода должны фактически изменить код, который запускает JVM, и многие пользователи боятся (по праву), что это преобразование может добавить новое ошибок в их приложениях. Кроме того, метод и переименование полей могут вызвать обратные вызовы, чтобы перестать работать. Изменение имен реальных классов и пакетов может привести к поломке нескольких других Java-API (JNDI (интерфейс именования и интерфейса Java), поставщиков URL-адресов и т. Д.). В дополнение к измененным именам, если связь между смещениями байтового кода класса и номерами исходных строк изменена, восстановление исходных трасс стека исключений может стать затруднительным.

Тогда есть возможность обфускации исходного источника Java код. Но в корне это вызывает аналогичный набор проблем. Шифрование, а не обфускация?

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

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

42
задан Rich Scriven 8 March 2016 в 21:01
поделиться

1 ответ

Для точного соответствия наиболее целесообразно использовать ==. Кроме того, это будет быстрее, чем grep(), и, очевидно, намного проще.

which(string == "apple")
# [1] 1
21
ответ дан Rich Scriven 16 August 2018 в 01:37
поделиться
  • 1
    paste0("^",pat,"$") сохраняет несколько символов ввода над paste. Нет необходимости в sep="" – Ben 23 October 2015 в 05:28
Другие вопросы по тегам:

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