我想知道是否有任何方法可以加密我的进程的.data section,以防止像欺骗引擎这样的外部程序从我的程序中读取或写入数据。
我知道如何在.text部分使用封隔器实现这一点,但现在我想保护要访问的程序的variables。
有没有人知道这是可能的,还是有其他保护记忆的方法?
其他保护记忆的方法也是受欢迎的!
发布于 2015-03-06 16:49:16
您将希望在不使用时使用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发布于 2015-03-06 14:35:15
您当然可以加密.data部分。如果您希望加密整个.data部分,那么您可能需要采取与包装者相同的策略。加密整个可执行文件。添加在启动时执行解密的存根,然后将控制转移到解密的可执行文件。但那样你当然也不会更好。欺骗引擎可以像以前一样读取进程的内存。
您将无法使用.data部分对进程执行加密。这样你就可以破解使用全局变量、常量等的库代码了。你可以做的就是加密敏感信息,并在使用前立即解密,然后立即丢弃。这至少会让黑客们变得更加困难。他们必须找出正确的时机。但是任何真正想得到你的数据的人都可以。在某个时候,您必须解密数据才能使用它,然后欺骗引擎可以获得对值的访问权。
这里的底线是,如果您发现自己处于另一个进程可以从内存中读取并写入您的进程的情况,那么您就输掉了这场战斗。
https://stackoverflow.com/questions/28900855
复制相似问题