Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторные работы / Лабораторная работа 2

.docx
Скачиваний:
66
Добавлен:
15.02.2021
Размер:
144.14 Кб
Скачать

ФЕДЕРАЛЬНОЕ АГЕНСТВО СВЯЗИ

Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «Московский технический университет связи и информатики»

Центр заочного обучения по программам бакалавриата

Кафедра «Математической кибернетики и информационных технологий»

Лабораторная работа № 2.

«Процессы и потоки»

Выполнил: Иванов Иван, студент группы БСТ17хх

Цель работы:

Получение практических навыков в использовании Win32 API для исследования процессов.

Задание:

  • Разработать программное обеспечение, которое принимая дескриптор, имя или полное имя модуля, возвращает другие два элемента в своих выходных параметрах (выполнить задание для своей программы и для любой известной библиотеки).

  • Будет выполнять последовательно по шагам следующее:

  • Используя функцию GetCurrentProcessID определит идентификатор текущего процесса

  • Используя функцию GetCurrentProcess определит псевдодескриптор текущего процесса

  • Используя функцию DuplicateHandle и значение псевдодескриптора определит дескриптор текущего процесса

  • Используя функцию OpenProcess определит копию дескриптора текущего процесса

  • Закроет дескриптор, полученный функцией DuplicateHandle

  • Закроет дескриптор, полученный функцией OpenProcess

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

Результат работы программы:

Листинг кода программы.

#include <iostream>

#include <windows.h>

#include <shlwapi.h>

#include <tlhelp32.h>

BOOL ListProcessModules(DWORD dwPID);

BOOL ListProcessThreads(DWORD dwOwnerPID);

void PrintProcInfo()

{

// Выводит данные о текущем процессе

char filepath[256];

HMODULE moduleHandle;

GetModuleFileNameA(NULL, filepath, 256);

moduleHandle = GetModuleHandleA(NULL);

LPCSTR filename = PathFindFileNameA(filepath);

// Вывод

std::cout << "File name is: " << filename << "\n";

std::cout << "File path is: " << filepath << "\n";

std::cout << "Module handle is: " << moduleHandle << "\n";

}

void PrintProcInfo(HMODULE moduleHandle)

{

// Выводит данные по дескриптору модуля

char filepath[256];

GetModuleFileNameA(moduleHandle, filepath, 256);

LPCSTR filename = PathFindFileNameA(filepath);

// Вывод

std::cout << "File name is: " << filename << "\n";

std::cout << "File path is: " << filepath << "\n";

std::cout << "Module handle is: " << moduleHandle << "\n";

}

void PrintProcInfo(LPSTR moduleName)

{

// Выводит данные по имени модуля

char filepath[256];

HMODULE moduleHandle;

moduleHandle = GetModuleHandleA(moduleName);

GetModuleFileNameA(moduleHandle, filepath, 256);

LPCSTR filename = PathFindFileNameA(filepath);

// Вывод

std::cout << "File name is: " << filename << "\n";

std::cout << "File path is: " << filepath << "\n";

std::cout << "Module handle is: " << moduleHandle << "\n";

}

int main()

{

// Пункт 1, принимаются дескриптор, имя модуля или полное имя, выводятся два других элемента

const char *moduleName_1 = "Shlwapi.dll";

const char* moduleName_2 = "user32.dll";

HMODULE moduleHandle_2 = GetModuleHandleA(moduleName_2);

PrintProcInfo();

PrintProcInfo((LPSTR)moduleName_1);

PrintProcInfo(moduleHandle_2);

std::cout << "\n" << "\n";

// Пункт 2

DWORD currentProcID = GetCurrentProcessId();

HANDLE currentProcHandle = GetCurrentProcess();

HANDLE copyHandle;

DuplicateHandle(currentProcHandle, currentProcHandle, currentProcHandle, &copyHandle, PROCESS_ALL_ACCESS, false, 0);

HANDLE currentProcHandle_1 = OpenProcess(PROCESS_ALL_ACCESS, false, currentProcID);

// BOOL closed_1 = CloseHandle(currentProcHandle_1);

// BOOL closed_2 = CloseHandle(copyHandle);

// Вывод

std::cout << "Current Process ID: " << currentProcID << "\n";

std::cout << "Pseudo-handle: " << currentProcHandle << "\n";

std::cout << "Handle obtained by DuplicateHandle function: " << copyHandle << "\n";

std::cout << "Handle obtained by OpenProcess function: " << currentProcHandle_1 << "\n";

std::cout << "Close Handle obtained by OpenProcess function: " << currentProcHandle_1 << "\n";

std::cout << "Close Handle obtained by DuplicateHandle function: " << copyHandle << "\n";

CloseHandle(currentProcHandle_1);

CloseHandle(copyHandle);

system("pause");

// Пункт 3

PROCESSENTRY32 pe;

HANDLE tl32snap = INVALID_HANDLE_VALUE;

tl32snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if (tl32snap == INVALID_HANDLE_VALUE)

exit(1);

pe.dwSize = sizeof(PROCESSENTRY32);

if (!Process32First(tl32snap, &pe))

{

exit(1);

}

do

{

std::cout << "Process ID: " << pe.th32ProcessID << "\n" ;

std::cout << "Thread count: " << pe.cntThreads << "\n";

std::cout << "Parent process ID: " << pe.th32ParentProcessID << "\n";

ListProcessModules(pe.th32ProcessID);

ListProcessThreads(pe.th32ProcessID);

} while (Process32Next(tl32snap, &pe));

CloseHandle(tl32snap);

system("pause");

}

BOOL ListProcessModules(DWORD dwPID)

{

HANDLE hModuleSnap = INVALID_HANDLE_VALUE;

MODULEENTRY32 me32;

hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);

if (hModuleSnap == INVALID_HANDLE_VALUE)

return(FALSE);

me32.dwSize = sizeof(MODULEENTRY32);

if (!Module32First(hModuleSnap, &me32))

{

CloseHandle(hModuleSnap);

return(FALSE);

}

do

{

std::wcout << "Module Name: " << me32.szModule << "\n";

std::wcout << "Executable: " << me32.szExePath << "\n";

std::cout << "Process ID: " << me32.th32ProcessID << "\n";

std::cout << "Ref count (g): " << me32.GlblcntUsage << "\n";

std::cout << "Ref count (p): " << me32.ProccntUsage << "\n";

std::cout << "Base address: " << (DWORD)me32.modBaseAddr << "\n";

std::cout << "Base size: " << me32.modBaseSize << "\n";

} while (Module32Next(hModuleSnap, &me32));

CloseHandle(hModuleSnap);

return(TRUE);

}

BOOL ListProcessThreads(DWORD dwOwnerPID)

{

HANDLE hThreadSnap = INVALID_HANDLE_VALUE;

THREADENTRY32 te32;

hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);

if (hThreadSnap == INVALID_HANDLE_VALUE)

return(FALSE);

te32.dwSize = sizeof(THREADENTRY32);

if (!Thread32First(hThreadSnap, &te32))

{

CloseHandle(hThreadSnap);

return(FALSE);

}

do

{

if (te32.th32OwnerProcessID == dwOwnerPID)

{

std::cout << "THREAD ID: " << te32.th32ThreadID << "\n";

std::cout << "Base priority: " << te32.tpBasePri << "\n";

std::cout << "Delta priority: " << te32.tpDeltaPri << "\n";

std::cout << "\n";

}

} while (Thread32Next(hThreadSnap, &te32));

CloseHandle(hThreadSnap);

return(TRUE);

}

Москва 2020