Presentation is loading. Please wait.

Presentation is loading. Please wait.

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 프로그램의 동작 원리를 이해하고 작성 방법을 익힌다."

Similar presentations


Ads by Google