SimTL2 프로젝트 최종보고서

학 부	정보통신공학부
전 공	정보통신공학전공
학 번	200301582
이 름	김 성 태

목        차

□	설 계 개 념 설 명 문			․․․ ․․․ 1
□	설 계 제 한 요 소			․․․ ․․․ 2
□	설 계 계 획			․․․ ․․․ 2
□	프 로 그 램 구 현 설 명			․․․ ․․․ 2
□	평 가 방 법			․․․ ․․․ 15
□	기 대 효 과			․․․ ․․․ 15
□	참 고 문 헌			․․․ ․․․ 15
□	부 록			․․․ ․․․ 15
	○	SimTL2 프로그램 설명 홈페이지		＃1
	○	SimTL2 프로그램 설명 Latex 문서		＃2

1. 설계 개념 설명문

- 네트워크상에 떠도는 여러 가지 다양한 패킷들을 캡쳐하여 각각의 프로토콜에 맞게 분류하여 해당 패킷이 어떠한 정보를 가지고 있는지를 분석한다..

□ 패킷 캡쳐 라이브러리를 이용하여 프로그램을 작성하고 화면에 패킷의 내용을 출력하였다.

□ 프로그래밍 환경은 리눅스이며 GUI 환경으로 구축하였다.

□ 프로그램의 이름은 ‘시뮬레이션 틀‘ 을 짧게 줄여 SimTL 로 정했다.

2. 설계 제한요소

- 프로그램은 리눅스 환경에서 제작한다.

- 패킷 캡쳐 라이브러리 : pcap_library

- 컴파일러 G++ 4.2.3 버전을 사용

- GUI 환경구축을 위해 Qt사용

- IDE는 자유롭게 변경가능하나 기본적으로 KDevelop를 사용한다.

3. 설 계 계 획

기 간 내 용	1주차	2주차	3주차	4주차	5주차	6주차
사 전 조 사
제 안 서 작 성
프로그램 작 성
패킷분석 / 수정
최 종 보 고 서 작 성
등 록

4. 프로그램 구현 설명

■ 프로그램 파일

- analyzer_interface.h : 패킷 분석 클래스 인터페이스 파일.

- main.cpp : 메인 프로그램 실행

- simtl_analysis.cpp : 패킷 분석 클래스 구현 파일

- simtl_analysis.h : 패킷 분석 클래스 헤더 파일

- simtl_db.h : 패킷 분석 관련 파일 생성 및, GUI에 데이터를 입력하는 DB의 역학을 simtl_db 클래스 헤더파일

- simtl_db.cpp : simtl_db 클래스 구현 파일

- simtl_dir.h : 파일 저장시 생성되는 다이얼로그 박스 구현을 위한 헤더 파일

- simtl_dir.cpp : 다이얼로그 박스 구현 파일

- simtl_gui.h : simtl 프로그램 메인 GUI 구현 헤더파일

- simtl_time.h : simtl 프로그램 내부적으로 돌아가는 자체 시간 관리를 위한 simtl_time 클래스 헤더파일

- simtl_time.cpp : simtl_time 클래스 구현파일

■ 클래스 설계

- Analyzer : 패킷 처리하는 static 함수의 집합체

public	static void ether_Analysis(u_char *user, const struct pcap_pkthdr *h, const u_char *p)
	이더넷 프레임을 처리하는 Static 메소드

- DB_control : SimTL의 Db를 관리 및 감독하는 클래스

public	DB_control()
	생성자
	void initial(void)
	멤버 변수 초기화 작업 진행
	void set_itemModel(QObject* parent)
	QStandardItemModel 객체의 생성과 초기화
	QStandardItemModel* get_itemModel(void)
	QStandardItemModel 객체를 리턴
	void set_table(QTableView *q)
	QTableView* get_table(void)
	QTableView 객체의 set 과 get
	int get_column(void)
	컬럼을 리턴
	int get_rows(void)
	row를 리턴
	void column_plus(void)
	컬럼을 1 증가
	void row_plus(void)
	row를 1 증가 , 컬럼 0 으로 초기화
	void set_model(void)
	QT 에서 사용하는 모델 객체를 설정하는 메소드. 화면에 보여 지는 요약창에 들어갈 객체이다.
	FILE* get_file(int i)
	파일을 리턴
	void close_file(int i)
	파일을 닫음
	FILE* get_sum(void)
	sum을 리턴
private	QStandardItemModel *itemModel
	화면에 들어갈 객체의 포인터 멤버 변수. (위에서 설명한 모델객체)
	QTableView *qtable
	화면에 보여지는 요약창의 포인터 객체. 테이블처럼 보여준다 해서 TableView 객체임.
	int rows, column
	가로 라인, 세로 라인
	FILE **files
	파일 저장의 동적 배열 할당을 위한 이중 포인터
	FILE *sum
	요약파일의 포인터 변수. 현재는 사용하지 않는다. 추후 사용예정

- Packet_analysis : 패킷 분석 클래스들의 부모 클래스

가장 필요한 멤버 변수만을 지닌다.

public	void data_analysis(struct ether_header *ep, int totlen, FILE *file)
	현재 캡쳐한 패킷을 ACII 코드와 HEXA 코드로 나타내는 메소드. 패킷의 종류와 내용에 상관없이 처음부터 끝까지 모든 데이터를 화면에 출력한다.
	char *p_point
	패킷의 처음 시작부분을 받는 포인터(오프셋 역할)
	int i
	단순 카운트 증가용 변수

- Arp_analysis : ARP 패킷 분석 클래스

public	Arp_analysis(struct ether_header *ep);
	생성자
	unsigned short get_arp_hwt(void)
	하드웨어 타입을 리턴
	unsigned short get_arp_prt(void)
	프로토콜 타입을 리턴
	unsigned char get_arp_hwl(void)
	하드웨어 길이를 리턴
	unsigned char get_arp_prl(void)
	프로토콜 길이를 리턴
	unsigned short get_arp_op(void)
	Opeation 리턴
	char* get_arp_send_haddr(void)
	송신 하드웨어 주소 리턴
	char* get_arp_send_paddr(void)
	송신 프로토콜 주소 리턴
	char* get_arp_target_haddr(void)
	수신 하드웨어 주소 리턴
	char* get_arp_target_paddr(void)
	수신 프로토콜 주소 리턴
protected	unsigned short arp_hwt
	하드웨어 타입
	unsigned short arp_prt
	프로토콜 타입
	unsigned char arp_hwl
	하드웨어 길이
	unsigned char arp_prl
	프로토콜 길이
	unsigned short arp_op
	Operation
	char *arp_send_haddr
	송신 하드웨어 주소
	char *arp_send_paddr
	송신 프로토콜 주소
	char *arp_target_haddr
	수신 하드웨어 주소
	char *arp_target_paddr
	수신 프로토콜 주소
private	struct arphdr *arph
	ARP 패킷의 헤더부분 스트럭처. 이 부분은 arp.h> 헤더파일에 기술되어 있는 부분이다

- Time_control : SimTL의 패킷 캡쳐 시간을 관리하는 클래스.

public	Time_control(void)
	생성자
	void start_clock(void)
	시간 체크 시작
	char* get_time(void)
	시간 시작 후, 현재까지 흐른 시간을 리턴
private	struct timeval start_time
	시간 체크를 위한 timeval 구조체
	struct timeval cur_time
	시간 체크를 위한 timeval 구조체

- DataLink_analysis : 이더넷 프레임 분석을 위한 클래스

public	DataLink_analysis(struct ether_header *ep)
	생성자
	char* get_ether_dest()
	목적지 주소 반환(MAC address)
	char* get_ether_source()
	출발지 주소 반환(MAC address)
	unsigned short get_ether_type()
	다음 프레임의 타입을 반환
protected	char eth_destination[ETH_ALEN]
	목적지 주소(MAC address)
	char eth_source[ETH_ALEN]
	출발지 주소(MAC address)
	unsigned short ether_type;
	패킷 타입

- Icmp_analysis : ICMP 패킷 분석 클래스

public	Icmp_analysis(struct ether_header *ep, int iph_size)
	생성자
	unsigned char get_icmp_type(void)
	ICMP 패킷을 리턴
	unsigned char get_icmp_code(void)
	ICMP 코드를 리턴
	unsigned short get_icmp_check(void)
	ICMP 패킷 체크섬 리턴
private	unsigned char icmp_type
	ICMP 타입 정보를 가지는 멤버 변수
	unsigned char icmp_code
	ICMP 코드 정보를 가지는 멤버 변수
	unsigned short icmp_check
	ICMP 체크섬 정보를 가지는 멤버 변수
	struct icmp *icmph
	ICMP 패킷 헤더 정보를 가지는 구조체의 포인터 멤버변수

- Simtl_gui : SimTL에서 사용하는 GUI 관련 클래스(QT 사용부분)

public	Simtl_gui(QMainWindow *parent = 0)
	생성자
private slots	void set_options(QString str)
	filter rule 설정시 호출
	void set_options(int number)
	캡쳐할 packet 수 변경시 호출
	void button_start(void)
	시작버튼 클릭시 호출
	void button_save(void)
	저장 버튼 클릭시 호출
private	void table_clicked(QModelIndex lindex)
	테이블 클릭시 호출
	Simtl_dir *simtl_dir
	디렉토리 객체를 멤버 변수로 가지고 있다.

- Ip_analysis : IP 패킷 분석 클래스

public	Ip_analysis(struct ether_header *ep)
	생성자
	Ip_analysis(struct iphdr *iphd)
	생성자
	char* get_ip_dest()
	목적지 주소 반환
	char* get_ip_source()
	출발지 주소 반환
	unsigned char get_ip_ver(void)
	IP 버전 변수
	unsigned char get_ip_hlen(void)
	IP 헤더 길이 리턴
	unsigned char get_ip_tos(void)
	IP 서비스 타입 리턴
	unsigned short get_ip_totlen(void)
	IP 패킷 총 길이 리턴
	unsigned short get_ip_id(void)
	IP 패킷 식별자 리턴
	unsigned short get_ip_fragoff(void)
	IP패킷 단편화 오프셋 리턴
	unsigned char get_ip_ttl(void)
	IP 패킷 TTL 리턴
	unsigned char get_ip_proto(void)
	IP Protocol 리턴
	unsigned short get_ip_check(void)
	IP 패킷 체크섬 리턴
protected	char *p_point
	패킷 오프셋
	struct iphdr *iph
	IP 패킷 구조체
	char ip_destination[IP_ALEN]
	목적지 주소
	char ip_source[IP_ALEN]
	출발지 주소
	unsigned char ip_ver
	IP Version
	unsigned char ip_hlen
	IP Header Length
	unsigned char ip_tos
	IP Service Type
	unsigned short ip_totlen
	IP Total Length
	unsigned short ip_id
	IP Identification
	unsigned short ip_fragoff
	IP Fragment Offset
	unsigned char ip_ttl
	IP Time To Live
	unsigned char ip_proto
	IP Protocol
	unsigned short ip_check
	IP Checksum

- Tcp_analysis : TCP 패킷 분석 클래스

public	Tcp_analysis(struct ether_header *ep, int iph_size)
	생성자
	unsigned short get_tcp_sport(void)
	발신지 포트 반환
	unsigned short get_tcp_dport(void)
	목적지 포트 반환
	unsigned int get_tcp_snumber(void)
	TCP Sequence 번호 반환
	unsigned int get_tcp_anumber(void)
	TCP 수신확인 번호 반환
	unsigned char get_tcp_doff(void)
	데이터 오프셋 리턴
	bool get_tcp_urg(void)
	Urgent pointer 리턴
	bool get_tcp_ack(void)
	Acknowledgment 리턴
	bool get_tcp_psh(void)
	Push 리턴
	bool get_tcp_rst(void)
	Reset 리턴
	bool get_tcp_syn(void)
	Sunchronize 리턴
	bool get_tcp_fin(void)
	Fin 리턴
	unsigned short get_tcp_wins(void)
	Window 사이즈 리턴
	unsigned short get_tcp_check(void)
	체크섬 리턴
	unsigned short get_tcp_upoint(void)
	Urgent Pointer 리턴

- Tcp_analysis : TCP 패킷 분석 클래스

protected	char *p_point
	패킷 오프셋
	struct tcphdr *tcph
	TCP 패킷 구조체
	unsigned short tcp_sport
	발신지 포트
	unsigned short tcp_dport
	목적지 포트
	unsigned int tcp_snumber
	TCP Sequence 번호
	unsigned int tcp_anumber
	TCP Acknowledgement 번호
	unsigned char tcp_doff
	TCP 데이터 오프셋
	bool tcp_urg
	TCP Urgent pointer
	bool tcp_ack
	TCP Acknowledgment
	bool tcp_psh
	TCP push
	bool tcp_rst
	TCP Reset the connection
	bool tcp_syn
	TCP Synchronize 시퀀스 넘버
	bool tcp_fin
	TCP 종료 플래그
	unsigned short tcp_wins
	TCP 윈도우 사이즈
	unsigned short tcp_check
	TCP Checksum
	unsigned short tcp_upoint
	TCP Urgent Pointer

- Simtl_dir : SimTL애서 분석한 패킷을 저장한 파일을 저장하는 디렉토리 관련 위젯을 담당하는 디렉토리

public	Simtl_dir(QWidget *parent = 0)
	생성자. 모든 객체의 초기화와 화면에 GUI를 띄우는 역할
public slots	intitemSelected()
	화면상의 아이템 선택시 호출되는 메소드
	intchangeDir()
	디렉토리 변경시 호출되는 메소드
	intmakeDir()
	디렉토리 생성지 호출괴는 메소드
	intremoveDir()
	디렉토리 삭제시 호출되는 메소드
	intrenameDir()
	디렉토리 이름 변경시 호출되는 메소드
	intokDir()
	확인 클릭시 호출되는 메소드
private	QDir* directory
	디렉토리 객체
	QListWidget *dirlist
	리스트를 보여주는 리스트 위젯 객체
	QLineEdit *filename
	줄 편집기를 보여주는 줄 편집 객체

- Pcap_option : SimTL 의 옵션을 관리하는 클래스

public	Pcap_option()
	생성자. 모든 멤버 변수들을 초기화 한다.
	char* get_rule(void)
	filter rule 리턴
	void set_rule(char *rule)
	filter rule 설정
	char* get_device(void)
	device 리턴
	void set_device(char *dev)
	device 설정
	bool get_cflag(void)
	cflag 리턴
	void set_cflag(bool flag)
	cflag 설정
	int get_packetcnt(void)
	packetcnt 리턴
	void set_packetcnt(int cnt)
	packetcnt 설정
	int get_chcnt(void)
	chcnt 리턴
	void set_chcnt(int cnt)
	chcnt 설정
	void plus_chcnt(void)
	chcnt 1증가
	void set_pcap_t(pcap_t *p)
	pcap_t 스트럭처 설정
	pcap_t* get_pcap_t(void)
	pcap_t 스트럭처 리턴
private	char filter_rule[100]
	필터 룰
	char device[10]
	디바이스 이름
	bool cflag
	패킷 캡쳐 지정 옵션 flag
	int packetcnt
	캡쳐할 패킷의 갯수
	int chcnt
	캡쳐한 패킷의 수
	pcap_t *pd
	(pcap_t 타입의 구조체 포인터 변수). 옵션들을 관리하는 내부 구조체

■ 프로그램 실행 화면

프로그램 기본 화면

저장화면 (Save Button 누를시)

■ WireShark 와의 비교

Echo Request

WireShark , SimTL 모두 같은 모습을 보인다!

Destination

WireShark , SimTL 모두 같은 모습을 보인다!

Time Exceed

WireShark , SimTL 모두 같은 모습을 보인다!

5. 평가 방법

- 여러 가지 프로토콜을 분석(디코딩)하여 해당 파일에 기입한다 .

- SimTL 의 수행결과를 Wireshark 의 결과와 비교하여 제대로 개발되었는지 확인한다

6. 기대 효과

- 네트워크 패킷 모니터링 프로그램을 작성함으로써 네트워크 간 패킷의 전송현황 및 동작원리를 이해할 수 있다.

- 패킷 캡쳐 라이브러리를 이해할 수 있다.

7. 참 고 문 헌

- http://www.kldp.org : 한글 리눅스 문서 프로젝트 (리눅스 관련 자료들이 풍부함)

- http://www.joinc.co.kr : 조인시 위키(C 언어 함수 레퍼런스가 풍부함)

- http://trolltect.com : Qt를 개발한 트롤테크 홈페이지

- http://korone.net : QT 관련 자료들이 풍부한 곳

- TCP/IP Protocol Suite - Behrouz A. Forousan

- 데이터 통신과 네트워킹 - Behrouz A. Forousan

- 유닉스 시스템 & 네트워크 프로그래밍 - 신재호

- 열형강의 QT Programming - 서영진

- 리눅스 프로그래밍 - Neil Mathtew