|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Узагальнений алгоритм роботи програми
Пооператорний алгоритм роботи програми
Текст програми:
#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—
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.03 сек.) |