Как я могу запутать строку в двоичном C ++? - PullRequest
4 голосов
/ 27 ноября 2011

Если у меня есть код C ++, содержащий строки, которые могут быть паролем или чем-то еще, как лучше всего их запутать, чтобы очень затруднить обратный инжиниринг? Я нашел некоторые инструменты в Интернете, но все они не с открытым исходным кодом.

Ответы [ 3 ]

7 голосов
/ 27 ноября 2011

Допустим, ваше приложение использует веб-сервис "www.example.com" и аутентифицируется с паролем "letmein". Скомпилируйте программу и проверьте ее с помощью strings, objdump или чего-либо еще:

$ make
$ objdump -j .rodota -s program
a.out:     file format elf64-x86-64

Contents of section .rodata:
 4005f8 01000200 7777772e 6578616d 706c652e  ....www.example.
 400608 636f6d00 6c65746d 65696e00           com.letmein.  

$ strings program
/lib64/ld-linux-x86-64.so.2
__gmon_start__
...
www.example.com
letmein

Это довольно легко. Если вы запутываете его, вам все равно нужно поместить обычный текст в память, прежде чем вы сможете его использовать, поэтому взломщик выполняет одно из следующих действий:

  • Перехватывает сетевые пакеты (легко, занимает 5 минут с базовыми знаниями Wireshark)
  • Использует отладчик (легко, занимает 10 минут с базовыми знаниями GDB)
  • Обратный инжиниринг вашего исходного кода (трудно, занимает несколько часов или дней)

Обратите внимание, что инструменты запутывания усложняют работу только тем злоумышленникам, которые уже делают это сложным путем. Какой в ​​этом смысл? Все, что вы сделали, - это взяли 15 минут, а не 5 минут, чтобы злоумышленник получил пароль от вашего исполняемого файла. Поскольку это в значительной степени лучшее, что вы можете сделать, не усердно работайте над этим. Просто сделайте XOR пароль с простым рисунком и надейтесь, что злоумышленники очень ленивы или глупы.

C-3PO: Мастер Люк, сэр. Извините за вопрос, но что делать R2 и мне, если нас здесь обнаружат?
Люк: Закрой дверь.
Хан Соло: И надеюсь, что у них нет бластеров.
C-3PO: Это не очень обнадеживает.

(Возможно, вы потратите на это больше времени, чем ваш злоумышленник.)

С другой стороны: Если вы пытаетесь запретить пользователям без полномочий root доступ к паролю в доверенной системе, вы можете сделать это с разрешениями и двоичными файлами setuid.

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

7 голосов
/ 27 ноября 2011

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

Не доверяйте никаким методам запутывания, поэтому не используйте их.

В системах Linux и POSIX, распространенныхПрактика состоит в том, чтобы иметь встроенный по умолчанию путь к файлам конфигурации (и способ установить этот файл конфигурации через аргументы программы).Затем файлы конфигурации используют системные разрешения, чтобы скрыть конфиденциальные пароли.Поскольку файл конфигурации имеет встроенную настройку по умолчанию (обычно в /etc или $HOME), вы можете запустить программу без каких-либо аргументов для общего случая.

Обратите внимание, что многие программы защищены, даже если их исходный коднаходится в свободном доступе (хороший пример ssh).

Читать о доверенная вычислительная база

3 голосов
/ 27 ноября 2011

Насколько он должен быть защищен?

Если вы просто хотите скрыть пароль (безопасность дневника маленькой сестры), вы можете просто XOR его с некоторыми случайными данными.Решительный злоумышленник может провести обратный инжиниринг кода и обнаружить это, но он может сделать это, как бы сложно ни было ваше решение

...