VeraCrypt всегда стремится улучшить взаимодействие с пользователем, сохраняя при этом наивысший уровень безопасности. Одна из таких функций безопасности – механизм защиты памяти. Однако для тех пользователей, которым требуются специальные возможности взаимодействия с ОС, мы предоставили возможность отключить этот механизм.
Защита памяти гарантирует, что процессам, не являющимся административными, запрещён доступ к памяти процесса VeraCrypt. Это служит двум основным целям:
Некоторым инструментам специальных возможностей, таким как экранный диктор, требуется доступ к памяти процессов ПО для эффективной интерпретации пользовательского интерфейса (UI) и взаимодействия с ним. Защита памяти VeraCrypt непреднамеренно препятствовала работе таких инструментов. Чтобы гарантировать, что пользователи смогут беспрепятственно применять инструменты специальных возможностей в VeraCrypt, мы и ввели эту опцию отключения защиты.
По умолчанию защита памяти включена. Её можно отключить через главное окно VeraCrypt или во время установки.
Хотя отключение защиты памяти может быть важным для некоторых пользователей, необходимо понимать связанные с этим риски:
По умолчанию защита памяти включена или выключена?
Защита памяти по умолчанию включена.
Как узнать, включена или отключена защита памяти?
Проверить состояние защиты памяти можно из главного окна VeraCrypt. Перейдите в меню Настройки и выберите пункт Производительность и драйвер. Если опция Отключить защиту памяти для совместимости со специальными возможностями включена, то защита памяти отключена. Если эта опция отключена, то защита памяти включена.
Снизит ли отключение защиты памяти надёжность шифрования VeraCrypt?
Нет, алгоритмы шифрования и их надёжность остаются прежними. Затрагивается только защита от потенциального перехвата памяти и внедрения в неё процессов, не являющимися административными.
Я не пользуюсь инструментами специальных возможностей. Нужно ли мне отключить эту функцию?
Нет, лучше оставить защиту памяти включённой для дополнительной безопасности.
/*
Copyright (c) 2014 IDRIX. All rights reserved.
Governed by the VeraCrypt License the full text of which is contained in
the file License.txt included in VeraCrypt binary and source code distribution
packages.
*/
#ifndef TC_HEADER_Main_Forms_WaitDialog
#define TC_HEADER_Main_Forms_WaitDialog
#include "Forms.h"
#include "Main/Main.h"
#include "Main/Application.h"
#include <wx/msgqueue.h>
namespace VeraCrypt
{
DECLARE_LOCAL_EVENT_TYPE(wxEVT_COMMAND_WAITDIALOGTHREAD_COMPLETED, -1);
DECLARE_LOCAL_EVENT_TYPE(wxEVT_COMMAND_WAITDIALOG_ADMIN_PASSWORD, -1);
DECLARE_LOCAL_EVENT_TYPE(wxEVT_COMMAND_WAITDIALOG_PIN, -1);
DECLARE_LOCAL_EVENT_TYPE(wxEVT_COMMAND_WAITDIALOG_SHOW_MSG, -1);
class WaitDialog;
class WaitThread : public wxThread
{
public:
WaitThread(WaitDialog *handler, WaitThreadRoutine* pRoutine) : wxThread(wxTHREAD_DETACHED), m_pRoutine(pRoutine)
{
m_pHandler = handler;
}
~WaitThread()
{
}
protected:
virtual ExitCode Entry();
WaitDialog *m_pHandler;
WaitThreadRoutine* m_pRoutine;
};
class WaitDialog : public WaitDialogBase, public WaitThreadUI
{
public:
WaitDialog (wxWindow *parent, const wxString& label, WaitThreadRoutine* pRoutine)
: WaitDialogBase(parent), WaitThreadUI(pRoutine), m_timer (this)
{
WaitStaticText->SetLabel (label);
WaitProgessBar->Pulse();
Layout();
GetSizer()->Fit( this );
Centre( wxBOTH );
Connect( wxID_ANY, wxEVT_COMMAND_WAITDIALOGTHREAD_COMPLETED, wxCommandEventHandler( WaitDialog::OnThreadCompletion ) );
Connect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_ADMIN_PASSWORD, wxCommandEventHandler( WaitDialog::OnAdminPasswordRequest ) );
Connect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_PIN, wxCommandEventHandler( WaitDialog::OnPinRequest ) );
Connect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_SHOW_MSG, wxCommandEventHandler( WaitDialog::OnShowMsg ) );
Connect( wxEVT_TIMER, wxTimerEventHandler( WaitDialog::OnProgressTimer ), NULL, this );
m_thread = new WaitThread(this, pRoutine);
}
~WaitDialog()
{
Disconnect( wxEVT_TIMER, wxTimerEventHandler( WaitDialog::OnProgressTimer ));
Disconnect( wxID_ANY, wxEVT_COMMAND_WAITDIALOGTHREAD_COMPLETED, wxCommandEventHandler( WaitDialog::OnThreadCompletion ) );
Disconnect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_ADMIN_PASSWORD, wxCommandEventHandler( WaitDialog::OnAdminPasswordRequest ) );
Disconnect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_PIN, wxCommandEventHandler( WaitDialog::OnPinRequest ) );
Disconnect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_SHOW_MSG, wxCommandEventHandler( WaitDialog::OnShowMsg ) );
}
virtual void OnWaitDialogInit( wxInitDialogEvent& event )
{
m_thread->Run();
m_timer.Start(100);
}
int GetCharWidth (wxWindow *window) const
{
int width;
int height;
window->GetTextExtent (L"a", &width, &height);
if (width < 1)
return 7;
return width;
}
class ShowMessageParam
{
public:
wxString m_message;
wxString m_caption;
long m_style;
bool m_topMost;
ShowMessageParam(const wxString &message, const wxString &caption,long style, bool topMost)
: m_message(message), m_caption(caption), m_style(style), m_topMost(topMost)
{}
};
int RequestShowMessage (const wxString &message, const wxString &caption,long style, bool topMost)
{
long lResult = -1;
if (m_queue.IsOk())
{
wxString sResult;
ShowMessageParam* pParam = new ShowMessageParam(message, caption, style, topMost);
wxCommandEvent* pEvent = new wxCommandEvent( wxEVT_COMMAND_WAITDIALOG_SHOW_MSG,0);
pEvent->SetClientData (pParam);
wxQueueEvent (this, pEvent);
m_queue.Receive (sResult);
sResult.ToLong(&lResult);
}
return (int) lResult;
}
void RequestAdminPassword (wxString& adminPassword)
{
if (m_queue.IsOk())
{
wxQueueEvent (this, new wxCommandEvent( wxEVT_COMMAND_WAITDIALOG_ADMIN_PASSWORD,0));
if (wxMSGQUEUE_NO_ERROR != m_queue.Receive (adminPassword))
adminPassword = wxT("");
}
else
adminPassword = wxT("");
}
void RequestPin (wxString& pin)
{
if (m_queue.IsOk())
{
wxCommandEvent* pEvent = new wxCommandEvent( wxEVT_COMMAND_WAITDIALOG_PIN,0);
pEvent->SetString (pin);
wxQueueEvent (this, pEvent);
if (wxMSGQUEUE_NO_ERROR != m_queue.Receive (pin))
pin = wxT("");
}
else
pin = wxT("");
}
// virtual void OnWaitDialogClose( wxCloseEvent& event ) { }
void OnThreadCompletion(wxCommandEvent &)
{
m_queue.Clear();
EndModal(0);
}
void OnAdminPasswordRequest(wxCommandEvent &)
{
wxPasswordEntryDialog dialog (this, _("Enter your user password or administrator password:"), _("Administrator privileges required"));
if (dialog.ShowModal() != wxID_OK)
m_queue.Post(wxT(""));
else
m_queue.Post(dialog.GetValue());
}
void OnPinRequest(wxCommandEvent &e)
{
wxPasswordEntryDialog dialog (this, wxString::Format (LangString["ENTER_TOKEN_PASSWORD"], e.GetString()), LangString["IDD_TOKEN_PASSWORD"]);
dialog.SetSize (wxSize (GetCharWidth (&dialog) * 50, -1));
if (dialog.ShowModal() != wxID_OK)
m_queue.Post(wxT(""));
else
m_queue.Post(dialog.GetValue());
}
void OnShowMsg(wxCommandEvent &e)
{
ShowMessageParam* pParam = (ShowMessageParam*) e.GetClientData();
if (pParam->m_topMost)
{
if (!IsActive())
RequestUserAttention (wxUSER_ATTENTION_ERROR);
pParam->m_style |= wxSTAY_ON_TOP;
}
int iResult = wxMessageBox (pParam->m_message, pParam->m_caption, pParam->m_style, this);
delete pParam;
m_queue.Post(wxString::Format(wxT("%d"), iResult));
}
void OnProgressTimer(wxTimerEvent& event)
{
WaitProgessBar->Pulse();
}
virtual void Run(void) { ShowModal(); if (m_pRoutine->HasException()) ThrowException(m_pRoutine->m_pException); }
void ThrowException(Exception* ex);
protected:
WaitThread* m_thread;
wxTimer m_timer;
wxMessageQueue<wxString> m_queue;
};
}
#endif // TC_HEADER_Main_Forms_WaitDialog