Слайд 1ЛЕКЦІЯ 7
Розробка пасток в ОС Windows
Операційні системи
доц. Сінельнікова Т.Ф.
Слайд 2ПАСТКИ В ОС WINDOWS
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua
Пастка
(hook) - це механізм, який дозволяє проводити моніторинг повідомлень системи
і обробляти їх до того, як вони досягнуть цільової віконної процедури. Пастка може отримувати до себе всі повідомлення, які виникають в системі, обробляти їх і передавати далі в ту програму, якою ці повідомлення адресовані.
Слайд 3ПАСТКИ В ОС WINDOWS
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua
Пастки
можуть використовуватися додатками в наступних цілях:
Обробляти або змінювати всі
повідомлення, призначені для всіх діалогових вікон (dialog box), інформаційних вікон (message box), смуг прокрутки (scroll bar), або меню однієї програми (WH_MSGFILTER).
Обробляти або змінювати всі повідомлення, призначені для всіх діалогових вікон, інформаційних вікон, смуг прокрутки, або меню всієї системи (WH_SYSMSGFILTER).
Обробляти або змінювати всі повідомлення в системі (всі види повідомлень), одержувані функціями GetMessage або PeekMessage (WH_GETMESSAGE).
Обробляти або змінювати всі повідомлення (будь-якого типу), що посилаються викликом функції SendMessage (WH_CALLWNDPROC).
Слайд 4ПАСТКИ В ОС WINDOWS
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua
Записувати
або програвати подіїї клавіатури та миші (WH_JOURNALRECORD, WH_JOURNALPLAYBACK).
Обробляти, змінювати
або видаляти події клавіатури(WH_KEYBOARD).
Обробляти, змінювати або скасовувати події миші (WH_MOUSE).
Реагувати на певні дії системи, роблячи можливим розробку додатків комп'ютерного навчання - computer-based training (WH_CBT).
Запобігти виклику іншої функції-фільтра (WH_DEBUG).
Слайд 5ТИПИ ПАСТОК В ОС WINDOWS
Операційні системи. Кафедра Інформатики. E-mail:
informatika@kture.kharkov.ua
Слайд 6ТИПИ ПАСТОК В ОС WINDOWS
Операційні системи. Кафедра Інформатики. E-mail:
informatika@kture.kharkov.ua
Слайд 7ТИПИ ПАСТОК В ОС WINDOWS
Операційні системи. Кафедра Інформатики. E-mail:
informatika@kture.kharkov.ua
Слайд 8ТИПИ ПАСТОК В ОС WINDOWS
Операційні системи. Кафедра Інформатики. E-mail:
informatika@kture.kharkov.ua
Слайд 9ТИПИ ПАСТОК В ОС WINDOWS
Операційні системи. Кафедра Інформатики. E-mail:
informatika@kture.kharkov.ua
Слайд 10ТИПИ ПАСТОК В ОС WINDOWS
Операційні системи. Кафедра Інформатики. E-mail:
informatika@kture.kharkov.ua
Слайд 11ТИПИ ПАСТОК В ОС WINDOWS
Операційні системи. Кафедра Інформатики. E-mail:
informatika@kture.kharkov.ua
Слайд 12ТИПИ ПАСТОК В ОС WINDOWS
Як видно з таблиці деякі пастки
можуть бути встановлені тільки з системною областю видимості, а деякі
можна встановлювати як для всієї системи, так і для одного потоку.
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua
Слайд 13ТИПИ ПАСТОК В ОС WINDOWS
Пастки типу WH_JOURNALRECORD і WH_JOURNALPLAYBACK істотно
відрізняються від пасток інших типів. Вони можуть встановлюватися лише як
системні. Пастки цих типів впливають на всі програми Windows, включаючи робочий стіл. Побічним ефектом від використання пасток даного типу є те, що всі системні вхідні черги проходять через один потік, який встановив таку пастку. У Windows існує спеціальна послідовність дій, за допомогою якої користувач може видалити таку пастку в разі зависання системи. Для цього використовуються комбінації клавіш CTRL + ESC, ALT + ESC, або CTRL + ALT + DEL.
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua
Слайд 14РОЗРОБКА ПАСТОК В ОС WINDOWS
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua
Перейдемо
до розгляду завдань пов'язаних безпосередньо з розробкою пасток. Для обробки
повідомлень пишеться спеціальна функція (Hook Procedure). Якщо необхідно відстежувати повідомлення всіх потоків, а не тільки поточного, то пастка повинна бути глобальною. В цьому випадку функція пастки повинна знаходитися в динамічній бібліотеці DLL.
Завдання розробки програми з пасткою розбивається на наступні частини.
Написання DLL c функціями пастки.
Написання програми, яке встановить пастку.
Написання функції зняття пастки.
Розглянемо всі ці етапи на прикладі.
Слайд 15БІБЛІОТЕКА, ЯКА МІСТИТЬ ФУНКЦІЇ ПАСТОК МИШІ І КЛАВІАТУРИ
Операційні системи. Кафедра
Інформатики. E-mail: informatika@kture.kharkov.ua
// Описуємо сегмент Shared і змінні в цьому
сегменті
#pragma data_seg(".shared")
extern "C" __declspec(dllexport) HHOOK g_KeyBoardHook = NULL;
extern "C" __declspec(dllexport) HHOOK g_MouseHook = NULL;
#pragma data_seg()
extern "C" __declspec(dllexport) LRESULT __stdcall KeyboardHook(
int nCode, WPARAM wParam, LPARAM lParam)
{ // Функція пастки клавіатури
BOOL bControl = (BOOL) (::GetAsyncKeyState(VK_CONTROL) & 0x8000);
if((wParam == 0x44) && bControl && !(lParam & 0x80000000))
{
MessageBox(NULL,"Были нажаты клавиши Ctrl+D", NULL, MB_OK);
}
if((wParam == 0x55) && bControl && (lParam & 0x80000000))
{
MessageBox(NULL,"Были нажаты клавиши Ctrl+U. Ловушки выгружены !", NULL, MB_OK);
// Завершуємо роботу пасток клавіатури і миші
UnhookWindowsHookEx(g_KeyBoardHook);
UnhookWindowsHookEx(g_MouseHook);
}
if((wParam == 0x4D) && bControl && (lParam & 0x80000000))
{
MessageBox(NULL,"Ctrl+M - Ловушка мыши отключена !", NULL, MB_OK);
UnhookWindowsHookEx(g_MouseHook); // Завершуємо роботу пастки миші
}
return CallNextHookEx(g_KeyBoardHook, nCode, wParam, lParam);
}
Слайд 16БІБЛІОТЕКА, ЯКА МІСТИТЬ ФУНКЦІЇ ПАСТОК МИШІ І КЛАВІАТУРИ(ПРОДОВЖЕННЯ)
Операційні системи. Кафедра
Інформатики. E-mail: informatika@kture.kharkov.ua
extern "C" _declspec(dllexport) LRESULT __stdcall MouseHook(int nCode,
WPARAM wParam, LPARAM lParam)
{ // Функція пастки миші
if(wParam==WM_MOUSEMOVE || wParam==WM_NCMOUSEMOVE)
{
MOUSEHOOKSTRUCT* psMouseHook;
psMouseHook = reinterpret_cast(lParam);
if(psMouseHook->pt.x==0 && psMouseHook->pt.y==0)
MessageBox(0,"Мышь в верхнем углу", "Внимание!", MB_ICONINFORMATION);
return CallNextHookEx(g_MouseHook, nCode,wParam, lParam);
}
}
Слайд 17БІБЛІОТЕКА, ЯКА МІСТИТЬ ФУНКЦІЇ ПАСТОК МИШІ І КЛАВІАТУРИ(ПРОДОВЖЕННЯ)
Операційні системи. Кафедра
Інформатики. E-mail: informatika@kture.kharkov.ua
Для запобігання проблем пов'язаних з перетворенням імен функцій
при їх експорті з бібліотеки на Visual С + + рекомендується в проект бібліотеки включати файл *. Def, в якому вказувати імена функцій, які повинні бути при експорті з бібліотеки. Приклад такого def файлу наведений нижче стосовно бібліотеки розглянутої у прикладі.
; LcsProvider.def : Declares the module parameters for the DLL.
LIBRARY "hookdll"
EXPORTS
; Explicit exports can go here
KeyboardHook = KeyboardHook
MouseHook = MouseHook
Слайд 18ДОДАТОК, ЯКИЙ ВСТАНОВЛЮЄ І ЗНІМАЄ ПАСТКИ
Операційні системи. Кафедра Інформатики. E-mail:
informatika@kture.kharkov.ua
При розробці додатків з пастками програма повинна вміти встановлювати, а
потім знімати пастки. Встановлення пастки здійснюється за допомогою функції SetWindowsHookEx, а для зняття пастки використовується функція UnhookWindowsHookEx.
//Опис змінних
HINSTANCE hLibrary; // Дескриптор бібліотеки
HOOKPROC pKeybHook; // Покажчик на процедуру обробки пастки клавіатури
HOOKPROC pMousHook; // Покажчик на процедуру обробки пастки миші
// Покажчики на змінні сегмента Shared для передачі покажчиків на функції пастки
// клавіатури і миші
HHOOK *pKeyBoardHook;
HHOOK *pMouseHook;
MSG msg;
HWND hWnd=0;
HACCEL hAccelTable;
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_HOOKDEMO, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_HOOKDEMO);
//Загрузка библиотеки и получение ее дескриптора
hLibrary=LoadLibrary("Hookdll.dll");
if(!hLibrary){
MessageBox(hWnd,"Невозможно загрузить библиотеку !", NULL, MB_OK|MB_ICONSTOP);
return 0;
}
Слайд 19ДОДАТОК, ЯКИЙ ВСТАНОВЛЮЄ І ЗНІМАЄ ПАСТКИ
Операційні системи. Кафедра Інформатики. E-mail:
informatika@kture.kharkov.ua
if(hLibrary)
{ pKeybHook=(HOOKPROC)GetProcAddress(hLibrary,"KeyboardHook");
pMousHook=(HOOKPROC)GetProcAddress(hLibrary,"MouseHook");
// Получаем указатели на переменные в сегменте Shared
pKeyBoardHook
=(HHOOK*)GetProcAddress(hLibrary,"g_KeyBoardHook");
pMouseHook =(HHOOK*)GetProcAddress(hLibrary,"g_MouseHook");
*pKeyBoardHook=SetWindowsHookEx(WH_KEYBOARD,pKeybHook,hLibrary,0);
if (!pKeyBoardHook)
if (!*pKeyBoardHook)
{
MessageBox(hWnd,"Невозможно загрузить функцию ловушки клавиатуры!", NULL, MB_OK);
PostQuitMessage (0);
return 0;
}
*pMouseHook=SetWindowsHookEx(WH_MOUSE,pMousHook,hLibrary,0);
if (!pMouseHook )
if (!*pMouseHook)
{
MessageBox(hWnd,"Невозможно загрузить функцию ловушки мыши!","",MB_OK);
PostQuitMessage (0);
return 0;
} }
MessageBox(hWnd,"Ловушки загружены. (Ctrl+D)-Вызвать ловушку клавиатуры, (Ctrl+U)-Выгрузить все ловушки, (Ctrl+M)-Выгрузить ловушку мыши", "Message", MB_OK);
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg); //дозволити використання клавіатури
DispatchMessage(&msg); //повернути керування Windows
}
// Завершаем работу ловушек перед выходом из приложения
UnhookWindowsHookEx(*pKeyBoardHook);
UnhookWindowsHookEx(*pMouseHook);
FreeLibrary(hLibrary); // вивантажуємо бібліотеку
return (int) msg.wParam;
Слайд 20УСТАНОВКА ІКОНИ ПРОГРАМИ В СИСТЕМНУ ОБЛАСТЬ
Операційні системи. Кафедра Інформатики. E-mail:
informatika@kture.kharkov.ua
BOOL CTrayIconAPIDlg::AddTrayIcon()
{
m_uRegisteredMessage=::RegisterWindowMessage(_T("TrayIcon_regMsg"));
if(m_hTrayIcon)
::DestroyIcon(m_hTrayIcon);
if(!(m_hTrayIcon=::LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_SMALL_ICON))))
return FALSE;
this->GetWindowText(m_strTrayTipText);
m_uID=1111;
NOTIFYICONDATA nid={0};
nid.cbSize=sizeof(NOTIFYICONDATA);
nid.hWnd=m_hWnd;
nid.uID=m_uID;
nid.uFlags=NIF_MESSAGE | (m_hTrayIcon ? NIF_ICON : 0);
nid.uCallbackMessage=m_uRegisteredMessage;
nid.hIcon=m_hTrayIcon;
lstrcpyn(nid.szTip, m_strTrayTipText.GetBuffer(), 64);
nid.uFlags |= NIF_TIP;
return (m_bAdded=::Shell_NotifyIcon(NIM_ADD, &nid));
}
BOOL CTrayIconAPIDlg::DeleteTrayIcon()
{
if(m_bAdded)
{ NOTIFYICONDATA nid={0};
nid.cbSize=sizeof(NOTIFYICONDATA);
nid.hWnd=m_hWnd;
nid.uID=m_uID;
return !(m_bAdded=!::Shell_NotifyIcon(NIM_DELETE, &nid));
}
return TRUE;
}
Слайд 21УСТАНОВКА ІКОНИ ПРОГРАМИ В СИСТЕМНУ ОБЛАСТЬ
Операційні системи. Кафедра Інформатики. E-mail:
informatika@kture.kharkov.ua
BOOL CTrayIconAPIDlg::OnInitDialog()
{
CDialog::OnInitDialog();
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu =
GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
AddTrayIcon();// Встановлюємо ікону в системну область
return TRUE;
}