2

我想在编译时隐藏字符串。我知道它可以在其他预处理器中完成,但我还没有找到使用C预处理器执行此操作的方法。

4

4 回答 4

2

好吧,你可以做到,但它很丑陋。

#define ENCODE_STRING_14(str) {\
            str[0] ^ 0x020,\
            str[1] ^ 0x020,\
            str[2] ^ 0x020,\
            str[3] ^ 0x020,\
            str[4] ^ 0x020,\
            str[5] ^ 0x020,\
            str[6] ^ 0x020,\
            str[7] ^ 0x020,\
            str[8] ^ 0x020,\
            str[9] ^ 0x020,\
            str[10] ^ 0x020,\
            str[11] ^ 0x020,\
            str[12] ^ 0x020,\
            '\0'\
            }

void Decode( char *str, int length )
{
    for( int i = 0; i < length - 1; ++i )
    {
        str[i] ^= 0x20;
    }
}

char hello[] = ENCODE_STRING_14("Hello, World!");

int main()
{
    printf("%s\n", hello);
    Decode( hello, 14 );
    printf("%s\n", hello);
    return 0;
}

在 VS2005 中经过优化编译后,该字符串以“hELLO\x0C\0wORLD\x01”的形式存储在可执行文件中。现在,显然,xor 与 0x20 不是隐藏字符串的好功能。而且,当然,您必须为每个字符串长度#define 一个宏。

显然,这不是最好的解决方案。C++ 模板元编程会更合适。您还可以将所有字符串写入单独的机器可读文件中,然后编写一个单独的程序来解析它,以您认为合适的任何方式隐藏字符串并将其全部输出到 .h/.c 中。这两个都是比这更好的解决方案。

于 2009-09-05T00:52:50.477 回答
1

不,C 预处理器不能逐个字符地处理字符串。

无论如何,您是否有标识符或字符串?您可以对具有固定映射的标识符做很多事情(也就是说,如果您知道出现 name1,则可以提供到 xq23 的固定映射),但是您无法通过算法找到标识符然后为它们创建映射。

于 2009-09-04T22:40:36.267 回答
0

不,C 预处理器没有您建议的索引字符串的能力。

出于好奇,您使用了哪些其他预处理器可以做到这一点?

于 2009-09-04T22:38:51.907 回答
0

不,我想不出任何使用预处理器的方法。

不过,这个相关问题可能会对您有所帮助:如何在二进制代码中隐藏字符串?

于 2009-09-04T22:42:44.393 回答