Могу ли я ограничить декомпиляцию приложения Android? [Дубликат]

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

Для примера:

  SET FILE1 = foo.txt  SET FILE2 = bar.txt FOR / F %% i IN ('DIR / B / O: D% FILE1%% FILE2%') DO SET NEWEST = %% i ECHO% NEWEST% (возможно) новее.   

Это, к сожалению, не соответствует тем, что метки дат совпадают. Поэтому нам просто нужно проверить, имеют ли файлы первую и последнюю дату:

  SET FILE1 = foo.txt SET FILE2 = bar.txt FOR %% i IN (% FILE1%)  DO SET DATE1 = %% ~ ti FOR %% i IN (% FILE2%) DO SET DATE2 = %% ~ ti IF "% DATE1%" == "% DATE2%" ECHO Файлы имеют одинаковый возраст и amp; & amp; & amp;  GOTO END FOR / F %% i IN ('DIR / B / O: D% FILE1%% FILE2%') DO SET NEWEST = %% i ECHO Новый файл% NEWEST%: END  
82
задан Peter Mortensen 27 November 2011 в 11:53
поделиться

7 ответов

Взгляните на статью JavaWorld . Разбивка шифрования байтового кода Java Владимира Рубцова. Это объясняет, почему шифрование файлов классов в основном бессмысленно.

85
ответ дан Peter Mortensen 16 August 2018 в 05:33
поделиться
  • 1
    :) Мне понравилась твоя идея. – jatanp 8 September 2008 в 11:00
  • 2
    Я использовал эту технику раньше, и она отлично работает. Однако с точки зрения атаки первым подходом было бы просто изменить код, который выполняет проверку лицензии и удалить его. Есть вещи, которые вы можете сделать, чтобы сделать этот вектор атаки более сложным, но если вы дадите атакующему управление аппаратным обеспечением, вы обречены на провал с подходящим мотивированным и квалифицированным злоумышленником. На практике цель состоит в том, чтобы держать в основном честных людей, честных. – Jim Rush 24 June 2010 в 13:04
  • 3
    +1 для ссылки на Excelsior JET :). – Radu Murzea 21 February 2012 в 16:34
  • 4
    +1 для «Замки для животных». Думаю, подходящим термином здесь были бы сценаристы-детишки. – Antimony 1 April 2013 в 03:11
  • 5
    Вы имеете в виду GCJ, и он мертв. – user207421 29 May 2016 в 00:54
  • 6
    Комбинированное шифрование файлов jar также не работает. Вместо этого используйте JarProtector . – J.Profi 21 July 2017 в 14:58

Если вы ищете решение для лицензирования, вы можете проверить API TrueLicense . Он основан на использовании асимметричных клавиш. Однако это не означает, что ваше приложение не может быть взломан. Каждое приложение может быть исправлено с достаточным усилием. Что действительно важно, поскольку Стю ответил , выяснив, насколько необходима сильная защита.

3
ответ дан Community 16 August 2018 в 05:33
поделиться

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

Что делать с этим?

Попытайтесь не отправлять ключ в виде жестко запрограммированной константы в своем code: Храните его как настройку для каждого пользователя. Заставьте пользователя отвечать за этот ключ.

11
ответ дан Daren Thomas 16 August 2018 в 05:33
поделиться

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

17
ответ дан Erlend Halvorsen 16 August 2018 в 05:33
поделиться

@jatanp: или еще лучше, они могут декомпилировать, удалить код лицензирования и перекомпилировать. С Java я действительно не думаю, что есть правильное, надежное решение этой проблемы. Даже злой маленький ключ может помешать этому с помощью Java.

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

Итак, я должен спросить, действительно ли вы действительно нуждаетесь в усиленной защите, например, ищете свою заявку? Как выглядит ваша клиентская база? (Корпорации? Или подростковые массы геймеров, где это будет больше проблемой?)

6
ответ дан marcospereira 16 August 2018 в 05:33
поделиться
  • 1
    На самом деле, есть правильное, взломанное решение, которое btw выглядит как ключ: excelsior-usa.com/blog/excelsior-jet/… – Dmitry Leskov 23 May 2011 в 11:27
  • 2
    @DmitryLeskov 'hack resistant', может быть. Но это всего лишь скорость для всех, кто хочет в коде. В конце дня байт-код должен запускаться на платформе хоста незашифрованной. Полная остановка. – Stu Thompson 8 August 2013 в 16:14
  • 3
    Вы не читали сообщение, с которым я связался. Байт-код преобразован в код процессора ключа и зашифрован. Когда конечный пользователь запускает защищенное приложение, этот зашифрованный код переносится в «ключ». Dongle расшифровывает и запускает его на своем CPU. – Dmitry Leskov 10 August 2013 в 08:47
  • 4
    Корпоративные подростковые геймеры. – odiszapc 14 March 2015 в 17:29

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 выполняет мой исходный байт-код, и все же нет ничего, чтобы декомпилировать или реконструировать, не так ли? »

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

0
ответ дан S Harish Morampudi 16 August 2018 в 05:33
поделиться

Вы можете использовать шифрование байтового кода без страха.

Дело в том, что цитируемый выше документ «Cracking Java byte-code encryption» содержит логическую ошибку. Основная претензия к статье перед запуском всех классов должна быть расшифрована и передана методу ClassLoader.defineClass(...) . Но это не так.

Предполагаемое здесь недопустимое значение - при условии, что они работают в аутентичной или стандартной среде java run-time . Ничто не может заставить защищенное Java-приложение не только запускать эти классы, но даже расшифровывать и передавать их на ClassLoader. Другими словами, если вы находитесь в стандартной JRE, вы не можете перехватить метод defineClass(...), потому что стандартная java не имеет API для этой цели, и если вы используете модифицированную JRE с исправленным ClassLoader или любым другим «хакерским трюком», вы можете 't делать это, потому что защищенное приложение Java не будет работать вообще, и поэтому вам нечего перехватывать. И совершенно неважно, какой «патч-искатель» используется или какой трюк используется хакерами. Эти технические детали - совсем другая история.

1
ответ дан ThiefMaster 16 August 2018 в 05:33
поделиться
  • 1
    Как именно вы собираетесь обнаруживать исправленную JVM? В любом случае, все это делает вещи немного сложнее. – Antimony 1 April 2013 в 03:14
  • 2
    Не можете ли вы просто найти вызов defineClass () в панели запуска приложений? Когда вы делаете этот вызов, вы все равно должны передавать массив дешифрованных байтов. Разве это еще не значит, что исходный источник может просочиться? – Ascendant 10 July 2013 в 02:14
  • 3
    Я не согласен с этим ответом. Для меня это звучит так: «Вопрос: какой самый простой способ найти Пи? Ответ: Возьмите 2 * Pi и разделите на два. & Quot; Я не согласен с этой идеей, но вы могли бы включить более подробную информацию? Например, вы ожидаете, что основная программа будет записана в чистой java? Включает ли этот код код, который ищет изменения? – Patrick M 29 March 2014 в 08:29
Другие вопросы по тегам:

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