我想创建一个分配器,它提供具有以下属性的内存:
- 无法分页到磁盘。
- 很难通过附加的调试器访问
这个想法是这将包含用户应该无法访问的敏感信息(如许可证信息)。我已经在网上进行了通常的研究,并就此询问了其他一些人,但我找不到一个很好的起点来解决这个问题。
更新
Josh提到了使用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 );
        }
    }
};
并且被使用
 //a memory safe std::string
 typedef std::basic_string<char, std::char_traits<char>, 
                           LockedVirtualMemAllocato<char> > modulestring_t;
Ted Percival提到了 mlock,但我还没有实现。
我发现Neil Furguson 和 Bruce Schneier 的 Practical Cryptography 也很有帮助。