Шаг 22 - Первый шаг для хакера, сканирование портов

Итак, задача нам нужно перебрать все порты. Смотрим код:

#include "stdafx.h"
#include "iostream.h"
#include "fstream.h"
#include "winsock2.h"
#include "iostream.h"

#pragma comment(lib,"wsock32.lib")

void ErrorInfo();

void main()
{	
	ofstream ofs;
	ofs.open("log.txt"); 
	WSADATA wsaData;
	if (WSAStartup(WINSOCK_VERSION, &wsaData)) 
	{
		printf ("winsock not be initialized !\n");
	} else {
		u_short  ushTestPort;
		for (ushTestPort=2828;ushTestPort< 65535;ushTestPort++)
		{
			cout << ushTestPort << endl;  
			SOCKET sock;
			sock = socket(AF_INET,SOCK_STREAM,0);
			if (sock!=INVALID_SOCKET) 
			{
				SOCKADDR_IN socketaddr;
				socketaddr.sin_family = AF_INET;
				socketaddr.sin_addr.s_addr = inet_addr("192.168.1.1"); 
				socketaddr.sin_port = htons(ushTestPort);
				int size=sizeof(socketaddr);
				sock=connect(sock,(LPSOCKADDR)&socketaddr,size);
				if (sock != SOCKET_ERROR )
				{
					cout << "Port " <<ushTestPort << endl;
					ofs <<"Port " << ushTestPort << endl;
				}
				else ErrorInfo();
				closesocket(sock);
			}
			else cout << "error create socket" << endl;
		}	
	}
	WSACleanup();
	ofs.close(); 
}

void ErrorInfo()
{
	int i=WSAGetLastError();
	int g;
	switch (i)
	{
	case WSANOTINITIALISED:
		cout << "Not start WinSock" << endl;
		break;
	   	case WSAENETDOWN:
		cout << "NetWork failed" << endl;
		break;
	case WSAEADDRINUSE:
		cout << "Socket in use " << endl;
		break;
    	case WSAEINTR:
		cout << "call  WSACancelBlockingCall" << endl;
		break;
    	case WSAEADDRNOTAVAIL:
		cout << "address not valid " << endl;
		break;
	case WSAETIMEDOUT:
		cout << "connection Time Out " << endl;
		break;
    	case WSAENOTSOCK:
		cout << "Not Socket " << endl;
		break;
    	case WSAECONNREFUSED:
		cout << "reject connection" << endl;
		break;
	default:
		cout << " ????? " << g << endl;
		cin >> g;
		break;
	}
}

Итак, все самое необходимое в цикле:

for (ushTestPort=2828;ushTestPort< 65535;ushTestPort++)
{
}

Создаем сокет, указываем ему IP адрес и порт и связываем наш сокет с удаленным функцией connect(). Дальше может быть две ситуации. Установлено соединение или нет. Если просто нет такого порта, то ошибка будет.

case WSAECONNREFUSED:
	cout << "reject connection" << endl;
	break;

Именно такая ошибка. Все остальные связаны с другими причинами, а эта с отсутствием порта. Их много причин. Я не все обрабатываю. Посмотрите на default обработки ошибки:

default:
	cout << " ????? " << g << endl;
	cin >> g;

Ошибка неизвестна и я специально останавливаю программу, чтобы можно было начать с этого места. Конечно можно было сделать все лучше, только зачем ??? Это учебная программа и пожалуйста не пользуйтесь ею в хакерских целях. А лучше покажите начальству и пусть денег выделяют на защиту информации. Для этого пожалуйста. А защита сама напрашивается. Если зафиксирован перебор портов и хоть два порта перебрали, да еще за короткий промежуток времени - отрубать надо все и лучше сразу сервер от питания :-)))


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 13.02.2001