АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Узагальнений алгоритм роботи програми

Читайте также:
  1. I. Мета, завдання та загальні вимоги до виконання курсової роботи
  2. II Методика виконання курсової роботи.
  3. II. ЗМІСТ І ОФОРМЛЕННЯ РОБОТИ
  4. IV. Алгоритм действий командира (начальника) при увольнении военнослужащего в связи с невыполнением им условий контракта
  5. IX. СИГНАЛИ, ЩО ЗАСТОСОВУЮТЬСЯ ПІД ЧАС МАНЕВРОВОЇ РОБОТИ
  6. LZW-модификация алгоритма Лемпеля-Зива
  7. VI Поточний контроль виконання роботи
  8. VI Поточний контроль виконання роботи
  9. VI Поточний контроль виконання роботи
  10. VI Поточний контроль виконання роботи
  11. VI. Методичні вказівки до виконання курсової роботи.
  12. VIІ Поточний контроль виконання роботи

 

Пооператорний алгоритм роботи програми

 

 

 

Текст програми:

 

#include "stdafx.h"

 

//Функция обработки сообщений диалогового окна

INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {

static HANDLE hLogFile;

static SOCKET s;

 

static HWND hStartButton;

static HWND hStopButton;

 

static HWND hIDC_CHECK_PROTO_ICMPWnd;

 

static HWND hIDC_CHECK_OPTION_LOG_TARGET_IPWnd;

static HWND hIDC_CHECK_OPTION_LOG_SENDER_IPWnd;

static HWND hIDC_CHECK_OPTION_WRITE_PROTO_NAMEWnd;

static HWND hIDC_CHECK_OPTION_WRITE_PACKET_LENWnd;

 

static HWND hIDC_EDIT_LOG_FILENAMEWnd;

 

switch (uMsg) {

case WM_INITDIALOG:

 

CheckDlgButton(hwndDlg, IDC_CHECK_PROTO_ALL, BST_CHECKED);

CheckDlgButton(hwndDlg, IDC_CHECK_OPTION_LOG_TARGET_IP, BST_CHECKED);

CheckDlgButton(hwndDlg, IDC_CHECK_OPTION_LOG_SENDER_IP, BST_CHECKED);

CheckDlgButton(hwndDlg, IDC_CHECK_OPTION_WRITE_PROTO_NAME, BST_CHECKED);

CheckDlgButton(hwndDlg, IDC_CHECK_OPTION_WRITE_PACKET_LEN, BST_CHECKED);

 

SendDlgItemMessage(hwndDlg, IDC_EDIT_LOG_FILENAME, EM_LIMITTEXT, _MAX_FNAME - 1, 0);

SetDlgItemText(hwndDlg, IDC_EDIT_LOG_FILENAME, "sniff.log");

 

hStartButton = GetDlgItem(hwndDlg, IDC_BUTTON_START);

hStopButton = GetDlgItem(hwndDlg, IDC_BUTTON_STOP);

hIDC_CHECK_PROTO_ICMPWnd = GetDlgItem(hwndDlg, IDC_CHECK_PROTO_ICMP);

 

hIDC_CHECK_OPTION_LOG_TARGET_IPWnd = GetDlgItem(hwndDlg, IDC_CHECK_OPTION_LOG_TARGET_IP);

hIDC_CHECK_OPTION_LOG_SENDER_IPWnd = GetDlgItem(hwndDlg, IDC_CHECK_OPTION_LOG_SENDER_IP);

hIDC_CHECK_OPTION_WRITE_PROTO_NAMEWnd = GetDlgItem(hwndDlg, IDC_CHECK_OPTION_WRITE_PROTO_NAME);

hIDC_CHECK_OPTION_WRITE_PACKET_LENWnd = GetDlgItem(hwndDlg, IDC_CHECK_OPTION_WRITE_PACKET_LEN);

 

hIDC_EDIT_LOG_FILENAMEWnd = GetDlgItem(hwndDlg, IDC_EDIT_LOG_FILENAME);

 

WSADATA wsadata;

 

//Инициализация сокетов

if (WSAStartup(MAKEWORD(2, 2), &wsadata)!= 0) {

SetDlgItemText(hwndDlg, IDC_EDIT_STATUS, "Ошибка. Не удается инициализировать сокеты.");

} else {

SetDlgItemText(hwndDlg, IDC_EDIT_STATUS, "Сокеты инициализированы.");

}

 

//Создание сокета

s = socket(AF_INET, SOCK_RAW, IPPROTO_IP);

if (s == INVALID_SOCKET) {

SetDlgItemText(hwndDlg, IDC_EDIT_STATUS, "Ошибка. Не удается создать сокет.");

} else {

SetDlgItemText(hwndDlg, IDC_EDIT_STATUS, "Сокет создан.");

 

CHAR szHostName[16];

 

//Получение имени локального хоста

if (gethostname(szHostName, sizeof szHostName)!= 0) {

SetDlgItemText(hwndDlg, IDC_EDIT_STATUS, "Ошибка. Не удается определить имя хоста.");

} else {

SetDlgItemText(hwndDlg, IDC_EDIT_STATUS, "Имя хоста получено.");

 

//Получение информаций о локальном хосте

HOSTENT *phe = gethostbyname(szHostName);

 

if (phe == NULL) {

SetDlgItemText(hwndDlg, IDC_EDIT_STATUS, "Ошибка. Не удается получить описание хоста.");

} else {

SetDlgItemText(hwndDlg, IDC_EDIT_STATUS, "Описание хоста получено.");

 

SOCKADDR_IN sa; //Адрес хоста

 

ZeroMemory(&sa,sizeof sa);

sa.sin_family = AF_INET;

sa.sin_addr.s_addr = ((struct in_addr*)phe->h_addr_list[0])->s_addr;

 

//Связывание локального адреса и сокета

if (bind(s, (SOCKADDR*)&sa, sizeof SOCKADDR)!= 0) {

SetDlgItemText(hwndDlg, IDC_EDIT_STATUS, "Ошибка. Не удается осуществить привязку сокета.");;

} else {

SetDlgItemText(hwndDlg, IDC_EDIT_STATUS, "Сокет привязан.");

 

//Включение promiscuous mode

DWORD flag = TRUE; //Флаг PROMISC Вкл/Выкл

 

if (ioctlsocket(s, SIO_RCVALL, &flag) == SOCKET_ERROR) {

SetDlgItemText(hwndDlg, IDC_EDIT_STATUS, "Ошибка. Не удается включить режим promiscuous.");

} else {

SetDlgItemText(hwndDlg, IDC_EDIT_STATUS, "Режим promiscuous включен.");

 

//Разблокирование кнопки "Старт"

EnableWindow(hStartButton, TRUE);

}

}

}

}

}

return TRUE;

 

case WM_COMMAND:

switch (HIWORD(wParam)) {

case EN_UPDATE:

if (LOWORD(wParam) == IDC_EDIT_LOG_FILENAME) {

CHAR szFileName[_MAX_FNAME];

DWORD dwFileSize = 0;

 

GetDlgItemText(hwndDlg, IDC_EDIT_LOG_FILENAME, szFileName, _MAX_FNAME);

 

HANDLE hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);

if (hFile!= INVALID_HANDLE_VALUE) {

dwFileSize = GetFileSize(hFile, NULL);

CloseHandle(hFile);

}

SetDlgItemInt(hwndDlg, IDC_EDIT_LOG_SIZE, dwFileSize, FALSE);

}

break;

}

 

switch (LOWORD(wParam)) {

case IDC_CHECK_PROTO_ALL: {

BOOL bChecked = IsDlgButtonChecked(hwndDlg, IDC_CHECK_PROTO_ALL);

 

EnableWindow(hIDC_CHECK_PROTO_ICMPWnd,!bChecked);

}

break;

 

case IDC_BUTTON_START:

//Создаем файл лога

CHAR szFileName[_MAX_FNAME];

 

GetDlgItemText(hwndDlg, IDC_EDIT_LOG_FILENAME, szFileName, _MAX_FNAME);

 

hLogFile = CreateFile(szFileName, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, 0, 0);

if (hLogFile == INVALID_HANDLE_VALUE) {

SetDlgItemText(hwndDlg, IDC_EDIT_STATUS, "Ошибка. Не удается создать лог-файл.");

} else {

SetDlgItemText(hwndDlg, IDC_EDIT_STATUS, "Лог-файл создан (открыт).");

 

SetFilePointer(hLogFile, 0, NULL, FILE_END);

 

EnableWindow(hStartButton, FALSE);

EnableWindow(hStopButton, TRUE);

 

EnableWindow(hIDC_CHECK_PROTO_ICMPWnd, FALSE);

 

EnableWindow(hIDC_CHECK_OPTION_LOG_TARGET_IPWnd, FALSE);

EnableWindow(hIDC_CHECK_OPTION_LOG_SENDER_IPWnd, FALSE);

EnableWindow(hIDC_CHECK_OPTION_WRITE_PROTO_NAMEWnd, FALSE);

EnableWindow(hIDC_CHECK_OPTION_WRITE_PACKET_LENWnd, FALSE);

 

EnableWindow(hIDC_EDIT_LOG_FILENAMEWnd, FALSE);

 

//Связываем событие FD_READ с окном

WSAAsyncSelect(s, hwndDlg, WM_RECV, FD_READ);

 

SetDlgItemText(hwndDlg, IDC_EDIT_STATUS, "Прием пакетов.");

}

break;

 

case IDC_BUTTON_STOP:

DWORD flag;

BOOL bChecked;

 

CloseHandle(hLogFile);

 

EnableWindow(hIDC_EDIT_LOG_FILENAMEWnd, TRUE);

 

EnableWindow(hIDC_CHECK_OPTION_LOG_TARGET_IPWnd, TRUE);

EnableWindow(hIDC_CHECK_OPTION_LOG_SENDER_IPWnd, TRUE);

EnableWindow(hIDC_CHECK_OPTION_WRITE_PROTO_NAMEWnd, TRUE);

EnableWindow(hIDC_CHECK_OPTION_WRITE_PACKET_LENWnd, TRUE);

 

EnableWindow(hStopButton, FALSE);

 

//EnableWindow(hIDC_CHECK_PROTO_ALLWnd, TRUE);

EnableWindow(hIDC_CHECK_PROTO_ICMPWnd, TRUE);

 

bChecked = IsDlgButtonChecked(hwndDlg, IDC_CHECK_PROTO_ALL);

 

EnableWindow(hIDC_CHECK_PROTO_ICMPWnd,!bChecked);

 

//Включение promiscuous mode

flag = TRUE; //Флаг PROMISC Вкл/Выкл

 

if (ioctlsocket(s, SIO_RCVALL, &flag) == SOCKET_ERROR) {

SetDlgItemText(hwndDlg, IDC_EDIT_STATUS, "Ошибка. Не удается включить режим promiscuous.");

} else {

SetDlgItemText(hwndDlg, IDC_EDIT_STATUS, "Режим promiscuous включен.");

 

EnableWindow(hStartButton, TRUE);

}

 

break;

 

case IDC_BUTTON_ABOUT:

DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG_ABOUT), hwndDlg, AboutDialogProc);

break;

 

case IDC_BUTTON_CLOSE:

SendMessage(hwndDlg, WM_CLOSE, 0, 0);

break;

}

return TRUE;

 

case WM_RECV:

if (WSAGETSELECTERROR(lParam)) {

} else {

if (WSAGETSELECTEVENT(lParam) == FD_READ) {

//Буфер размера 64 Кб

CHAR btBuffer[65536];

 

//Получаем входящие данные

if (recv(s, btBuffer, sizeof(btBuffer), 0) >= sizeof(IPHeader)) {

IPHeader* hdr = (IPHeader*)btBuffer;

 

//Вычисляем размер. Т.к. в сети принят прямой порядок байт,

//а не обратный, то придется поменять байты местами.

WORD size = (hdr->iph_length << 8) + (hdr->iph_length >> 8);

 

//Получен пакет?

if (size >= 60 && size <= 1500) {

//Проверяем протокол

if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_PROTO_ALL)!= TRUE) {

if (hdr->iph_protocol == IPPROTO_ICMP && IsDlgButtonChecked(hwndDlg, IDC_CHECK_PROTO_ICMP) == TRUE) {

return TRUE;

}

}

 

DWORD dwWritten;

 

//Записываем данные

WriteFile(hLogFile, "--Packet begin--\r\n", 18, &dwWritten, 0);

 

if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_OPTION_LOG_TARGET_IP) == TRUE) {

IN_ADDR ia;

 

ia.s_addr = hdr->iph_dest;

CHAR *pszTargetIP = inet_ntoa(ia);

 

WriteFile(hLogFile, "To: ", 4, &dwWritten, 0);

WriteFile(hLogFile, pszTargetIP, lstrlen(pszTargetIP), &dwWritten, 0);

WriteFile(hLogFile, "\r\n", 2, &dwWritten, 0);

}

 

if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_OPTION_LOG_SENDER_IP) == TRUE) {

IN_ADDR ia;

 

ia.s_addr = hdr->iph_src;

CHAR *pszSourceIP = inet_ntoa(ia);

 

WriteFile(hLogFile, "From: ", 6, &dwWritten, 0);

WriteFile(hLogFile, pszSourceIP, lstrlen(pszSourceIP), &dwWritten, 0);

WriteFile(hLogFile, "\r\n", 2, &dwWritten, 0);

}

 

if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_OPTION_WRITE_PROTO_NAME) == TRUE) {

WriteFile(hLogFile, "Protocol: ", 10, &dwWritten, 0);

 

switch (hdr->iph_protocol) {

 

case IPPROTO_ICMP:

WriteFile(hLogFile, "ICMP\r\n", 6, &dwWritten, 0);

break;

 

}

}

 

if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_OPTION_WRITE_PACKET_LEN) == TRUE) {

CHAR szTemp[17];

 

WriteFile(hLogFile, "Packet length: ", 15, &dwWritten, 0);

wsprintf(szTemp, "%d\r\n", size);

WriteFile(hLogFile, szTemp, lstrlen(szTemp), &dwWritten, 0);

}

 

WriteFile(hLogFile, "Contents:\r\n\r\n", 13, &dwWritten, 0);

WriteFile(hLogFile, &btBuffer[sizeof(IPHeader) * 2], size - sizeof(IPHeader) * 2, &dwWritten, 0);

WriteFile(hLogFile, "\r\n--Packet end--\r\n", 18, &dwWritten, 0);

 

SetDlgItemInt(hwndDlg, IDC_EDIT_LOG_SIZE, GetFileSize(hLogFile, NULL), FALSE);

}

}

}

}

return TRUE;

 

case WM_CLOSE:

//Конец работы с сокетами

closesocket(s);

WSACleanup();

 

//Конец работы с логом

CloseHandle(hLogFile);

 

//Закрытие окна

EndDialog(hwndDlg, 0);

return TRUE;

}

return FALSE;

}

 

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {

//Проверяем версию системы

if (LOBYTE(LOWORD(GetVersion())) < 5) {

MessageBox(0, "Данный сниффер работает только в системе Windows 2000 и младше.", "sniff", MB_ICONEXCLAMATION);

return 0;

}

 

//Проверяем, что запущен единственный процесс сниффера

if (AreWeAlone("-=sniff=-") == FALSE) {

MessageBox(0, "Сниффер уже запущен.", "sniff", MB_ICONEXCLAMATION);

return 0;

}

 

//Устанавливаем текущую директорию

CHAR szCurDir[MAX_PATH];

 

GetModuleFileName(NULL, szCurDir, MAX_PATH);

*strrchr(szCurDir, '\\') = 0;

SetCurrentDirectory(szCurDir);

 

if (IsCurrentUserAdmin() == FALSE) {

MessageBox(0, "У Вас нет прав администратора. Вы не сможете включить promiscuous mode.", "sniff", MB_ICONEXCLAMATION);

}

 

//Создаем главное окно программы

if (DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, DialogProc)!= 0) {

MessageBox(0, "Не удается создать главное окно сниффера.", "sniff", MB_ICONERROR);

return 0;

}

return 0;

}

 

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

Після натискання на кнопку Старт

 

 

Файл sniff.log містить наступну інформацію:

--Packet begin--

To: 10.224.18.66

From: 10.176.2.39

Protocol: Packet length: 138

Contents:

 

Downloads\Наша раша 4 сезон 21/21TTH:NDMF6AAA7C7QC2OUKQACAV6OAKED2QAAEBL44AQ (77.244.45.130:411)|

--Packet end--

--Packet begin--

To: 10.224.18.66

From: 10.176.2.39

Protocol: Packet length: 189

Contents:

 

Downloads\Наша раша 4 сезон\nasha.russia.(48).www.kvnforall.info.avi231723008 21/21TTH:KF75XA6M5XTBWPGH75VGCMMENLQJDS3JJMTA5KY (77.244.45.130:411)|

--Packet end--

--Packet begin--

To: 10.224.18.66

From: 10.176.2.39

Protocol: Packet length: 189

Contents:

 

Downloads\Наша раша 4 сезон\nasha.russia.(49).www.kvnforall.info.avi220080128 21/21TTH:ZT3ERY4C4NWBLCSN2ZCJHDGC7X5PFOEBWWKDIMA (77.244.45.130:411)|

--Packet end—

 


1 | 2 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.031 сек.)