PDA

Просмотр полной версии : Перехват пакетов


WON
19.01.2009, 22:31
Решил написать программку для пеерхвата пакетов только для моего компьютера, для начала хотя бы читать их содержимое...
Начал писать на С++, но прога не очень то и работает... Непонятно когда и по каким принцыпам(лично для меня так) она выводит содержимое пакетов(и то не всё)... Может мне ктонибудь подскажет аглоритм и программые методы для осуществение моей цели...

#include <winsock2.h>
#include <windows.h>
#include <iostream.h>
#include <conio.h>
#include <stdio.h>

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

int main()
{
WSADATA wd;
char buff[1000];
SOCKET s, news;
sockaddr_in sin, newsin;

sin.sin_family = AF_INET;
sin.sin_port = htons(2593);
sin.sin_addr.s_addr = inet_addr("127.0.0.1");

if(FAILED(WSAStartup( MAKEWORD(2,2), &wd)) )
{
cout<<"WSA error - "<<WSAGetLastError()<<endl;
return -1;
}

if( (s=socket(AF_INET,SOCK_STREAM,0)) == -1 )
{
cout<<"WSA error - "<<WSAGetLastError()<<endl;
return -1;
}

if(bind(s, (sockaddr*)&sin, sizeof(sin) ) == -1 )
{
cout<<"Can't bind"<<endl;
return -1;
}

cout<<"Wait for connections..."<<endl;
int i=0, len = sizeof(newsin);
if(listen(s,5) == -1)
{
cout<<"Cant listen"<<endl;
}
int c = 0, tmp;
while( c < 1 )
{
if( (news = accept(s, (sockaddr*)&newsin, &len)) == INVALID_SOCKET )
{
cout<<"Accept failed"<<endl;
getch();
return -1;
}
else
{
cout<<"New client "<<c<<endl;
int msg;
if(FAILED(msg = recv(news, buff, sizeof(buff),0 )))
return E_FAIL;
for(int i = 0; i < 1000; i++)
if( isalnum(buff[i]) )
cout<<buff[i];
cout<<endl;
//closesocket(news);
++c;
}
}

tmp = recv(news,buff, sizeof(buff),0 );
if( tmp != SOCKET_ERROR )
for(int i = 0; i < 1000; i++)
if( isalnum(buff[i]) )
cout<<buff[i];
tmp = recv(news,buff, sizeof(buff),0 );
if( tmp != SOCKET_ERROR )
for(int i = 0; i < 1000; i++)
if( isalnum(buff[i]) )
cout<<buff[i];

closesocket(s);
closesocket(news);
WSACleanup();

return 0;
}
Код как я сам понимаю - бред...

Qws
19.01.2009, 22:43
Почемуже бред?В некоторих местах криво,хотя в полне прилично))))
Зы:Я новичок:))))

criz
19.01.2009, 22:45
эммм...у меня глюк или ты не перевел интерфейс в promisc-режим?
http://forum.antichat.ru/showthread.php?p=1011673
ТС, твой код пример обычного клиент/сервернго приложения...тока без клиента)))

WON
19.01.2009, 23:54
Почемуже бред?В некоторих местах криво,хотя в полне прилично))))
Зы:Я новичок:))))

Я например захожу в КС... оно должно мне выводить на экран содержимое пакетов при игре а оно мне выводит пустоту напостой..

эммм...у меня глюк или ты не перевел интерфейс в promisc-режим?
http://forum.antichat.ru/showthread.php?p=1011673
ТС, твой код пример обычного клиент/сервернго приложения...тока без клиента)))
это да... за ссылочку спасибо.. но там заумный для меня код... может есть что по проще... может на Delphi... И ещё по той ссылке что ты мне дал упоминался WinAPI и сетевые протоколы низких уровней... Может они проще...

SlyBit
20.01.2009, 00:49
WON

Твой код не предназначен для перехвата пакетов.

Тут http://www.ntkernel.com/w&p.php?id=14 расписаны методы перехвата пакетов, позволяющие их редактировать.

Самый простой способ внедрять в каждый процесс библиотеку, перехватывающую функции для работы с сокетами (модификация IAT или сплайзинг connect, send, sendto, WSASend, WSASendTo, recv, recvfrom, WSARecv).

Dr Flint
20.01.2009, 00:51
чем тебе пабликовские сниферы не нравятся?)

criz
20.01.2009, 07:51
но там заумный для меня код... может есть что по проще... может на Delphi... И ещё по той ссылке что ты мне дал упоминался WinAPI и сетевые протоколы низких уровней... Может они проще...
В первом твоем посте С-шный код, я тебе дал ссылку на С-шный код.
Может тебе надо сначала ознакомиться с документацией по TCP/IP? Потом код не будет казаться "заумным" ;)

WON
20.01.2009, 16:42
В первом твоем посте С-шный код, я тебе дал ссылку на С-шный код.
Может тебе надо сначала ознакомиться с документацией по TCP/IP? Потом код не будет казаться "заумным" ;)

Чесно говря я не пытался казаться "заумным", просто в той ссылке что ты мне дал говорилось что есть готовые WinAPI функции и что с ними легче рабаотать... Спасибо... буду разбираться с тем кодом что есть...

Pernat1y
20.01.2009, 16:46
глянь сорцы того-же wireshark'a. он на Сях-же, вроде

criz
20.01.2009, 16:51
WON, твой код отличается несколькими строчками: нет перевода интерфейса в promisc-режим и другой вывод информации ;)
З.Ы. ну еще там IP-заголовок описан.

xismyname
21.01.2009, 21:25
Чесно говря я не пытался казаться "заумным", просто в той ссылке что ты мне дал говорилось что есть готовые WinAPI функции и что с ними легче рабаотать... Спасибо... буду разбираться с тем кодом что есть...

Мужик тебе функция accept() не нужна для перехвата пакетов, по той ссылке что скинул Criz все понятно показано,вот одна проблема - тот код не работает на некоторых Windows .

Если ты хочешь принимать только те пакету которые предназначены для твоей машины то переводит сокет в режим promisc тебе незачем.

Вот код,для перехвата пакетов предназначенных для твоего компа.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <mstcpip.h>
#include <conio.h>

typedef struct{
unsigned int version : 4;
unsigned int h_len : 4;
unsigned int tos : 8;
unsigned int tot_len : 16;
unsigned int ID : 16;
unsigned int flags : 3;
unsigned int f_offset : 13;
unsigned int TTL : 8;
unsigned int protocol : 8;
unsigned int h_checksum : 16;
unsigned int srcip : 32;
unsigned int dstip : 32;
}IPHEADER;

int main(void)
{
SOCKADDR_IN addr;
WSADATA wsd;
SOCKET mSocket;
HOSTENT *host;
IPHEADER *ip;
unsigned long mode = 1;
int len;
char pcname[32];
char buf[sizeof(IPHEADER)];


/* load windows socket interface */
if(WSAStartup(MAKEWORD(2,2),&wsd) != 0)
{
puts("Could not load winsocket api");
exit(1);
}

/* Get computer name */
len = sizeof(pcname) - 1;
GetComputerNameA(pcname,&len);
len = 0;

/* Get host IP address by name */
host = gethostbyname(pcname);

/* Set addr & buf to 0 */
memset(&addr,0,sizeof(addr));
memset(buf,0,sizeof(buf));

/* init. local address & create raw socket */
addr.sin_addr.s_addr = ((struct in_addr*)host->h_addr_list[0])->s_addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(0);
mSocket = socket(AF_INET,SOCK_RAW,IPPROTO_IP);

if(mSocket == INVALID_SOCKET)
{
puts("Could not create a RAW socket");
exit(1);
}

/* Bind socket with local address */
if(bind(mSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR)) != -1)
{
/*-----------------------------------------------*/
int x = 1;
while(!kbhit())
{
len = recv(mSocket,buf,sizeof(buf),0);

/* Check received data */
if(len >= sizeof(IPHEADER))
{
ip = (IPHEADER*)buf;
printf("\n+--------- %d ------------+\n",x++);

printf("| DEST : %s\n",inet_ntoa(*((struct in_addr*)&ip->dstip)));
printf("| SRC : %s\n",inet_ntoa(*((struct in_addr*)&ip->srcip)));
printf("| VERSION : %d\n",ip->version);

printf("+------------------------+\n");

}
}
}
else
{
puts("Could not bind");
}
}

WON
21.01.2009, 23:24
xismyname а на чём ты компилируешь...? Я на VS 6.0, подключаю
#pragma comment( lib, "wsock32.lib" ) и у меня выскакиевает 60 error(s), 19 warning(s) непонятного содержания...

criz
22.01.2009, 00:23
Пробуй так:
#pragma comment(lib, "ws2_32.lib")

Chaak
22.01.2009, 01:10
windows.h подключай после winsock2, а не наоборот

xismyname
22.01.2009, 20:44
xismyname а на чём ты компилируешь...? Я на VS 6.0, подключаю
#pragma comment( lib, "wsock32.lib" ) и у меня выскакиевает 60 error(s), 19 warning(s) непонятного содержания...


В Lcc-win32.

Если выдает ошибку убери файлы mstcpip.h и ws2tcpip.h.

sn0w
25.01.2009, 12:18
бери WinPCAP - там целый фреймворк по захвату и фильтрации пакетов, не ошибешься

WON
07.02.2009, 01:12
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <winsock2.h>
#include <windows.h>
#include <conio.h>

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

typedef struct{
unsigned int version : 4;
unsigned int h_len : 4;
unsigned int tos : 8;
unsigned int tot_len : 16;
unsigned int ID : 16;
unsigned int flags : 3;
unsigned int f_offset : 13;
unsigned int TTL : 8;
unsigned int protocol : 8;
unsigned int h_checksum : 16;
unsigned int srcip : 32;
unsigned int dstip : 32;
}IPHEADER;

int main(void)
{
SOCKADDR_IN addr;
WSADATA wsd;
SOCKET mSocket;
HOSTENT *host;
IPHEADER *ip;
unsigned long mode = 1;
int len;
char pcname[32];
char buf[sizeof(IPHEADER)];


/* load windows socket interface */
if(WSAStartup(MAKEWORD(2,2),&wsd) != 0)
{
puts("Could not load winsocket api");
exit(1);
}

/* Get computer name */
len = sizeof(pcname) - 1;
GetComputerNameA(pcname, (unsigned long *)len);
len = 0;

/* Get host IP address by name */
host = gethostbyname(pcname);

/* Set addr & buf to 0 */
memset(&addr,0,sizeof(addr));
memset(buf,0,sizeof(buf));

/* init. local address & create raw socket */
addr.sin_addr.s_addr = ((struct in_addr*)host->h_addr_list[0])->s_addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(0);
mSocket = socket(AF_INET,SOCK_RAW,IPPROTO_IP);

if(mSocket == INVALID_SOCKET)
{
puts("Could not create a RAW socket");
exit(1);
}

/* Bind socket with local address */
if(bind(mSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR)) != -1)
{
/*-----------------------------------------------*/
int x = 1;
while(!kbhit())
{
len = recv(mSocket,buf,sizeof(buf),0);

/* Check received data */
if(len >= sizeof(IPHEADER))
{
ip = (IPHEADER*)buf;
printf("\n+--------- %d ------------+\n",x++);

printf("| DEST : %s\n",inet_ntoa(*((struct in_addr*)ip->dstip)));
printf("| SRC : %s\n",inet_ntoa(*((struct in_addr*)ip->srcip)));
printf("| VERSION : %d\n",ip->version);

printf("+------------------------+\n");

}
}
}
else
{
puts("Could not bind");
}
return 0;
}
Зделал всё как сказали.. клмпилиться но сразу же выскакивает ошибка "Инструкция по адресу ... обратилась к памяти... и не может быть прочитана...

Ошибка в строке
GetComputerNameA(pcname, (unsigned long *)len);

Может подскажете как исправить?

__mad
07.02.2009, 02:03
GetComputerNameA(pcname, &len);

WON
07.02.2009, 12:50
GetComputerNameA(pcname, &len);

я тоже об этом думал но оно выдаёт ошибку несоответствия типов поэтому я написал так:

GetComputerNameA(pcname, (unsigned long *)&len);

программа запускаеться, ошибку не выкидывает но и программа ничего не делает.. показывает красивый чёрный прямоугольник...