12장. Raw 소켓 Raw 소켓의 특징과 사용 방법을 익힌다. Ping 프로그램의 동작 원리를 이해하고 작성 방법을 익힌다.

Similar presentations


Presentation on theme: "12장. Raw 소켓 Raw 소켓의 특징과 사용 방법을 익힌다. Ping 프로그램의 동작 원리를 이해하고 작성 방법을 익힌다."— Presentation transcript:

1 12장. Raw 소켓 Raw 소켓의 특징과 사용 방법을 익힌다. Ping 프로그램의 동작 원리를 이해하고 작성 방법을 익힌다.
Traceroute 프로그램의 동작 원리를 이해하고 작성 방법을 익힌다. ICMP.DLL이 제공하는 함수를 활용하는 방법을 익힌다.

2 개요 (1) TCP(또는 UDP) 소켓 vs. Raw 소켓 데이터 응용 프로그램 운영체제 프로토콜 헤더 데이터 응용 프로그램
TCP/IP 윈도우 소켓 프로그래밍

3 개요 (2) Raw 소켓의 특징 응용 프로그램 수준에서 프로토콜 헤더를 직접 조작  기존의 TCP 또는 UDP 소켓을 사용하는 방식보다 세부적인 제어 가능 프로토콜 헤더의 구조와 동작 원리를 이해해야 하므로 프로그래밍이 상대적으로 어려움 해킹에 악용할 가능성이 있음 TCP/IP 윈도우 소켓 프로그래밍

4 Raw 소켓 생성 (1) Raw 소켓 생성 예 Raw 소켓의 종류
SOCKET sock = socket(AF_INET, SOCK_RAW, protocol); if(sock == INVALID_SOCKET) err_quit("socket()"); 프로토콜 번호 응용 프로그램이 생성할 헤더 운영체제가 IPPROTO_ICMP ICMPv4 IPv4 IPPROTO_IGMP IGMPv4 IPPROTO_ICMPV6 ICMPv6 IPv6 TCP/IP 윈도우 소켓 프로그래밍

5 Raw 소켓 생성 (2) IP_HDRINCL 또는 IPV6_HDRINCL 옵션 설정
#include <ws2tcpip.h> ... // IPv4 헤더 포함 옵션 설정 BOOL optval = TRUE; setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)&optval, sizeof(optval)); #include <ws2tcpip.h> ... // IPv6 헤더 포함 옵션 설정 BOOL optval = TRUE; setsockopt(sock, IPPROTO_IPV6, IPV6_HDRINCL, (char *)&optval, sizeof(optval)); TCP/IP 윈도우 소켓 프로그래밍

6 Raw 소켓 생성 (3) Raw 소켓 생성 시 주의 사항 운영체제마다 Raw 소켓을 생성할 수 있는 권한이 다름
윈도우 9x 계열(95/98/Me) 모든 사용자 윈도우 NT 계열(NT 4.0/2000/XP 이상) 관리자 그룹에 속한 사용자 운영체제마다 생성할 수 있는 Raw 소켓의 종류가 다름 윈도우 95/98/NT 4.0 IPPROTO_ICMP, IPPROTO_IGMP 윈도우 Me/2000 모든 종류의 IPv4 Raw 소켓 윈도우 XP SP1 이상 모든 종류의 IPv4와 IPv6 Raw 소켓 TCP/IP 윈도우 소켓 프로그래밍

7 Options(If any) + Padding Destination IP Address
Raw 소켓 입출력 (1) IPv4 패킷 구조 Options(If any) + Padding 데이터 Version Hlen Type of Service Total Length Identification Flags Fragment Offset Time to Live Protocol Header Checksum Source IP Address Destination IP Address 20 바이트 가변 길이 TCP/IP 윈도우 소켓 프로그래밍

8 Raw 소켓 입출력 (2) IPv4 패킷 정의 typedef struct _IPHEADER {
u_char ip_hl:4; // header length u_char ip_v:4; // version u_char ip_tos; // type of service short ip_len; // total length u_short ip_id; // identification short ip_off; // flags & fragment offset field u_char ip_ttl; // time to live u_char ip_p; // protocol u_short ip_cksum; // checksum IN_ADDR ip_src; // source address IN_ADDR ip_dst; // destination address } IPHEADER; TCP/IP 윈도우 소켓 프로그래밍

9 Raw 소켓 입출력 (3) Raw 소켓 출력(IPv4 기준)
일반적으로 sendto() 함수를 사용한다. 이때 목적지 주소로 브로드캐스트 주소나 멀티캐스트 주소를 사용할 수도 있다. IP_HDRINCL 옵션을 설정하지 않은 경우, socket() 함수의 세 번째 인자에 해당하는 프로토콜 헤더를 생성하고 여기에 응용 프로그램 데이터를 덧붙여 보낸다. 이때 IPv4 헤더는 운영체제가 자동으로 생성해 덧붙인다. IP_HDRINCL 옵션을 설정한 경우, IPv4 헤더와 socket() 함수의 세 번째 인자에 해당하는 프로토콜 헤더를 생성하고 여기에 응용 프로그램 데이터를 덧붙여 보낸다. 즉, 응용 프로그램이 IPv4 헤더를 포함한 패킷 전체를 생성해 보내는 것이다. IP_HDRINCL 옵션을 설정했더라도 IPv4 헤더의 Identification을 0으로 채우면 운영체제가 자동으로 Identification 번호를 설정해준다. TCP/IP 윈도우 소켓 프로그래밍

10 Raw 소켓 입출력 (4) Raw 소켓 입력 일반적으로 recvfrom() 함수를 사용한다.
IPv4의 경우에는 IP_HDRINCL 옵션 사용 여부와 관계없이 데이터 맨 앞쪽에 항상 IPv4 헤더가 포함되어 읽힌다. IPv6의 경우에는 IPV6_HDRINCL 옵션 사용 여부와 관계없이 항상 IPv6 헤더 다음 부분부터만 읽을 수 있다. 운영체제는 IP 패킷을 받으면 프로토콜이 일치하는 모든 Raw 소켓에 이 패킷을 전달한다. 여기서 프로토콜이 일치한다는 것은 IP 패킷의 Protocol 부분과 Raw 소켓 생성 시 socket() 함수에 전달한 세 번째 인자가 일치한다는 뜻이다. TCP/IP 윈도우 소켓 프로그래밍

11 Ping (1) Ping 응용 프로그램 호스트나 라우터의 작동 여부를 확인할 때 사용 ICMP 프로토콜을 이용하여 구현
TCP/IP 윈도우 소켓 프로그래밍

12 Ping (2) ICMP 인터넷에 연결된 호스트나 라우터 간에 유용한 정보(오류 발생, 라우팅 정보 등)를 알리는 목적으로 사용 항상 IP 패킷에 포함된 형태로 전송되며 TCP/IP 프로토콜 동작에 필수 역할을 함 IP 헤더 ICMP 메시지 TCP/IP 윈도우 소켓 프로그래밍

13 Type과 Code에 따라 달라지는 부분(가변 길이)
Ping (3) ICMP 메시지 구조 ICMP 메시지 정의 Type Code Checksum Type과 Code에 따라 달라지는 부분(가변 길이) typedef struct _ICMPMESSAGE { u_char icmp_type; // type of message u_char icmp_code; // type sub code u_short icmp_cksum; // checksum ... } ICMPMESSAGE; TCP/IP 윈도우 소켓 프로그래밍

14 Ping (4) Ping 응용 프로그램 동작 원리 에코 요청, 에코 응답 ICMP 메시지 ping A A 에코 요청 에코 응답
Type(8 또는 0) Code(0) Checksum 옵션 데이터(가변 길이) Identifier Sequence Number TCP/IP 윈도우 소켓 프로그래밍

15 Ping (5) 에코 요청, 에코 응답 ICMP 메시지 정의 typedef struct _ICMPMESSAGE {
u_char icmp_type; // type of message u_char icmp_code; // type sub code u_short icmp_cksum; // checksum u_short icmp_id; // identifier u_short icmp_seq; // sequence number // 옵션 데이터 } ICMPMESSAGE; TCP/IP 윈도우 소켓 프로그래밍

16 Traceroute (1) Traceroute 응용 프로그램 호스트나 라우터까지의 IP 패킷 전달 경로를 확인
ICMP 프로토콜을 이용하여 구현 TCP/IP 윈도우 소켓 프로그래밍

17 Traceroute (2) Traceroute 동작 원리 에코 요청(TTL=1) tracert A 라우터 1 시간 초과
라우터 2 에코 요청(TTL=n) 라우터 n-1 ... 에코 응답 A TCP/IP 윈도우 소켓 프로그래밍

18 Traceroute (3) IP_TTL 또는 IPV6_UNICAST_HOPS 옵션 설정
#include <ws2tcpip.h> ... // IPv4의 TTL 변경 int optval = TTL 값; setsockopt(sock, IPPROTO_IP, IP_TTL, (char *)&optval, sizeof(optval)); #include <ws2tcpip.h> ... // IPv6의 TTL 변경 int optval = TTL 값; setsockopt(sock, IPPROTO_IPV6, IPV6_UNICAST_HOPS, (char *)&optval, sizeof(optval)); TCP/IP 윈도우 소켓 프로그래밍

19 ICMP.DLL (1) IcmpCreateFile() 함수 HANDLE IcmpCreateFile(void) ;
성공: 핸들, 실패: INVALID_HANDLE_VALUE TCP/IP 윈도우 소켓 프로그래밍

20 ICMP.DLL (2) IcmpSendEcho() 함수 DWORD IcmpSendEcho ( HANDLE IcmpHandle,
ULONG DestinationAddress, LPVOID RequestData, WORD RequestSize, PIP_OPTION_INFORMATION RequestOptions, LPVOID ReplyBuffer, DWORD ReplySize, DWORD Timeout ) ; 성공: ReplyBuffer에 저장된 ICMP_ECHO_REPLY 구조체 개수 실패: 0 TCP/IP 윈도우 소켓 프로그래밍

21 ICMP.DLL (3) 관련 구조체 typedef struct {
unsigned char Ttl; // Time To Live unsigned char Tos; // Type Of Service unsigned char Flags; // IP header flags unsigned char OptionsSize; // Size in bytes of options data unsigned char *OptionsData; // Pointer to options data } IP_OPTION_INFORMATION, *PIP_OPTION_INFORMATION; typedef struct { DWORD Address; // Replying address unsigned long Status; // Reply status unsigned long RoundTripTime; // RTT in milliseconds unsigned short DataSize; // Echo data size unsigned short Reserved; // Reserved for system use void *Data; // Pointer to the echo data IP_OPTION_INFORMATION Options; // Reply options } IP_ECHO_REPLY, *PIP_ECHO_REPLY; TCP/IP 윈도우 소켓 프로그래밍

22 ICMP.DLL (4) IcmpCloseHandle() 함수 BOOL IcmpCloseHandle (
HANDLE IcmpHandle ) ; 성공: TRUE, 실패: FALSE TCP/IP 윈도우 소켓 프로그래밍

23 ICMP.DLL (5) DLL 조작 함수 HMODULE LoadLibrary (
LPCTSTR lpFileName // DLL 파일 이름 ) ; 성공: 핸들, 실패: NULL FARPROC GetProcAddress ( HMODULE hModule, LPCSTR lpProcName ) ; 성공: 함수 주소, 실패: NULL BOOL WINAPI FreeLibrary( HMODULE hModule ); 성공: 0이 아닌 값, 실패: 0 TCP/IP 윈도우 소켓 프로그래밍

24 Thank you TCP/IP 윈도우 소켓 프로그래밍


Download ppt "12장. Raw 소켓 Raw 소켓의 특징과 사용 방법을 익힌다. Ping 프로그램의 동작 원리를 이해하고 작성 방법을 익힌다."
Ads by Google