Hướng dẫn viết một chương trình Sniffer
Số trang: 7
Loại file: pdf
Dung lượng: 117.46 KB
Lượt xem: 13
Lượt tải: 0
Xem trước 2 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Bài này mình hướng dẫn các bạn viết một sniffer (nghe lén) packet đơn giản trên Windows. Để lập trình được thì cần các bạn hiểu rõ cách lập trình socket trong ngôn ngữ C. Với cách lập trình socket thông thường chúng ta sử dụng SOCK_STREAM, SOCK_DGRAM tức lập trình ở mức Application của mạng mà thôi, để lập trình ở mức IP (tức tầng Network trong 4 tầng của Internet: Tầng vật lý -- Tầng Ip-- Tầng TCP -- Tầng ứng dụng) sử dụng SOCK_RAW là một dạng socket "thô" Điều đầu tiên bao giờ chúng ta cũng...
Nội dung trích xuất từ tài liệu:
Hướng dẫn viết một chương trình Sniffer Hướng dẫn viết một chương trình Sniffer Bài này mình hướng dẫn các bạn viết một sniffer (nghe lén) packet đơn giản trên Windows. Để lập trình được thì cần các bạn hiểu rõ cách lập trình socket trong ngôn ngữ C. Với cách lập trình socket thông thường chúng ta sử dụng SOCK_STREAM,SOCK_DGRAM tức lập trình ở mức Application của mạng mà thôi, để lập trình ở mức IP (tứctầng Network trong 4 tầng của Internet: Tầng vật lý --> Tầng Ip--> Tầng TCP --> Tầng ứngdụng) sử dụng SOCK_RAW là một dạng socket thôĐiều đầu tiên bao giờ chúng ta cũng phải khởi tạo thư viện WinsocketHàm khởi tạo thư viện như sau:Code:void InitWinSock(){WSADATA wsaData;if (WSAStartup(MAKEWORD(1,1),&wsaData)!=0) return;}Chi tiết hàm WSAStartup có thể xem trợ giúp của MSDN ...Cách tạo một Raw Socket như sau:Code:int CreateRawSocket(){int sock;if((sock=WSASocket(AF_INET,SOCK_RAW,0,NULL,NULL,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET) return 0;return sock;}Hàm trên trả về một sock mới nếu như không gặp lỗiNhư chúng ta đã biết mô hình mạng Internet được phân chia thành 4 tầng (Tầng vật lý TầngIp Tầng TCP Tầng ứng dụng) tương ứng với 7 tầng của mô hình OSI (Tầng vật lý Tầng liên kết Tầng mạng Tầng vận chuyển Tầng phiên Tầng trình diễn Tầng ứng dụng). Mình khỏi phải nhắc lại mô hình OSI như thế nào vì có rất nhiều bài viết trongdiễn đàn đã nói đến OSIGiới thiệu cấu trúc của gói IP, TCP, ICMPa. Gói IP (ở tầng IP)Định nghĩa một struct mô tả gói IPCode:struct ip_hdr{unsigned char ver_ihl; //Code:#include #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)#pragma comment (lib,ws2_32.lib)void InitWinSock();int CreateRawSocket();int Sniffer(int sock);int packetcapture(char *packet);int tcp_display(struct ip_hdr *ip,struct tcp_hdr *tcp);int icmp_display(struct ip_hdr *ip,struct icmp_hdr *icmp);struct ip_hdr{unsigned char ver_ihl;//VER va IHL (Internet Header Length)unsigned char tos; //Type of Serverunsigned short tol_len;//Total Length=IpHeader + TCP Header + Dataunsigned short id; //Identificationunsigned short offset; //Frame offsetunsigned char ttl; //Time To Liveunsigned char protocol;unsigned short checksum;unsigned int saddr; //Source Addressunsigned int daddr; //Destination Address};struct tcp_hdr{unsigned short sport; //Source Portunsigned short dport; //Detinations Portunsigned int seqnum; //Sequence;unsigned int acknum; //Acknowlegeunsigned char dataoffset; //Data Offsetunsigned char flags; //SYN, URG, FIN, ACK, RST, PUSH + Preserveunsigned short windows;unsigned short checksum;unsigned short urgpointer;};struct icmp_hdr{unsigned char type;unsigned char code;unsigned short checksum;unsigned short id;unsigned short sequence;unsigned short timest};int socksniffer;int main(){InitWinSock();socksniffer=CreateRawSocket();printf(Seamoun (http://nhomvicki.net) );printf(Sniffer TCP, ICMP v1.0 );printf( Packet Capture ... );Sniffer(socksniffer);return 0;}//Ham khoi tao thu vien WinSockvoid InitWinSock(){WSADATA wsaData;if (WSAStartup(MAKEWORD(1,1),&wsaData)!=0) return;}//Ham tao RawSocketint CreateRawSocket(){int sock;if((sock=WSASocket(AF_INET,SOCK_RAW,0,NULL,NULL,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET) return 0;return sock;}//Ham thuc hien Snifferint Sniffer(int sock){DWORD dwBufferLen[10], dwBufferInLen = 1, dwBytesReturned = 0;char *HostName=new char [32];unsigned long nSize=32;struct hostent *hp;sockaddr_in from,dest;int sread,fromlen=sizeof(from);char *packet=new char [2048];if (GetComputerName(HostName,&nSize)==0) return -1;if ((hp=gethostbyname(HostName))==0) return -1;delete(HostName);int i=0;while ((hp->h_addr_list[i+1])!=NULL){i++;}memcpy(&from.sin_addr.s_addr,hp->h_addr_list[i],hp->h_length);if ((hp=gethostbyname(inet_ntoa(from.sin_addr)))==NULL) return -1;memset(&dest,0,sizeof(dest));memcpy(&dest.sin_addr.s_addr,hp->h_addr_list[0],hp->h_length);dest.sin_family=AF_INET;dest.sin_port=htons(8000);if (bind(sock,(struct sockaddr *)&dest,sizeof(dest))==SOCKET_ERROR) return -1;//WSAIoctl : dieu khien vao ra socketif(WSAIoctl(sock, SIO_RCVALL, &dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL) == SOCKET_ERROR) return(-1);//Don nhan va su ly goi du lieuwhile (1){sread=recvfrom(sock,packet,8191,0,(struct sockaddr *)&from.sin_addr,&fromlen);if ((sread==SOCKET_ERROR)||sreadprotocol){case 6:tcp_display(ip,tcp);break;case 1:icmp_display(ip,icmp);break;default:break;}return 0;}//Ham hien thi goi TCPint tcp_display(ip_hdr *ip,tcp_hdr *tcp){printf(TCP: [%d] %s:%d, ntohs(ip->tol_len), inet_ntoa(*(struct in_addr *)&ip->saddr),ntohs(tcp->sport));printf( > %s:%d|ttl = %d|win = %d|checksum = %d|flag = %d , inet_ntoa(*(struct in_addr*)&ip ...
Nội dung trích xuất từ tài liệu:
Hướng dẫn viết một chương trình Sniffer Hướng dẫn viết một chương trình Sniffer Bài này mình hướng dẫn các bạn viết một sniffer (nghe lén) packet đơn giản trên Windows. Để lập trình được thì cần các bạn hiểu rõ cách lập trình socket trong ngôn ngữ C. Với cách lập trình socket thông thường chúng ta sử dụng SOCK_STREAM,SOCK_DGRAM tức lập trình ở mức Application của mạng mà thôi, để lập trình ở mức IP (tứctầng Network trong 4 tầng của Internet: Tầng vật lý --> Tầng Ip--> Tầng TCP --> Tầng ứngdụng) sử dụng SOCK_RAW là một dạng socket thôĐiều đầu tiên bao giờ chúng ta cũng phải khởi tạo thư viện WinsocketHàm khởi tạo thư viện như sau:Code:void InitWinSock(){WSADATA wsaData;if (WSAStartup(MAKEWORD(1,1),&wsaData)!=0) return;}Chi tiết hàm WSAStartup có thể xem trợ giúp của MSDN ...Cách tạo một Raw Socket như sau:Code:int CreateRawSocket(){int sock;if((sock=WSASocket(AF_INET,SOCK_RAW,0,NULL,NULL,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET) return 0;return sock;}Hàm trên trả về một sock mới nếu như không gặp lỗiNhư chúng ta đã biết mô hình mạng Internet được phân chia thành 4 tầng (Tầng vật lý TầngIp Tầng TCP Tầng ứng dụng) tương ứng với 7 tầng của mô hình OSI (Tầng vật lý Tầng liên kết Tầng mạng Tầng vận chuyển Tầng phiên Tầng trình diễn Tầng ứng dụng). Mình khỏi phải nhắc lại mô hình OSI như thế nào vì có rất nhiều bài viết trongdiễn đàn đã nói đến OSIGiới thiệu cấu trúc của gói IP, TCP, ICMPa. Gói IP (ở tầng IP)Định nghĩa một struct mô tả gói IPCode:struct ip_hdr{unsigned char ver_ihl; //Code:#include #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)#pragma comment (lib,ws2_32.lib)void InitWinSock();int CreateRawSocket();int Sniffer(int sock);int packetcapture(char *packet);int tcp_display(struct ip_hdr *ip,struct tcp_hdr *tcp);int icmp_display(struct ip_hdr *ip,struct icmp_hdr *icmp);struct ip_hdr{unsigned char ver_ihl;//VER va IHL (Internet Header Length)unsigned char tos; //Type of Serverunsigned short tol_len;//Total Length=IpHeader + TCP Header + Dataunsigned short id; //Identificationunsigned short offset; //Frame offsetunsigned char ttl; //Time To Liveunsigned char protocol;unsigned short checksum;unsigned int saddr; //Source Addressunsigned int daddr; //Destination Address};struct tcp_hdr{unsigned short sport; //Source Portunsigned short dport; //Detinations Portunsigned int seqnum; //Sequence;unsigned int acknum; //Acknowlegeunsigned char dataoffset; //Data Offsetunsigned char flags; //SYN, URG, FIN, ACK, RST, PUSH + Preserveunsigned short windows;unsigned short checksum;unsigned short urgpointer;};struct icmp_hdr{unsigned char type;unsigned char code;unsigned short checksum;unsigned short id;unsigned short sequence;unsigned short timest};int socksniffer;int main(){InitWinSock();socksniffer=CreateRawSocket();printf(Seamoun (http://nhomvicki.net) );printf(Sniffer TCP, ICMP v1.0 );printf( Packet Capture ... );Sniffer(socksniffer);return 0;}//Ham khoi tao thu vien WinSockvoid InitWinSock(){WSADATA wsaData;if (WSAStartup(MAKEWORD(1,1),&wsaData)!=0) return;}//Ham tao RawSocketint CreateRawSocket(){int sock;if((sock=WSASocket(AF_INET,SOCK_RAW,0,NULL,NULL,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET) return 0;return sock;}//Ham thuc hien Snifferint Sniffer(int sock){DWORD dwBufferLen[10], dwBufferInLen = 1, dwBytesReturned = 0;char *HostName=new char [32];unsigned long nSize=32;struct hostent *hp;sockaddr_in from,dest;int sread,fromlen=sizeof(from);char *packet=new char [2048];if (GetComputerName(HostName,&nSize)==0) return -1;if ((hp=gethostbyname(HostName))==0) return -1;delete(HostName);int i=0;while ((hp->h_addr_list[i+1])!=NULL){i++;}memcpy(&from.sin_addr.s_addr,hp->h_addr_list[i],hp->h_length);if ((hp=gethostbyname(inet_ntoa(from.sin_addr)))==NULL) return -1;memset(&dest,0,sizeof(dest));memcpy(&dest.sin_addr.s_addr,hp->h_addr_list[0],hp->h_length);dest.sin_family=AF_INET;dest.sin_port=htons(8000);if (bind(sock,(struct sockaddr *)&dest,sizeof(dest))==SOCKET_ERROR) return -1;//WSAIoctl : dieu khien vao ra socketif(WSAIoctl(sock, SIO_RCVALL, &dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL) == SOCKET_ERROR) return(-1);//Don nhan va su ly goi du lieuwhile (1){sread=recvfrom(sock,packet,8191,0,(struct sockaddr *)&from.sin_addr,&fromlen);if ((sread==SOCKET_ERROR)||sreadprotocol){case 6:tcp_display(ip,tcp);break;case 1:icmp_display(ip,icmp);break;default:break;}return 0;}//Ham hien thi goi TCPint tcp_display(ip_hdr *ip,tcp_hdr *tcp){printf(TCP: [%d] %s:%d, ntohs(ip->tol_len), inet_ntoa(*(struct in_addr *)&ip->saddr),ntohs(tcp->sport));printf( > %s:%d|ttl = %d|win = %d|checksum = %d|flag = %d , inet_ntoa(*(struct in_addr*)&ip ...
Tìm kiếm theo từ khóa liên quan:
Kỹ thuật lập trình Phần cứng Công nghệ thông tin Tin học Quản trị mạngTài liệu liên quan:
-
52 trang 432 1 0
-
24 trang 358 1 0
-
Top 10 mẹo 'đơn giản nhưng hữu ích' trong nhiếp ảnh
11 trang 318 0 0 -
74 trang 302 0 0
-
96 trang 296 0 0
-
Báo cáo thực tập thực tế: Nghiên cứu và xây dựng website bằng Wordpress
24 trang 289 0 0 -
Đồ án tốt nghiệp: Xây dựng ứng dụng di động android quản lý khách hàng cắt tóc
81 trang 284 0 0 -
EBay - Internet và câu chuyện thần kỳ: Phần 1
143 trang 277 0 0 -
Tài liệu dạy học môn Tin học trong chương trình đào tạo trình độ cao đẳng
348 trang 269 1 0 -
Tài liệu hướng dẫn sử dụng thư điện tử tài nguyên và môi trường
72 trang 267 0 0