Скрыть что-то вроде ключа или fourCC в скомпилированной программе

Прежде всего, я провел много исследований раньше, но я должен спросить кое-что, что может быть простым... или нет, но я предпочитаю спросить вас, чтобы быть уверенным...

У меня есть два вида ключей, один из которых создан мной, а другой - простой код FourCC. Тем не менее, довольно просто найти их в коде.exe, используя, например, HxD. Поэтому я хотел бы спрятать ключ в.exe, но не менять его, вот пример моего ключа:

BYTE * pbData = new BYTE[dwDataSize];
file.Read(pbData, dwDataSize);

CLZObject zObj;

static DWORD mykey[4] =
{
    000000,
    11111111,
    222222222,
    33333333
};

if (!CLZO::Instance().Decompress(zObj, pbData, mykey))
{
    delete[] pbData;
    return false;
}

Как вы можете видеть, я использую LZO, но все еще легко найти ключ, поскольку мы обычно знаем, где она находится...

Затем, вот FourCC (его легко найти, потому что нам просто нужно набрать букву, например: DXT1.

    case MAKEFOURCC('D','X','T','1'):
    strncpy_s(strPixelFormat, 512, "DXT1", 31);
    m_CompFormat = PF_DXT1;
    break;

Поэтому я подумал спрятать ключ с помощью памяти (у меня нет примера, но я мог бы его предоставить) или зашифровать ключ, чтобы скрыть его от программы, но я не знаю (или я не уверен) как зашифровать что-то подобное:

    000000,
    11111111,
    222222222,
    33333333

Спасибо хорошего дня!:)

1 ответ

Было бы хорошо, если бы вы сказали, почему хотите это скрыть. FourCC составляет 4 байта, поэтому его можно рассматривать как int. Вы можете переписать его или зашифровать другим способом. Но очевидно, что это не послужит серьезным противникам, так как ключ все равно будет в коде.

Не забывайте, что серьезные хакеры будут сканировать код и данные при запуске программы в дополнение к программе на диске.

РЕДАКТИРОВАТЬ:

Вот быстрый и грязный фрагмент кода, чтобы получить ваш четвертый текст. Вы примените то же самое во время выполнения, чтобы вернуться к исходному значению. Использование 0x55555555 удобно, поскольку печатаемые символы остаются печатаемыми, поэтому вы можете использовать выходную строку вместо числа:

int main( int argc, char* argv[] ) {
  char s[5];
  *(unsigned int*)s = *(unsigned int*)argv[1] ^ 0x55555555u;
  s[4] = '\0';
  printf("\"%s\"  ==>  \"%s\" (0x%08xu)\n", argv[1], s, *(unsigned int*)s);
  return 0;
}

$ ./a.exe xvid
"xvid"  ==>  "-#<1" (0x313c232du)
$ ./a.exe mpeg
"mpeg"  ==>  "8%02" (0x32302538u)
$ ./a.exe avc1
"avc1"  ==>  "4#6d" (0x64362334u)
Другие вопросы по тегам