🧙Конкурс сказок!
[Archivе]
(OFF) CyberGods_Alice 16 сен 2015

http сниффер

использовано visual c++

#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <winsock2.h>
#include <time.h>


#define MAX_PACKET_SIZE 0x10000
#define SIO_RCVALL 0x98000001
// Буфер для приёма данных
//char Buffer[MAX_PACKET_SIZE]; // 64 Kb
char *buffer;
char *data;
char *s_http;

char http_req1[] = "GET /";
char http_req2[] = "POST /";
FILE *stream = NULL;


void print_log(char *msg)
{
struct tm *ptr = NULL;
time_t lt;

lt = time(NULL);
ptr = localtime(&lt);

fprintf(stream,"\n>>> Detected HTTP-request %s\n",asctime(ptr));
fprintf(stream,"%s\n",msg);

return;
}


int _tmain(int argc, _TCHAR* argv[])
{

//Структура заголовка IP-пакета


typedef struct IPHeader {
UCHAR iph_verlen; // версия и длина заголовка
UCHAR iph_tos; // тип сервиса
USHORT iph_length; // длина всего пакета
USHORT iph_id; // Идентификация
USHORT iph_offset; // флаги и смещения
UCHAR iph_ttl; // время жизни пакета
UCHAR iph_protocol; // протокол
USHORT iph_xsum; // контрольная сумма
ULONG iph_src; // IP-адрес отправителя
ULONG iph_dest; // IP-адрес назначения

ULONG iph_res1; // res1
ULONG iph_res2; // res2
} IPHeader;

char src[10] = "\0";
char dest[10] = "\0";
unsigned short lowbyte;
unsigned short hibyte;
USHORT hdr_size = sizeof(IPHeader); // 28 bytes


WSADATA wsadata; // Инициализация WinSock.
SOCKET s; // Cлущающий сокет.
char name[128]; // Имя хоста (компьютера).
HOSTENT* phe; // Информация о хосте.
SOCKADDR_IN sa; // Адрес хоста
//IN_ADDR sa1; //
unsigned long flag = 1; // Флаг PROMISC Вкл/выкл.

printf("HTTP-monitor v.1.0 W32\n(c) 2012 Dmitry Rusov 2509094@mail.ru\nUsage: %s [log file]\n",argv[0]);

if (argc <= 1)
{
printf("Log file not specified. Using stdout.\n");
stream = stdout;
} else
{
if ((stream = fopen( argv[1], "w" )) == NULL)
{
printf("Cannot open file: `%s'. Using stdout.\n",argv[1]);
stream = stdout;
} else
printf("Using log file: `%s'.\n",argv[1]);
}

// инициализация
int res;
res = WSAStartup(MAKEWORD(2,2), &wsadata);
if (res != NO_ERROR) {
printf("WSAStartup failed: %d\n", res);
exit(1);
}


s = socket( AF_INET, SOCK_RAW, IPPROTO_IP );
if (s == INVALID_SOCKET) {
printf("Error at socket(): %ld\n", WSAGetLastError() );
WSACleanup();
exit(1);
}

gethostname(name, sizeof(name));
phe = gethostbyname( name );
ZeroMemory( &sa, sizeof(sa) );
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = ((struct in_addr *)phe->h_addr_list[0])->s_addr;


res = bind(s, (SOCKADDR *)&sa, sizeof(SOCKADDR));
if (res != NO_ERROR) {
printf("bind socket failed: %d\n", res);
exit(1);
}

printf("Listeing on: %s\n",inet_ntoa(sa.sin_addr));

// Включение promiscuous mode.
ioctlsocket(s, SIO_RCVALL, &flag);

while( TRUE )
{
int count;
buffer = (char *)malloc(MAX_PACKET_SIZE+1);
count = recv( s, (char *)buffer, MAX_PACKET_SIZE, 0 );

if( count < sizeof(IPHeader) ) break;

IPHeader* hdr;
hdr = (IPHeader *)malloc(sizeof(IPHeader));
memcpy(hdr,buffer,sizeof(IPHeader));
memset(buffer,'>',sizeof(IPHeader));

lowbyte = hdr->iph_length>>8;
hibyte = hdr->iph_length<<8;
hibyte = hibyte + lowbyte;
//printf("%u",hibyte);

if (count != hibyte)
{
printf("\nIncorrect pkt size. read=%d len=%d\n", count, hibyte);
free(hdr);
free(buffer);
break;
}

USHORT data_size = hibyte - hdr_size;

data = (char *)malloc(data_size+1);

int i;
for (i=0; i<data_size; i++)
{
if (buffer[i+hdr_size])
data[i] = buffer[i+hdr_size]; else
data[i] = ' ';
}


data[data_size] = '\0';


if ((s_http = strstr(data, http_req2)) != NULL) print_log(s_http);

if ((s_http = strstr(data, http_req1)) != NULL) print_log(s_http);


free(hdr);
free(buffer);
free(data);
}

closesocket( s );
WSACleanup();


return 0;
}

Комментарии (1)

Тема перенесена Dephkaleon из [с++] в [Archivе] (28 сен 2015)
Показать комментарий
Скрыть комментарий
Для добавления комментариев необходимо авторизоваться
[Archivе]
Родная деревня
Так увлекательно вести хозяйство Вам ещё никогда...
Тема: Светлая | Тёмная
Версия: Mobile | Lite | Touch | Доступно в Google Play