<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, 150010, 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;
}






























'2015 스마트 콘트롤러 > 제어' 카테고리의 다른 글

20150522_NETWORK_PACKET ANALIZER_IP_2LAYER  (0) 2015.05.22
Posted by ahj333
,