加密变量

Encrypt Variables

我想知道是否有任何方法可以加密我的进程 .data section 以防止外部程序(如作弊引擎)从我的程序读取或写入数据。

我知道如何在 .text 部分使用加壳器来做到这一点,但现在我想保护我的程序的 variables 被访问。

有人知道这是否可行或者是否有其他方法来保护内存?

欢迎使用其他保护内存的方法!

您当然可以加密 .data 部分。如果您希望加密整个 .data 部分,那么您可能需要采用与加壳程序相同的策略。加密整个可执行文件。添加一个在启动时执行解密的存根,然后将控制权转移到解密后的可执行文件。但那样你当然也不会过得更好。作弊引擎可以像以前一样读取进程的内存。

并且您将无法使用加密的 .data 部分执行进程。这样你就会破坏使用全局变量、常量等的所有库代码。你可能会做的是只加密敏感信息并在使用前即时解密,然后立即丢弃。这至少让黑客更难了。他们必须看准正确的时机。但是任何真正想要获取您的数据的人都可以。在某些时候,您必须解密数据才能使用它,然后作弊引擎就可以访问这些值。

这里的底线是,如果您发现自己处于另一个进程可以读取和写入您进程的内存的情况,那么您就输了。

您将希望使用 CryptProtectMemory 在不使用时加密数据(使用 CRYPTPROTECTMEMORY_SAME_PROCESS 标志)。然后在需要访问的时候调用CryptUnprotectMemory

正如 David 所说,这只是减少了 window 攻击者可以 view/modify 你的记忆,但考虑到这个限制,这是正确的方法。

编辑:加密 int 的示例。为简洁起见删除了错误检查。需要注意的重要部分是它适用于 CRYPTPROTECTMEMORY_BLOCK_SIZE 大小的块(对于示例,我们只使用一个块,因为它将在 32 位或 64 位平台上保存一个 int):

DWORD blockSize = CRYPTPROTECTMEMORY_BLOCK_SIZE;
int* protectedBlock = (int*)LocalAlloc(LPTR, (SIZE_T)blockSize);

protectedBlock[0] = 1234;
printf("Before encryption: %d\n", protectedBlock[0]);

CryptProtectMemory(protectedBlock, blockSize, CRYPTPROTECTMEMORY_SAME_PROCESS);
printf("After encryption: %d\n", protectedBlock[0]);

CryptUnprotectMemory(protectedBlock, blockSize, CRYPTPROTECTMEMORY_SAME_PROCESS);
printf("After decryption: %d\n", protectedBlock[0]);

SecureZeroMemory(protectedBlock, blockSize);
LocalFree(protectedBlock);

输出:

Before encryption: 1234
After encryption: -2594087
After decryption: 1234