Tài liệu Hướng dẫn viết một chương trình Sniffer - Pdf 91

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ứ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 phải khởi tạo thư viện Winsocket
Hà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;

Định nghĩa một struct mô tả gói TCP
Code:

struct tcp_hdr{
unsigned short sport //<-- Source Port
unsigned short dport //<-- Destiantion Port
unsigned int seq_num //<-- Sequence Number
unsigned int ack_num //<-- Acknowledgment Number
unsigned char dataoffset//<--Data Offset
unsigned char flags //Flags: SYN, ACK, FIN, RST, PUSH, URG (2 bits) + 6 bits Reserve
unsigned short window //Windows
unsigned short checksum //Checksum
unsigned short urgpointer //Urgent Pointer
}

c. Gói ICMP
Định nghĩa một struct mô tả gói ICMP
Code:

struct icmp_hdr{
unsigned char type //Type
unsigned char code //Code
unsigned short checksum
unsigned short id //Identification
unsigned short sequence
unsigned short timestamp
}

Ở trên là toàn bộ định nghĩa về các gói IP, ICMP, TCP. Trong bài này mình chỉ hướng dẫn bắt
các gói TCP và ICMP mà thôi, còn các gói khác thì có thể làm tương tự

unsigned int seqnum; //Sequence;
unsigned int acknum; //Acknowlege
unsigned char dataoffset; //Data Offset
unsigned char flags; //SYN, URG, FIN, ACK, RST, PUSH + Preserve
unsigned 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 timestamp;
};
int socksniffer;
int main()
{
InitWinSock();
socksniffer=CreateRawSocket();
printf("Seamoun (http://nhomvicki.net)\n");
printf("Sniffer TCP, ICMP v1.0\n\n");
printf(" Packet Capture ...\n");
Sniffer(socksniffer);
return 0;
}
//Ham khoi tao thu vien WinSock
void InitWinSock()

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 socket
if(WSAIoctl(sock, SIO_RCVALL, &dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen,
sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL) == SOCKET_ERROR) return(-1);

//Don nhan va su ly goi du lieu
while (1)
{
sread=recvfrom(sock,packet,8191,0,(struct sockaddr *)&from.sin_addr,&fromlen);
if ((sread==SOCKET_ERROR)||sread<0) continue ;
packetcapture(packet);
}
delete(packet);

return 0;
}
//Ham thuc hien phan tich goi du lieu
int packetcapture(char *packet)


Nhờ tải bản gốc
Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status