Есть несколько коммерческих обфускаторов , которые выполняют это. По сути, они переписывают все символы на ходу. Примерно так:
void foo()
становится
void EEhj_y33() // usually much, much longer and clobbered
Имена переменных также обрабатываются так же, как и члены структур / союзов (в зависимости от того, какой уровень запутанности вы установили).
Большинство из них работают, сканируя вашу кодовую базу, создавая словарь, затем подставляя искаженные путаницы именам символов в выводе, который затем может быть скомпилирован как обычно.
Я не рекомендую использовать их, но они доступны. Простое запутывание значимых имен символов не остановит кого-то, кто полон решимости узнать, как работает ваша библиотека / программа. Кроме того, вы не сможете ничего делать с кем-то, кто отслеживает системные вызовы. Действительно, какой смысл? Некоторые утверждают, что это помогает держать «случайного наблюдателя» в страхе, я утверждаю, что кто-то, работающий с ltrace
strace
и strings
, обычно не случайен.
Если вы не имеете в виду строковые литералы , а не символов ? С ними ничего не поделаешь, если только вы не храните литералы в зашифрованном формате, который вы должны расшифровать перед использованием. Это не просто отходы, а вопиющие отходы, которые не приносят никакой пользы.