데이터 통신 - Packet Sniffer의 구현
데이터 통신 - Packet Sniffer의 구현
<데이터 통신 과제>
Packet Sniffer의 구현
1.소스코드분석
이 프로그램은 로소켓을 이용한 스니퍼 프로그램 이다. 로소켓의 “네트워크 계층으로 전송되는 모든 패킷을 볼 수 있는” 특성을 이용해 TCP 프로토콜의 패킷을 읽은 프로그램이다. 아래 소스에는 TCP 패킷만 읽는 것이므로 IP 헤더와 TCP 헤더만을 출력 했지만, ICMP, IGMP, UDP 패킷 등등도 출력할 수 있다. 또한 packet.h 의 헤더파일을 고침으로써 IP Header와 TCP header의 기본 값들을 바꿀 수 있다. 예를 들면 IP header의 version이나 헤더길이 등을 사용자가 임의대로 바꿀 수 있다.
project1.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "packet.h"
int main() {
int sock, ret, len;
char buffer[65535], *data;
struct sockaddr_in from;
struct in_addr src, dst;
struct ifreq ifr;
char *interface = "eth0";
struct ip_header_t *ip = (struct ip_header_t *)&buffer;//ip header 선언
struct tcp_header_t *tcp;//tcp header 선언
sock = socket(PF_INET, SOCK_RAW, IPPROTO_TCP);
//로소켓 생성( PF_INET:인터넷 프로토콜 , SOCK_RAW 는 로소켓을 만들겠다는 의미!,IPPROTO_TCP 라는 프로토콜을 사용하겠다는 지정)
strncpy(ifr.ifr_name, interface, strlen(interface)+1);
if(ioctl(sock, SIOCGIFFLAGS, &ifr) < 0) {
perror("SIOCGIFFLAGS error : ");
exit(1);
}
ifr.ifr_flags |= IFF_PROMISC;
//이더넷 디스크 드라이버에 promisc 모드를 설정하기 위해! 이 모드가 설정되면
//모든 프레임에 대해 다 받아들이게 됨.
if (ioctl(sock, SIOCSIFFLAGS, &ifr) < 0) {
perror("Could not set the PROMISC flag : ");
exit(1);
}
len = sizeof(from);
while(1) {
ret = recvfrom(sock, buffer, sizeof(buffer), 0, (struct sockaddr *)&from, &len);
//buffer 에 패킷을 받음
printf("resive data = %d\n", ret);
//받은 패킷 크기 출력!
if (ip->protocol != PROTO_TCP)
continue;//받은 프로토콜이 TCP이 아닌경우 경우 출력안하고 다시 읽음
//즉 TCP패킷이 아니면 다음 패킷 받기
//받은 패킷의 ip헤더의 정보들을 출력
printf("================ IP header ===============\n");
src.s_addr = ip->src_ip;//발신지 ip의 주소를 src.s_addr에 입력
//(src는 발신지의 주소 구조체)
dst.s_addr = ip->dst_ip;//수신지의 ip 주소를 dst.s_addr에 입력
//(dst는 수신지의 주소 구조체)
printf("Src ip = %s\n", inet_ntoa(src));
//inet_ntoa()함수를 통해 구조체의 src를 문자열로 변환
printf("Dst ip = %s\n", inet_ntoa(dst));
//inet_ntoa()함수를 통해 구조체의 dst를 문자열로 변환
printf("Total length = %d\n", ntohs(ip->length));//총 길이출력
printf("Identification = %d\n", ntohs(ip->id));//ip의 id 출력
printf("TTL = %d", ip->ttl);//time to live 출력
printf("Checksum = 0x%X\n", ntohs(ip->checksum));//체크썸 출력
printf("=============== TCP header ==============\n");
tcp = (struct tcp_header_t *)(buffer + (4 * ip->hlen));
//TCP 헤더의 시작 위치를 구하기 ip 헤더의 뒤에 따라 나오므로.. 4를 곱하는 이유는 ip의 head length의 단위가 워드, 즉 4바이트 이기 때문에.
printf("Src port = %d\n", ntohs(tcp->src_port));//소스 port 출력
printf("Dst port = %d\n", ntohs(tcp->dst_port));//도착지 port 출력
printf("Sequence number = 0x%X\n", ntohl(tcp->seqnum));//순서 번호 출력(원본데이터가 큰 경우 이 데이터를 여러개의 세그먼트로 나누기 때문
printf("Acknowledgment number = 0x%X\n", ntohl(tcp->acknum));
/
| [1] | [2] | [3] | [4] | [5] | [6] | [7] | [8] | [9] | [10] |
자료출처 : http://www.ALLReport.co.kr/search/detail.asp?pk=11041204&sid=qjfRnf777&key=
[문서정보]
문서분량 : 7 Page
파일종류 : HWP 파일
자료제목 :
파일이름 : 데이터 통신 - Packet Sniffer의 구현.hwp
키워드 : 데이터,통신,Packet,Sniffer,구현,Sniffer의
[추천자료]
- 엔트로피 감상문
- (독후감) 톰아저씨의 오두막집
- 스키너의 심리상자열기 독서감상문
- 오천석의 ‘스승’을 읽고
- 광안대교의 역학적 해석과 그 주변 풍경에 대한 분석
댓글 없음:
댓글 쓰기