Шифрование / обфускация строкового литерала во время компиляции

Я хочу зашифровать / закодировать строку во время компиляции, чтобы исходная строка не появлялась в скомпилированном исполняемом файле.

Я видел несколько примеров, но они не могут принимать строковый литерал в качестве аргумента . См. Следующий пример:

template<char c> struct add_three {
    enum { value = c+3 };
};

template <char... Chars> struct EncryptCharsA {
    static const char value[sizeof...(Chars) + 1];
};

template<char... Chars>
char const EncryptCharsA<Chars...>::value[sizeof...(Chars) + 1] = {
    add_three<Chars>::value...
};

int main() {   
    std::cout << EncryptCharsA<'A','B','C'>::value << std::endl;
    // prints "DEF"
}

Я не хочу указывать каждый символ отдельно, как это делается. Моя цель - передать строковый литерал, как показано ниже:

EncryptString<"String to encrypt">::value

Также есть несколько примеров, подобных этому:

#define CRYPT8(str) { CRYPT8_(str "\0\0\0\0\0\0\0\0") }
#define CRYPT8_(str) (str)[0] + 1, (str)[1] + 2, (str)[2] + 3, (str)[3] + 4, (str)[4] + 5, (str)[5] + 6, (str)[6] + 7, (str)[7] + 8, '\0'

// calling it
const char str[] = CRYPT8("ntdll");

Но он ограничивает размер строки.

Есть ли способ добиться того, чего я хочу?

15
задан karliwson 29 November 2017 в 00:13
поделиться