加密变量

时间:2015-03-06 14:26:46

标签: c++ windows security winapi memory

我想知道是否有任何方法可以加密我的进程的.data section,以防止像Cheat Engine这样的外部程序从我的程序中读取或写入数据。

我知道如何使用打包程序在.text部分执行此操作,但现在我想保护要访问的程序的variables

任何人都知道这是否可行,或者是否有其他方法来保护记忆?<​​/ p>

欢迎其他保护记忆的方法!

2 个答案:

答案 0 :(得分:1)

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

您将无法使用加密的.data部分执行流程。这样你就可以打破使用全局变量,常量等的每一段库代码。你可能会做的只是加密敏感信息并在使用前即时解密,然后立即丢弃。至少这对黑客来说有点困难。他们必须正好关注正确的时刻。但任何真正想要获取数据的人都能够。在某些时候,您必须解密数据才能使用它,然后作弊引擎可以访问这些值。

这里的底线是,如果你发现自己处于另一个进程可以读取和写入你的进程的内存的情况,那么你已经失去了战斗。

答案 1 :(得分:1)

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

正如David所说,这只会减少攻击者可以查看/修改内存的窗口,但考虑到这种限制,这是正确的方法。

编辑:加密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