Безопасный распределитель памяти в C ++ - PullRequest
11 голосов
/ 12 августа 2008

Я хочу создать распределитель, который обеспечивает память следующими атрибутами:

  • не может быть перенесено на диск.
  • невероятно трудно получить доступ через подключенный отладчик

Идея состоит в том, что она будет содержать конфиденциальную информацию (например, информацию о лицензии), которая должна быть недоступна для пользователя. Я провел обычное онлайн-исследование и спросил несколько других людей об этом, но не могу найти хорошее место для решения этой проблемы.

Обновление

Джош упоминает об использовании 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, но у меня пока нет реализации этого.

Я нашел Практическая криптография Нила Фургусона и Брюса Шнайера также весьма полезной.

Ответы [ 13 ]

0 голосов
/ 12 августа 2008

@ Крис

О, но с надежными вычислениями вы можете использовать занавес памяти! : -Р

Но тогда вы должны быть готовы заплатить за компьютер, которым владеет кто-то другой. : Р

0 голосов
/ 12 августа 2008

@ РОО

Я действительно надеялся, что это возможно, и я просто еще не нашел его. Ваш пример только что заставил меня понять, что это именно то, что мы пытаемся сделать - разрешить доступ только к файлам в контексте нашей программы и таким образом сохранить IP.

Полагаю, я должен согласиться с тем, что не существует действительно безопасного способа хранения чьих-либо файлов на другом компьютере, особенно если в какой-то момент владелец разрешил доступ к этому файлу.

Это определенно проблема. Вы можете надежно хранить что-то, пока вы никогда не предоставите доступ, но как только вы предоставите доступ, ваш контроль исчезнет. Вы можете сделать это немного сложнее, но это все.

0 голосов
/ 12 августа 2008

@ Дерек: О, но с надежными вычислениями вы можете использовать занавес памяти ! -Р </ черти-адвокат>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...