Сведения о вопросе

FELL

02:37, 1st August, 2020

Теги

java   obfuscation    

Вы запутали свой коммерческий код Java?

Просмотров: 590   Ответов: 7

Интересно, использует ли кто-нибудь коммерческие/бесплатные java обфускаторы на своем собственном коммерческом продукте. Я знаю только об одном проекте, который на самом деле имел запутывающий шаг в шаге сборки ant для релизов.

Вы что-то путаете? И если это так, то почему вы все путаете?

Действительно ли это способ защитить код или это просто лучшее чувство для developers/managers?

edit: хорошо, я буду точен в своей точке зрения: вы запутываете, чтобы защитить свой IP (ваши алгоритмы, работу, которую вы вложили в свой продукт)? Я не буду запутывать по соображениям безопасности, это не кажется правильным. Поэтому я говорю только о защите вашего кода приложений от конкурентов.

@staffan имеет хороший смысл:

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



  Сведения об ответе

SILA

17:16, 11th August, 2020

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

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


  Сведения об ответе

DAAA

03:16, 14th August, 2020

Я думаю, что старый (классический) способ обфускации постепенно теряет свою актуальность. Потому что в большинстве случаев классические обфускаторы ломают стек 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 обфускатор.


  Сведения об ответе

PAGE

02:59, 6th August, 2020

Я использую 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).


  Сведения об ответе

padenie

18:39, 19th August, 2020

Я использую ProGuard и очень рекомендую его. Хотя обфускация действительно защищает ваш код от случайных злоумышленников, ее главным преимуществом является минимизация эффекта удаления неиспользуемых классов и методов и сокращение всех идентификаторов до 1 или 2 символов.


  Сведения об ответе

baggs

03:58, 1st August, 2020

В этом году я провел некоторое время, пробуя различные обфускаторы 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 поддерживает их =)


  Сведения об ответе

VCe znayu

21:06, 1st October, 2020

Я думаю, что по большей части обфускация бессмысленна: даже при полном исходном коде обычно достаточно трудно понять, что это было за чертово намерение (предполагая, что нет никаких комментариев и никаких значимых имен для локальных переменных-что имеет место при повторной генерации источников из байтового кода). Обфускация просто украшает торт.

Я думаю, что разработчики и особенно их менеджеры склонны сильно преувеличивать риск того, что кто-то увидит исходный код. Хотя хорошие декомпиляторы могут создавать красивый исходный код, работать с ним нетривиально, а связанные с этим затраты (не говоря уже о юридических рисках) достаточно высоки, чтобы этот подход редко был полезен. Я декомпилировал только для отладки проблем с продуктами поставщиков с закрытым исходным кодом (тупики в DB абстрактном слое, тьфу). Байт-код был фактически запутан, я думаю, но мы тем не менее нашли основную проблему-это была реальная проблема дизайна.


  Сведения об ответе

repe

07:12, 5th August, 2020

Я думаю, что это действительно сводится к тому, для чего предназначен ваш код Java, как он распространяется и кто ваши клиенты. Мы ничего не путаем, так как никогда не находили ничего особенно хорошего, и это, как правило, доставляет больше хлопот, чем стоит. Если у кого-то есть доступ к нашим файлам JAR и есть знания, чтобы иметь возможность обнюхивать их, то есть гораздо более тревожные вещи, которые они могут сделать, чем сорвать наш исходный код.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться