Home > Enterprise >  Hiding strings from strings tool in c language
Hiding strings from strings tool in c language

Time:01-02

The goal is to declare char arrays that are not show when using a tool like strings

The approaches

#include <stdio.h>

// method 1 
#define PRIVATE __attribute__((visibility("hidden")))
#define PUBLIC __attribute__((visibility("default")))

PUBLIC char visible_msg[] = "can you see me";
PRIVATE char not_visible[] = "this is hidden ";

// method 2
static char secret[] = "1337h4x";

int main()
{
    printf("%s\n", secret);
    printf("%s\n", visible_msg);
    printf("%s\n", not_visible);
}

method 2 work fine on linux but on windows this is useless code and I get the warning visibility attribute not supported in this configuration; ignored [-Wattributes] and i tried to use -visibility=hidden but this does not have an effect and i can still dump the strings

I am compiling using MINGW64 in msys2

CodePudding user response:

The approaches

Neither of these approaches can work reliably -- the compiler will still put a string literal into the read-only section of the binary (at least for sufficiently long strings).

Here is an approach which hides the string from strings:

#include <stdio.h>

int main()
{
  char letters[] = "abcdefghijklmnopqrstuvwxyz";

  // "this is hidden " in ASCII
  // 74 68 69 73 20 69 73 20 68 69 64 64 65 6e 20
  int offsets[] = { 0x74 - 'a', 0x68 - 'a', 0x69 - 'a', 0x73 - 'a',
                    0x20 - 'a', 0x69 - 'a', 0x73 - 'a', 0x20 - 'a',
                    0x68 - 'a', 0x69 - 'a', 0x64 - 'a', 0x64 - 'a',
                    0x65 - 'a', 0x6e - 'a', 0x20 - 'a'
  };

  for (int j = 0; j < sizeof(offsets) / sizeof(offsets[0]); j  ) {
    const int offset = offsets[j];
    if (offset < 0)
      putc(' ', stdout);
    else
      putc(letters[offset], stdout);
  }
  puts("");
  return 0;
}

You can re-order letters[] and/or remove unused letters to make it even more obscure.

  • Related