【发布时间】:2010-09-05 17:25:08
【问题描述】:
我想创建一个分配器,它提供具有以下属性的内存:
- 无法分页到磁盘。
- 很难通过附加的调试器访问
我们的想法是,这将包含用户无法访问的敏感信息(如许可证信息)。我已经在网上进行了常规研究,并就此询问了其他一些人,但我找不到一个很好的起点来解决这个问题。
更新
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,但我还没有实现。
我发现Practical Cryptography by Neil Furguson and Bruce Schneier 也很有帮助。
【问题讨论】:
标签: c++ security memory ram-scraping