Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的安全内存分配器+;_C++_Security_Memory_Ram Scraping - Fatal编程技术网

C++ C+中的安全内存分配器+;

C++ C+中的安全内存分配器+;,c++,security,memory,ram-scraping,C++,Security,Memory,Ram Scraping,我想创建一个分配器,它为内存提供以下属性: 无法分页到磁盘 很难通过附加的调试器访问 其想法是,这将包含用户不可访问的敏感信息(如许可证信息)。我在网上做了通常的研究,并询问了其他一些人,但我找不到解决这个问题的好起点 更新 提到使用VirtualAlloc对内存空间设置保护。我创建了一个自定义分配器(如下所示),我发现使用VirtualLock函数可以限制我可以分配的内存量。但这似乎是有意为之。因为我使用它来处理小对象,所以这不是问题 // template<class _Ty>

我想创建一个分配器,它为内存提供以下属性:

  • 无法分页到磁盘
  • 很难通过附加的调试器访问
其想法是,这将包含用户不可访问的敏感信息(如许可证信息)。我在网上做了通常的研究,并询问了其他一些人,但我找不到解决这个问题的好起点

更新

提到使用
VirtualAlloc
对内存空间设置保护。我创建了一个自定义分配器(如下所示),我发现使用
VirtualLock
函数可以限制我可以分配的内存量。但这似乎是有意为之。因为我使用它来处理小对象,所以这不是问题

//
template<class _Ty>
class LockedVirtualMemAllocator : public std::allocator<_Ty>
{
public:
    template<class _Other>
    LockedVirtualMemAllocator<_Ty>& operator=(const LockedVirtualMemAllocator<_Other>&)
    {   // assign from a related LockedVirtualMemAllocator (do nothing)
        return (*this);
    }

    template<class Other>
    struct rebind {
        typedef LockedVirtualMemAllocator<Other> other;
    };

    pointer allocate( size_type _n )
    {
        SIZE_T  allocLen = (_n * sizeof(_Ty));
        DWORD   allocType = MEM_COMMIT;
        DWORD   allocProtect = PAGE_READWRITE;
        LPVOID pMem = ::VirtualAlloc( NULL, allocLen, allocType, allocProtect );
        if ( pMem != NULL ) {
            ::VirtualLock( pMem, allocLen );
        }
        return reinterpret_cast<pointer>( pMem );
    }
    pointer allocate( size_type _n, const void* )
    {
        return allocate( _n );
    }

    void deallocate(void* _pPtr, size_type _n )
    {
        if ( _pPtr != NULL ) {
            SIZE_T  allocLen = (_n * sizeof(_Ty));
            ::SecureZeroMemory( _pPtr, allocLen );
            ::VirtualUnlock( _pPtr, allocLen );
            ::VirtualFree( _pPtr, 0, MEM_RELEASE );
        }
    }
};
//
模板
类锁定VirtualMallocator:公共std::分配器
{
公众:
模板
LockedVirtualMallocator&运算符=(常量LockedVirtualMallocator&)
{//从相关的LockedVirtualMallocator分配(不执行任何操作)
返回(*本条);
}
模板
结构重新绑定{
类型定义锁定虚拟定位器或其他;
};
指针分配(大小\u类型\u n)
{
SIZE_T allocLen=(_n*sizeof(_Ty));
DWORD allocType=MEM_COMMIT;
DWORD allocProtect=第页(读写);
LPVOID pMem=::VirtualAlloc(NULL,allocLen,allocType,allocProtect);
如果(pMem!=NULL){
::VirtualLock(pMem,allocLen);
}
返回重新解释(pMem);
}
指针分配(大小类型,常量无效*)
{
返回分配(n);
}
作废解除分配(作废*\u pPtr,大小\u类型\u n)
{
如果(_pPtr!=NULL){
SIZE_T allocLen=(_n*sizeof(_Ty));
::SecureZeroMemory(_pPtr,allocLen);
::虚拟锁(_pPtr,allocLen);
::VirtualFree(_pPtr,0,MEM_RELEASE);
}
}
};
并被使用

 //a memory safe std::string
 typedef std::basic_string<char, std::char_traits<char>, 
                           LockedVirtualMemAllocato<char> > modulestring_t;
//内存安全的std::string
typedef std::基本字符串模块化;
提到mlock,但我还没有实现它


我发现这也很有帮助。

您所要求的是在操作系统级别处理的。一旦数据进入您的程序,它就可能被调出


为了访问内存,有动力的个人可以附加一个硬件调试器。

让我们一次一点地看一下:

我想创建一个分配器 为内存提供以下内容 属性:

这很公平

那将很难。据我所知,您不能禁用虚拟分页,因为它是由操作系统处理的。如果有办法的话,那么你将在操作系统的内部进行探索

您可以通过PGP运行它,并将其加密存储在内存中,然后根据需要取消加密。巨大的性能打击

想法是,这将包含 敏感信息(如许可证) 信息)应该是什么 用户无法访问。我已经做了 通常在网上进行研究,并询问 很少有人知道这件事,但我 找不到一个好的开始 问题


将所有敏感信息远离机器。认真地不要将敏感信息存储在内存中。编写一个自定义删除例程,该例程将自动从您执行的任何分配中删除所有数据。禁止对带有敏感材料的机器进行一般性操作。如果执行数据库访问,请确保在触发之前对所有访问进行了消毒。只有具有特定登录的用户才允许访问。没有常规组访问权限

另一方面,还有哪些方法 没有访问内存的方法 除附加 调试器


正在转储内存。

您无法真正防止内存访问。如果您以管理员或系统身份运行,则可能会阻止分页,但不能阻止管理员或系统读取内存。即使您可以以某种方式完全阻止其他进程读取内存(您不能这样做),另一个进程仍然可以向您的进程中实际注入一个新线程,并以这种方式读取内存

即使您能够以某种方式完全锁定您的进程,并保证操作系统永远不会允许任何其他人访问您的进程,您仍然没有充分的保护。整个操作系统可以在虚拟机中运行,可以随时暂停和检查虚拟机

无法保护内存内容不受系统所有者的影响。好莱坞和音乐产业多年来一直在为此而苦恼。如果可能的话,他们早就这么做了。

@graham

您可以通过PGP运行它,并将其加密存储在内存中,然后根据需要取消加密。巨大的性能打击


那你就得把钥匙留在记忆里。这会让事情变得更难,但绝对不是不可能。任何有动机的人都会设法从内存中获取数据。

@Derek:哦,但是有了可信计算,你可以使用!:-P

@roo

我真的希望这是可能的,只是我还没有找到它。你的例子让我意识到,这正是我们正在努力做的——只允许访问我们程序上下文中的文件,从而保留IP

我想我必须承认,没有真正安全的方式将某人的文件存储在另一台计算机上,特别是如果在某一点上所有者允许访问该文件

这绝对是问题所在。只要您不授予访问权,您就可以安全地存储某些内容,但一旦授予访问权,您的控制权就消失了。你可以让它变得更难一点,但仅此而已。

@Chris

哦,但是有了可信计算,你可以使用内存限制-P

但你必须愿意为别人拥有的电脑买单德里克公园

他只是狠狠地说了一句
* cannot be paged to disk.
* is incredibly hard to access through an attached debugger
void *sodium_malloc(size_t size);
void *sodium_allocarray(size_t count, size_t size);
void sodium_memzero(void * const pnt, const size_t len);
int sodium_mlock(void * const addr, const size_t len);
int sodium_mprotect_noaccess(void *ptr);
int sodium_mprotect_readonly(void *ptr);
int sodium_mprotect_readwrite(void *ptr);