-2

首先,我之前做过很多研究,但我不得不问一些可能很简单的事情......或者不是,但我更愿意问你以便确定......

我有两种密钥,一种是我设置的,另一种是简单的 FourCC 代码。但是,例如使用 HxD 在 .exe 的代码中找到它们非常简单。所以我想隐藏.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

谢谢,祝你有美好的一天!:)

4

1 回答 1

0

如果你说你为什么要隐藏它就很好了。FourCC 是 4 个字节,因此可以看作是 int。您可以对其进行异或运算,或以其他方式对其进行加密。但显然这不会对抗严重的对手,因为无论如何关键都在代码中。

不要忘记,除了磁盘上的程序外,严重的黑客还会在程序运行时扫描代码和数据。

编辑:

这是一个快速而肮脏的代码,可以让您的fourcc xor-ed。您将在运行时应用相同的值以恢复原始值。使用 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)
于 2016-02-16T19:11:34.783 回答