Как скрыть литералы в коде - PullRequest
5 голосов
/ 29 сентября 2011

Каковы основные существующие подходы, позволяющие скрыть значение литералов в коде, чтобы их было нелегко отследить с помощью просто hexdumper или декомпилятора?

Например, вместо того, чтобы кодировать это:

    static final int MY_VALUE = 100;

Мы могли бы иметь:

    static final int MY_VALUE = myFunction1();

    private int myFunction1(){
        int i = 23;
        i += 8 << 4;
        for(int j = 0; j < 3; j++){
            i-= (j<<1);
        }
        return myFunction2(i);
    }

    private int myFunction2(int i){
        return i + 19;
    }

Это был просто пример того, что мы пытаемся сделать. (Да, я знаю, компилятор может оптимизировать его и предварительно рассчитать константу).

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

Ответы [ 3 ]

3 голосов
/ 05 октября 2011

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

Подробные инструкции:

  1. Посетите ROT47.com и закодируйте свой текст в Интернете.Вы также можете использовать этот веб-сайт для более общей кодировки ROTn.
  2. Заменить содержимое ваших строковых констант закодированным текстом.
  3. Используйте декодер в своем коде дляпреобразовать текст обратно в исходную форму, когда вам это нужно. Статья в Википедии ROT13 содержит некоторые заметки о реализации, а вот Реализация ROTn в Javascript в StackOverflow.Его легко адаптировать к любому используемому языку.

Зачем использовать ROT47, который известен своим слабым шифрованием?

В конце ваш код будет выглядеть примерно так:

decryptedData = decryptStr (MY_ENCRYPTED_CONSTANT)
useDecrypted (decryptedData)

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

  1. Вы можете кодировать свой текст онлайн, не нужно писать специализированную программу для кодирования вашего текста.
  2. Расшифровка очень простареализовать, чтобы вы не тратили время на то, что не приносит никакой пользы вашим клиентам.
  3. Любой, кто читает ваш код (ваш коллега или вы через 5 лет), сразу же поймет, что это не настоящая защита, но безопасность за неясностью.
  4. Ваш текст все равно будет казаться бессмысленным для любого, кто просто попытается проникнуть внутрь вашей скомпилированной программы, поэтому миссия выполнена.
3 голосов
/ 08 октября 2011

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

Если ваша программа действительно должна делать что-то полезное, вы можете получитьжелаемые ветви планируются заблаговременно и выбирают подходящие биты вектора состояния («Я хочу получить значение true, бит 17 включен, поэтому сделайте так, чтобы условие ..»)

0 голосов
/ 29 сентября 2011

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

...