Решил написать программку для пеерхвата пакетов только для моего компьютера, для начала хотя бы читать их содержимое... Начал писать на С++, но прога не очень то и работает... Непонятно когда и по каким принцыпам(лично для меня так) она выводит содержимое пакетов(и то не всё)... Может мне ктонибудь подскажет аглоритм и программые методы для осуществение моей цели... Code: #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; } Код как я сам понимаю - бред...
эммм...у меня глюк или ты не перевел интерфейс в promisc-режим? http://forum.antichat.ru/showthread.php?p=1011673 ТС, твой код пример обычного клиент/сервернго приложения...тока без клиента)))
Я например захожу в КС... оно должно мне выводить на экран содержимое пакетов при игре а оно мне выводит пустоту напостой.. это да... за ссылочку спасибо.. но там заумный для меня код... может есть что по проще... может на Delphi... И ещё по той ссылке что ты мне дал упоминался WinAPI и сетевые протоколы низких уровней... Может они проще...
WON Твой код не предназначен для перехвата пакетов. Тут http://www.ntkernel.com/w&p.php?id=14 расписаны методы перехвата пакетов, позволяющие их редактировать. Самый простой способ внедрять в каждый процесс библиотеку, перехватывающую функции для работы с сокетами (модификация IAT или сплайзинг connect, send, sendto, WSASend, WSASendTo, recv, recvfrom, WSARecv).
В первом твоем посте С-шный код, я тебе дал ссылку на С-шный код. Может тебе надо сначала ознакомиться с документацией по TCP/IP? Потом код не будет казаться "заумным"
Чесно говря я не пытался казаться "заумным", просто в той ссылке что ты мне дал говорилось что есть готовые WinAPI функции и что с ними легче рабаотать... Спасибо... буду разбираться с тем кодом что есть...
WON, твой код отличается несколькими строчками: нет перевода интерфейса в promisc-режим и другой вывод информации З.Ы. ну еще там IP-заголовок описан.
Мужик тебе функция accept() не нужна для перехвата пакетов, по той ссылке что скинул Criz все понятно показано,вот одна проблема - тот код не работает на некоторых Windows . Если ты хочешь принимать только те пакету которые предназначены для твоей машины то переводит сокет в режим promisc тебе незачем. Вот код,для перехвата пакетов предназначенных для твоего компа. Code: #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"); } }
xismyname а на чём ты компилируешь...? Я на VS 6.0, подключаю #pragma comment( lib, "wsock32.lib" ) и у меня выскакиевает 60 error(s), 19 warning(s) непонятного содержания...
Code: #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; } Зделал всё как сказали.. клмпилиться но сразу же выскакивает ошибка "Инструкция по адресу ... обратилась к памяти... и не может быть прочитана... Ошибка в строке Code: GetComputerNameA(pcname, (unsigned long *)len); Может подскажете как исправить?
Code: GetComputerNameA(pcname, &len); я тоже об этом думал но оно выдаёт ошибку несоответствия типов поэтому я написал так: Code: GetComputerNameA(pcname, (unsigned long *)&len); программа запускаеться, ошибку не выкидывает но и программа ничего не делает.. показывает красивый чёрный прямоугольник...