Безопасное встраивание строки в C-код (Безопасная строка, Безопасный символ *)

0

У меня есть dll (ansi c), который имеет некоторые строковые литералы.

__declspec(dllexport) char* GetSomeString()
{
    return "This is a test string from TestLib.dll";
}

При компиляции эта строка все еще отображается в "блокноте", например. Я новичок в C, поэтому мне было интересно, есть ли способ безопасно хранить строковые литералы?

Должен ли я сделать это с помощью файла resx (например), который имеет некоторые зашифрованные значения или что будет лучшим способом?

благодаря


EDIT 1: сценарий в основном следующий в псевдокоде: if (hostname) return hostname else return "Literal String" ';

Это "буквальная строка", которую я хотел бы каким-то образом "зафиксировать".

  • 1
    Вы можете использовать (просто обратимый) алгоритм шифрования и использовать в своем коде только зашифрованные значения, которые вы можете расшифровать во время выполнения. Остерегайтесь штрафа за время выполнения, хотя.
  • 1
    Использование (зашифрованного) файла ресурсов - это один из способов, но он также добавляет накладные расходы на расшифровку и связь с библиотекой времени выполнения, которая обрабатывает управление файлами ресурсов (если вы не развернули свое собственное).
Показать ещё 6 комментариев
Теги:
dll

3 ответа

4
Лучший ответ

Не ставьте свои секреты на компьютер, если вы хотите, чтобы они оставались в секрете.

См. Мой ответ, Закон № 1 о лицензировании программного обеспечения

И Эрик Липперт аналогичный ответ

  • 0
    «Если вы хотите сохранить контроль над своим кодом, вам нужно сделать его веб-службой и предоставить конечному пользователю лишь тонкий клиент, который взаимодействует с этим веб-службой». Я очень хорошо это понимаю и знаю, что это Слабость. Тем не менее, мы относительно хорошо контролируем ПК, на которых будем его развертывать, поэтому время от времени легко менять реализацию. Программное обеспечение будет полезно только для этих доменных машин.
  • 2
    @ Yves: если вы управляете ПК, вы можете заменить веб-сервис системным сервисом. Вам просто нужны данные вне той части кода, которая выполняется в собственном профиле пользователя.
Показать ещё 1 комментарий
4

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

При этом, если ваша забота просто "не оставляет важных строк в плену", вы можете просто запустить исполняемый пакер/шифр по всей вашей DLL. Это так же просто, как добавить шаг после сборки в ваше решение, упаковщик сжимает/шифрует весь исполняемый образ и создает исполняемый файл, который при запуске расшифровывает и запускает его в памяти.

Этот метод имеет большое преимущество, не требуя каких-либо изменений в вашем коде: вы просто запускаете upx поверх скомпилированной dll, и вы получаете сжатую dll, не нужны XOR или странные литералы, распространяемые по вашему коду.

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


  1. В целом ответ "исполняемый" должен быть рассчитан на широкий смысл, т.е. Также включены dll.
  • 0
    Такие упаковщики не находятся в свободном доступе, нет, или я ошибаюсь? Затем упаковщик действует (или создает) как своего рода упаковщик, я полагаю? Спасибо за информацию, и я знаю, что нехорошо хранить такие «секреты» в приложении, поэтому я не буду использовать его для… Просто казалось неаккуратным раздавать эти вещи - даже если они не "секреты".
  • 1
    @YvesSchelpe: UPX отличный упаковщик и бесплатен, но он ничего не шифрует, он просто сжимает (не то чтобы он сильно что-то меняет); Следует отметить, что UPX особенно легко распаковать, когда вы заметили, что exe или dll сжаты UPX, вы можете просто зайти на сайт UPX, взять упаковщик и выполнить upx -d yourlibrary.dll .
Показать ещё 2 комментария
1

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

  • 0
    это начало ... в принципе, оно не должно быть супер-безопасным ... Просто казалось слишком очевидным, чтобы он был таким открытым и широким, так что спасибо за предложение!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню