2

I'd like to obscure strings at compile time. I know it can be done in other preprocessors but I haven't found a way to do this with the C preprocessor.

Brian Tompsett - 汤莱恩
  • 5,753
  • 72
  • 57
  • 129
Tilka
  • 216
  • 2
  • 6

4 Answers4

2

Well, you can do it, but it's ugly.

#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;
}

Compiled with optimizations in VS2005, the string is stored in the executable as "hELLO\x0C\0wORLD\x01". Now, obviously, xor with 0x20 isn't a good function to hide your string. And, of course, you'd have to #define a macro for each string length.

Obviously, this isn't the best solution. C++ template metaprogramming would be a better fit. You could also write all of your strings in a separate machine readable file, and write a separate program that parses that, obscures the strings in whatever way you see fit and outputs it all into .h/.c. Both of those are better solutions than this.

Geerad
  • 374
  • 2
  • 5
1

No, the C pre-processor cannot process strings character by character.

Did you have identifiers or strings in mind, anyway? You can do a lot with identifiers with fixed mappings (that is, if you know name1 appears, you can provide a fixed mapping to xq23), but you cannot algorithmically find identifiers and then create a mapping for them.

Jonathan Leffler
  • 730,956
  • 141
  • 904
  • 1,278
0

No, the C preprocessor does not have the capability to index strings as you suggest.

Out of curiosity, what other preprocessors have you used that can do this?

Greg Hewgill
  • 951,095
  • 183
  • 1,149
  • 1,285
0

No, I can't think of any way of doing it with the preprocessor.

This related question might help you though: How to hide a string in binary code?

Community
  • 1
  • 1
John Carter
  • 53,924
  • 26
  • 111
  • 144