<NETWORK>
= PACKET ANALIZER
= 암호(의미 파악할 수 없다)
= 규약 (PROTOCOL)
-계층구조 ( 단계 )
번지
동
구
시
- TCP/IP 4 Layer : OOO.OOO.OOO.OOO 계층 구조
- OSI 7(3 + 1 + 1 + 2) Layer :

= 먼거리 보낼 때 => 주소 필요
= 가까운거리( ex-401호 ) => MAC ADDRESS( 6 Byte - 겹치지 않음 ) 사용
= STAR형으로 연결
= PC ON - LAN 선 깜박임 ( 내가 일어났다(MAC1 ADDRESS + IP1 ADDRESS ) 방송(BROADCAST) <-> OK (응답 : 공유기))
-공유기 (MAC + IP 겹치지 않아야 함)
MAC1 IP1 => 등록 => (응답 : 등록 되었다 - 공유기 MAC 보냄)
- 공유기에 연결된 IP인 경우 => MAC을 보고 보냄
- 공유기에 연결된 IP가 아닌 경우 => 외부로 보냄
- 뿌띠 -> TCP + DATA -> 받는 IP + 보내는 IP + TCP + DATA -> 자신의 MAC(패킷을 만든 곳의 MAC)(운영체제가 셋팅) + 공유기 MAC(내 PC와 바로 연결되있는 것의 MAC) + 받는 IP + 자신의 IP + TCP + DATA
=> 멀리 보낼 경우 : MAC만 바꿔서 전달 -> 전달 (받는 IP주소에 도달 할 때 까지 반복)
= 라우팅
=패킷 건져올리기(아무거나 : => ROOT만 가능
(romiscuous)




Ethernet ( Eth0 ) 프로토콜을 따른다
=네트워크
6 byte + 6 byte => HWaddr
2 byte :
45 : ip4
- 하드웨어 규격 ( LAN 선 크기, 선 ...)
- 소프트웨어
=이더넷 헤더


=\b 커서 앞으로 이동
=\b+‘ ’ : 커서 앞으로 이동 + ' '로 덮어씀


=컴파일만 확인
gcc -c main-2.c






http://www.cavebear.com/archive/CaveBear/Ethernet/type.html
ETHERNET 0800 (뒤에 있는 것이 IP) || IP..ARP..RARP
- 네트워크 => BIG ENDIAN
- INTEL -> LITTLE ENDIAN
ntohs : BIG => LITTLE


=
#include <stdio.h> #include <pcap/pcap.h> #include <net/ethernet.h> #include <arpa/inet.h>
void Print_Ether(const void *); void HexaView(const void * , unsigned int); int main() { char * cpNICName;//network interface char caErrMsg[PCAP_ERRBUF_SIZE]; pcap_t * stpDS; const unsigned char *ucpData;
struct pcap_pkthdr stInfo;
cpNICName = pcap_lookupdev(caErrMsg); if(0 == cpNICName) { printf("ErrMsg : [%s]\n", caErrMsg); return 0; } printf("NICName : [%s]\n", cpNICName); stpDS = pcap_open_live(cpNICName, 1500, 1, 0, caErrMsg);
ucpData = pcap_next(stpDS,&stInfo);
Print_Ether(ucpData); HexaView(ucpData, 16 * 25);
pcap_close(stpDS); return 0; }
void Print_Ether(const void * vP) { int iCnt; printf("Dest MAC : "); for(iCnt = 0; iCnt < ETH_ALEN ; ++iCnt) { printf("%02X:",((struct ether_header *)vP)->ether_dhost[iCnt]); } printf("\b \n"); printf("Src MAC : "); for(iCnt = 0; iCnt < ETH_ALEN ; ++iCnt) { printf("%02X:",((struct ether_header *)vP)->ether_shost[iCnt]); } printf("\b \n"); printf("Next Layer "); switch(ntohs(((struct ether_header *)vP)->ether_type)) { case ETH_P_IP: printf("Internet Protocol packet"); break; } putchar('\n'); return; }
void HexaView(const void * vP, unsigned int uiLen) { unsigned int uiCnt; unsigned int uiLine;
printf("===============================================================================\n"); printf(" Address Hexa ASCII \n"); printf("-------------------------------------------------------------------------------\n"); for (uiLine = 0; uiLine < uiLen; uiLine = uiLine + 16) { printf(" %08d ", uiLine); //printf(" %08X ", vP); for (uiCnt = 0; uiCnt < 16; ++uiCnt) { printf("%02X ", *((unsigned char *)vP)); vP = (char *)vP + 1; } putchar(' '); vP = (char *)vP - 16; for (uiCnt = 0; uiCnt < 16; ++uiCnt) { if (32 > *((unsigned char *)vP)) // ASCII 32 => SPACE // 제어문자 => '.'출력 { putchar('.'); } else if ( 127 < *((unsigned char *)vP)) // ASCII 128이상 (확장아스키) // 한글 => '.'출력 { putchar('.'); } else { printf("%c", *((unsigned char *)vP)); } vP = (char *)vP + 1; } putchar('\n'); } return; }
|

