Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
898
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
951
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
941
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1725
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6087
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4398
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Вы запутали свой коммерческий код Java?
Интересно, использует ли кто-нибудь коммерческие/бесплатные java обфускаторы на своем собственном коммерческом продукте. Я знаю только об одном проекте, который на самом деле имел запутывающий шаг в шаге сборки ant для релизов.
Вы что-то путаете? И если это так, то почему вы все путаете?
Действительно ли это способ защитить код или это просто лучшее чувство для developers/managers?
edit: хорошо, я буду точен в своей точке зрения: вы запутываете, чтобы защитить свой IP (ваши алгоритмы, работу, которую вы вложили в свой продукт)? Я не буду запутывать по соображениям безопасности, это не кажется правильным. Поэтому я говорю только о защите вашего кода приложений от конкурентов.
@staffan имеет хороший смысл:
Причина, по которой следует держаться подальше от цепного потока кода, заключается в том, что некоторые из этих изменений делают невозможной эффективную оптимизацию кода для JVM. Фактически это приведет к снижению производительности вашего приложения.
Если вы делаете обфускацию, держитесь подальше от обфускаторов, которые изменяют код, изменяя поток кода и/или добавляя блоки исключений и тому подобное, чтобы затруднить его разборку. Чтобы сделать код нечитаемым, обычно достаточно просто изменить все имена методов, полей и классов.
Причина держаться подальше от изменения потока кода заключается в том, что некоторые из этих изменений делают невозможным для JVM эффективную оптимизацию кода. Фактически это приведет к снижению производительности вашего приложения.
Я думаю, что старый (классический) способ обфускации постепенно теряет свою актуальность. Потому что в большинстве случаев классические обфускаторы ломают стек trace (это не очень хорошо для поддержки ваших клиентов)
В наше время главное не защищать какие-то алгоритмы, а защитить конфиденциальные данные: API logins/passwords/keys, код которого отвечает за лицензирование (пиратство все еще здесь, особенно в Западной Европе, России, Азии, IMHO), рекламный аккаунт IDs и т.д.
Интересный факт: у нас есть все эти конфиденциальные данные в строках. На самом деле Strings-это примерно 50-80% логики наших приложений. Мне кажется, что будущее обфускации-это "String encryption tools".
Но теперь функция "String encryption" доступна только в коммерческих обфускаторах , таких как: Allatori , Zelix KlassMaster , Smokescreen , Stringer Java Obfuscation Toolkit, DashO .
N.B. Я CEO на пользователя LLC. Разработчик стрингера Java обфускатор.
Я использую proguard для разработки JavaME. Это не только очень хорошо делает файлы jar меньше (важно для мобильных устройств), но и полезно как более приятный способ выполнения кода для конкретного устройства, не прибегая к IDE-недружественным инструментам предварительной обработки, таким как антенна.
E.g.
public void doSomething()
{
/* Generated config class containing static finals: */
if (Configuration.ISMOTOROLA)
{
System.out.println("This is a motorola phone");
}
else
{
System.out.println("This is not a motorola phone");
}
}
Это компилируется, запутывается, и файл класса заканчивается так, как будто вы написали:
public void doSomething()
{
System.out.println("This is a motorola phone");
}
Таким образом, вы можете иметь варианты кода, чтобы обойти ошибки производителя в реализациях JVM/library, не заполняя конечные исполняемые файлы класса.
Я считаю, что некоторые коммерческие обфускаторы также могут объединять файлы классов вместе в определенных случаях. Это полезно, потому что чем больше классов у вас есть, тем больше размер накладных расходов в файле zip (jar).
Я использую ProGuard и очень рекомендую его. Хотя обфускация действительно защищает ваш код от случайных злоумышленников, ее главным преимуществом является минимизация эффекта удаления неиспользуемых классов и методов и сокращение всех идентификаторов до 1 или 2 символов.
В этом году я провел некоторое время, пробуя различные обфускаторы Java, и обнаружил, что один из них находится на много миль впереди rest: JBCO . К сожалению, он немного громоздок в настройке и не имеет GUI, но с точки зрения уровня запутанности, который он производит, он не имеет себе равных. Вы пытаетесь подать ему простой цикл, и если ваш декомпилятор не сломается при попытке загрузить его, вы увидите что-то вроде этого:
if(i < ll1) goto _L6; else goto _L5
_L5:
char ac[] = run(stop(lI1l));
l7 = (long)ac.length << 32 & 0xffffffff00000000L ^ l7 & 0xffffffffL;
if((int)((l7 & 0xffffffff00000000L) >> 32) != $5$)
{
l = (long)III << 50 & 0x4000000000000L ^ l & 0xfffbffffffffffffL;
} else
{
for(l3 = (long)III & 0xffffffffL ^ l3 & 0xffffffff00000000L; (int)(l3 & 0xffffffffL) < ll1; l3 = (long)(S$$ + (int)(l3 & 0xffffffffL)) ^ l3 & 0xffffffff00000000L)
{
for(int j = III; j < ll1; j++)
{
l2 = (long)actionevent[j][(int)(l3 & 0xffffffffL)] & 65535L ^ l2 & 0xffffffffffff0000L;
l6 = (long)(j << -351) & 0xffffffffL ^ l6 & 0xffffffff00000000L;
l1 = (long)((int)(l6 & 0xffffffffL) + j) & 0xffffffffL ^ l1 & 0xffffffff00000000L;
l = (long)((int)(l1 & 0xffffffffL) + (int)(l3 & 0xffffffffL)) << 16 & 0xffffffff0000L ^ l & 0xffff00000000ffffL;
l = (long)ac[(int)((l & 0xffffffff0000L) >> 16)] & 65535L ^ l & 0xffffffffffff0000L;
if((char)(int)(l2 & 65535L) != (char)(int)(l & 65535L))
{
l = (long)III << 50 & 0x4000000000000L ^ l & 0xfffbffffffffffffL;
}
}
}
}
Вы не знали, что у Java был Гото? Ну, а JVM поддерживает их =)
Я думаю, что по большей части обфускация бессмысленна: даже при полном исходном коде обычно достаточно трудно понять, что это было за чертово намерение (предполагая, что нет никаких комментариев и никаких значимых имен для локальных переменных-что имеет место при повторной генерации источников из байтового кода). Обфускация просто украшает торт.
Я думаю, что разработчики и особенно их менеджеры склонны сильно преувеличивать риск того, что кто-то увидит исходный код. Хотя хорошие декомпиляторы могут создавать красивый исходный код, работать с ним нетривиально, а связанные с этим затраты (не говоря уже о юридических рисках) достаточно высоки, чтобы этот подход редко был полезен. Я декомпилировал только для отладки проблем с продуктами поставщиков с закрытым исходным кодом (тупики в DB абстрактном слое, тьфу). Байт-код был фактически запутан, я думаю, но мы тем не менее нашли основную проблему-это была реальная проблема дизайна.
Я думаю, что это действительно сводится к тому, для чего предназначен ваш код Java, как он распространяется и кто ваши клиенты. Мы ничего не путаем, так как никогда не находили ничего особенно хорошего, и это, как правило, доставляет больше хлопот, чем стоит. Если у кого-то есть доступ к нашим файлам JAR и есть знания, чтобы иметь возможность обнюхивать их, то есть гораздо более тревожные вещи, которые они могут сделать, чем сорвать наш исходный код.