【发布时间】:2011-10-19 12:55:15
【问题描述】:
我想在编译时加密/编码一个字符串,这样原始字符串就不会出现在编译的可执行文件中。
我见过几个例子,但它们不能将字符串文字作为参数。请参阅以下示例:
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");
但它限制了字符串的大小。
有什么方法可以实现我想要的吗?
【问题讨论】:
-
解决此类问题的常用方法是编写一个脚本,将源文件作为输入并创建一个修改后的文件作为输出,然后由构建过程使用。在这种情况下,脚本将查找
EncryptString<"String to encrypt">并将字符串替换为加密/编码版本。 -
重复:How to hide a string in binary code?(虽然没有关闭,经过 10 年的积极工作)。
-
我有用于 XOR 混淆的 C++ 代码,不需要预处理,只需用户定义的文字,如 an answer to How to encrypt strings at compile time?。它可能无需太多工作就可以适应其他简单的密码,例如 Vigenère。正如评论所说,我们可能需要降低编译器的优化级别。
标签: c++ string templates metaprogramming compile-time