Я хочу создать распределитель, который обеспечивает память следующими атрибутами:
- не может быть перенесено на диск.
- невероятно трудно получить доступ через подключенный отладчик
Идея состоит в том, что она будет содержать конфиденциальную информацию (например, информацию о лицензии), которая должна быть недоступна для пользователя. Я провел обычное онлайн-исследование и спросил несколько других людей об этом, но не могу найти хорошее место для решения этой проблемы.
Обновление
Джош упоминает об использовании 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;
Тед Персиваль упоминает mlock, но у меня пока нет реализации этого.
Я нашел Практическая криптография Нила Фургусона и Брюса Шнайера также весьма полезной.