У меня есть 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 должен декодировать этот литерал в памяти, любой атакующий, достаточно определимый, сможет сделать то же самое; часто это так же просто, как замораживание процесса после запуска (или после того, как ему нужно использовать нужную строку), создавая дамп памяти и используя для этого утилиты, такие как string
. Существуют способы смягчения проблемы (например, обнуление памяти, используемой конфиденциальной строкой, сразу после ее использования), но поскольку ваш код находится на машине, где потенциальный злоумышленник обладает всеми привилегиями, вы можете только поставить контрольно-пропускные пункты: в конце исполняемый файл полностью находится в руках злоумышленника.
При этом, если ваша забота просто "не оставляет важных строк в плену", вы можете просто запустить исполняемый пакер/шифр по всей вашей DLL. Это так же просто, как добавить шаг после сборки в ваше решение, упаковщик сжимает/шифрует весь исполняемый образ и создает исполняемый файл, который при запуске расшифровывает и запускает его в памяти.
Этот метод имеет большое преимущество, не требуя каких-либо изменений в вашем коде: вы просто запускаете upx
поверх скомпилированной dll, и вы получаете сжатую dll, не нужны XOR или странные литералы, распространяемые по вашему коду.
Конечно, это довольно слабая безопасность (в основном это будет просто защищать от отслеживания в исполняемом файле с помощью блокнота или шестнадцатеричного редактора), но опять же, хранение критических "секретов" в исполняемом файле, который будет распространяться, является плохой идеей в первое место.
upx -d yourlibrary.dll
.
Вероятно, вы хотите хранить жестко закодированные пароли в библиотеке, верно? Вы можете XOR строку с некоторым значением и сохранить ее, а затем прочитать ее и XOR снова. Это самый простой способ, но он не защищает вашу строку от любого вида разборки/обратного проектирования.