38218

Робота з системними пастками Windows

Лабораторная работа

Информатика, кибернетика и программирование

Системна пастка (анг. Hook - пастка) – це певна функція, за допомогою якої можна перехоплювати усі повідомлення та події, що виникли в системі. За допомогою пасток можна отримувати повний контроль над тим, що відбувається в системі.

Украинкский

2014-11-30

42.5 KB

1 чел.

Лабораторна робота №3 

Тема: Робота з системними пастками Windows;

Теоретична частина.

 Системна пастка (анг. Hook - пастка) – це певна функція, за допомогою якої можн

а перехоплювати усі повідомлення та події, що виникли в системі. За допомогою пасток можна отримувати повний контроль над тим, що відбувається в системі.

Для того, щоб створити пастку потрібно використати функцію SetWindowsHookEx()

Її синтаксис наступний (синтаксис показаний у мові Delphi, проте для мови С++ він аналогічний):

Function SetWindowsHookEx(idHook:integer; lpfn:TFNHookProc;
              hmod:HINST; dwThreadID: DWORD
):HHOOK;

 Дана функція повертає ідентифікатор (хендл) пастки. Його бажано зберігати для подальшої роботи з пастками в глобальній змінній.

Перший параметр – це тип пастки. Їх кількість є досить великою і всі вони описані в системній документації WinAPI (система MSDN – довідникова інформація). В даній роботі ми будемо використовувати WH_GETMESSAGE. Це означатиме, що будуть перехоплюватись усі повідомлення.

Другий параметр – це вказівник на функцію, яка й буде пасткою і в якій й будуть оброблятись повідомлення. Синтаксис цієї функції повинен бути наступний

  

Function <Name>(code:integer; wParam:WPARAM; lParam:LPARAM):LRESULT;

 Типи WPARAM, LPARAM, LRESULTеквівалентні типу longInt, тобто це 4- байтні числа. Зміст параметрів даної функції залежить від типу пастки. В нашому випадку – якщо перший параметр приймає значення HC_ACTIONто це повідомлення можна обробляти, якщо ж значення менше нуля – то обробка цього повідомлення заборонена і пастка повинна передати обробку іншим пасткам (про це нижче). Параметр wparam для даного типу пастки завжди рівний нулю, а в параметрі lparam передається 4-байтний вказівник на структуру TMsg, яка описує повідомлення, що настало в системі. І все би нічого, але є одне але – для коректної роботи даної процедури потрібно виконати дві умови:

  •  вона повинна міститись в бібліотеці динамічного підключення;
  •  обов’язково у даній функції потрібно викликати функцію (вибачаюсь за тавтологію)

CallNextHookEx(SysHook, Code, wParam, lParam), де перший параметр-це ідентифікатор вашої пастки, а решта – вхідні параметри функції обробки. Дану функцію бажано викликати на початку функції, так як в противному випадку можливий збій системи.

Отже можна сказати, що зазвичай бібліотека динамічного підключення в якій є функція встановлення пастки має наступний шаблон:

library Project1;

uses

 SysUtils,  Classes,  windows,  messages;

var

SysHook: HHOOK;    //Оголошення змінної в якій буде зберігатись ідент. пастки

// Функція пастки

function  SysHookMsg(code:integer; wparam:WPARAM; lparam:LPARAM):LRESULT;stdcall;

var

Msg:TMsg;

begin

 CallNextHookEx(SysHook,code,wparam,lparam);

 Msg:=TMsg(Pointer(lparam)^); // Приведення типу вказівника, який записаний в
                                                            // lparam до типу T
Msg  

 if code=HC_ACTION  then

   begin

     if Msg.message=<Повідомлення> then // Перевіряємо яке надійшло повідомлення

       begin

         ……  // Обробка повідомлення

       end;

   end; // code=HC_ACTION

end;

// Експортна функція, за допомогою якої встановлюється і знімається пастка

function RunHook(fl:boolean):integer;

begin

 if fl then   // Якщо вхідний параметр TRUE то встановлюємо пастку

    begin

      SysHook:=SetWindowsHookEx(WH_GETMESSAGE,@SysHookMsg,HInstance,0);

    end else

    begin

      UnhookWindowsHookEx(SysHook);

      SysHook:=0;

    end;

end;

В структурі Msg зберігається повний опис повідомлення, яке перехопила пастка., тобто для того щоб звернутись до значення параметру wparam, повідомлення що обробляється, потрібно використати конструкцію Msg.wparam. (Не плутати із значеннями lparam та wparam, що є параметрами функції обробки пастки.)  Ви можете його відкорегувати (змінити значення lparam, wparam), або  відмінити. Але з цим потрібно бути дуже обережним, так як некоректна обробка повідомлення, а також не виклик функції   CallNextHookEx може призвести до збою в системі.

Також в тій же бібліотеці повинна бути описана функція встановлення та відміни пастки. В даному прикладі представлена функція, яка має один формальний параметр. Якщо він рівний TRUE, то встановлюється пастка. В противному випадку – вона деактивується. Це звертаю вашу увагу, що змінна в якій зберігається ідентифікатор пастки є глобальною змінною для всієї бібліотеки (змінна SysHook). Це теж одна з рекомендації по роботі з пастками.

 

Завдання:

Завдання на 4 бали:

       Розробити бібліотеку динамічного підключення, яка реалізує пастку, що перехоплює всі надтиски лівої клавіші миші та веде запис про кожну таку подію. Запис відбувається у файл, що вказується користувачем. Пастка повинна записувати час натиску лівої кнопки миші та координати курсора в момент натиску. При натиску на ліву кнопку миші в системі генерується повідомлення WM_LBUTTONDOWN. При цьому в параметрі lparam даного повідомлення записуються координати миші в момент генерації. Даний параметр є 32-бітним і в  молодшому слові записується координата Х миші, а в старшому координата Y. Результатом роботи програми є файл в якому записані всі події.

Завдання на 5  балів:

 Завдання аналогічне попередньому, але пастка також записує і натиски правої кнопки миші (повідомлення WM_RBUTTONDOWN). При чому при натиску на клавішу F7 з’являється вікно, в якому виводиться вміст файлу-запису. (Я думаю вам зрозуміло, що дана форма також повинна бути описана в бібліотеці динамічного підключення. При натиску кнопки на клавіатурі система генерує повідомлення WM_KEYDOWN, при цьому у параметрі wparam зберігається віртуальний код клавіші, що біла натиснена. Віртуальний код записується константою що має префікс VK_. Для клавіші F7 – VK_F7)

Завдання на 6  балів:

 Завдання аналогічне попередньому, але пастка реагує також і на подвійний натиск миші (при чому повинно розрізнятись одинарний та подвійний натиски).Також програма повинна записувати і назву вікна, якому пересилається повідомлення. Вікно із вмістом файла  викликається по  натиску комбінації CTRL-F7.  

Бажаємо успіху.

 


 

А также другие работы, которые могут Вас заинтересовать

66693. Лицензирование программного обеспечения 46.26 KB
  Защита авторских прав распространяется на все виды программного обеспечения в том числе и на операционные системы и программные комплексы независимо от того на каком языке они написаны и в какой форме выражены включая исходный текст и объектный код ГК РФ часть 4 гл.
66694. А.С. Макаренко 142 KB
  Одну з кращих своїх статей, написану для ювілейного збірника з приводу п'ятиліття комуни імені Ф.Э.Дзержинського, Антон Семенович так і назвав «Педагоги знизують плечима». Ці люди не розуміли, що вже давно наступив момент, коли без теорії не можна стати гарним практиком...
66695. МАТРИЧНЫЕ (ИГОЛЬЧАТЫЕ) ПРИНТЕРЫ 105.5 KB
  В зависимости от технологии печати различают матричные струйные лазерные светодиодные сублимационные принтеры. От их количества зависит качество печати – в основном на рынке представлены матричные принтеры печатающая головка которых имеет 24 иголки плотность печати до 180 dpi.
66696. Технология и организация междугордных перевозок 92.5 KB
  За последние 10 лет парк автомобилей в России вырос почти в 25 раза. В 1999 году произошло существенное на 61 увеличение количества грузовых автомобилей в экономическом комплексе и впервые за последние годы зафиксирован рост объема грузовых автомобильных перевозок....
66697. Жизнь и научная деятельность Бориса Борисовича Полынова 376.55 KB
  Крупную роль в советском почвоведении играл Борис Борисович Полынов 1877 1952 гг. вышла в свет его книга Кора выветривания в которой были глубоко и всесторонне охарактеризованы основные фазы и главные типы кор выветривания Полынов 1934. Полынов одна из самых ярких личностей в советском почвоведении.
66699. Научный вклад Сергея Николаевича Виноградского в почвоведение 159.5 KB
  Кроме того Сергей Николаевич Виноградский объяснил процесс почвообразования показав что в почве существуют азотофиксирующие бактерии способные давать растениям необходимый для роста азот являющийся одним из главных лимитирующих факторов развития растений.
66700. Добровольский Глеб Всеволодович 111.53 KB
  Это вызвало повышенный интерес к проблемам экологии к проблемам биосферы Добровольский Г. Биография Глеб Всеволодович Добровольский академик Российской академии наук Президент Общества почвоведов при РАН известный почвоведэколог научная организационная...