次の属性を持つメモリを提供するアロケータを作成したいと考えています。
- ディスクにページングできません。
- 接続されたデバッガーからアクセスするのは非常に困難です
これには、ユーザーがアクセスできない機密情報 (ライセンス情報など) が含まれるという考えです。私はオンラインで通常の調査を行い、これについて他の何人かの人々に尋ねましたが、この問題を開始するのに適した場所を見つけることができません.
アップデート
JoshVirtualAlloc
は、メモリ空間に保護を設定するために使用することについて言及しています。カスタム アロケータを作成しました (以下を参照) 。この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も非常に役に立ちました。