ARP 소켓 프로그래밍
ARP 소켓 프로그래밍 소스코드 분석
[ vi mypacket.py ] -> 이더넷과 arp를 클래스로 정의
ARP 헤더 부분만 분석
1) __init__ : raw 데이터를 받아올때 앞에 이더넷 헤더부분을 제외하고 뒤에서부터 헤더부분에 맞는 바이트씩 슬라이스해서 객체변수에 넣는다.
2) get_header : arp패킷을 보낼때 사용하는 것으로, 입력값을 주면 그 값을 arp헤더로 만들어서 전송하게 해주는 부분
3) hwType : 변경할때만 byte로 변환할 수 있게 pack해주었다.
4) protocolType : 변경할때만 byte로 변환할 수 있게끔 pack해주었다.
5) hwSize : 변경할때만 byte로 변환할 수 있게끔 pack해주었다.
6) protocolSize : 변경할때만 byte로 변환할 수 있게끔 pack해주었다.
7) opcode : 변경할때만 byte로 변환할 수 있게끔 pack해주었다.
8) senderMac : ARP패킷을 받아올때에는 바이트타입이기 때문에 unpack해주면서 mac 주소를 00 : 00 이런식으로 앞에 16진수 2자리와 : 를 결합한 식으로 돌려주는 코드를 짰다.
ARP패킷을 보낼때에는 먼저 - 나 : 가 있으면 split으로 나눠주고, 다시 그 값을 결합시켜 string 타입으로 만들어준다음에 그것을 fromhex로 16진수로 변환했다.
9) senderIp : ARP패킷을 받아올때에는 바이트타입이기 때문에 unpack을해주면서 0.0.0.0 이런형태로 표시해주기 위해 %d. 포맷스트링을 써 주었다.
ARP패킷을 보낼때에는 따로따로 pack해주면서 결합시키는 방식으로 만들어 주었다.
10) targetMac : senderMac 과 동일하다
11) targetIp : senderIp와 동일하다
[ vi sniffer.py ] 만든 클래스를 받아오고 패킷이 이동하는지 보기위해서 만든다.
패킷이라는 클래스를 하나 만들어주어 앞에 mypacket에 있는 내용들을 묶어준다.( has -a )
raw 데이터를 받아오면 이더넷 타입이 arp인것(0x0806)인것만 받아오고, 내가 보낼 상대방 주소만 받기위해서 더 써주었다.
그리고 보낸 내용과 받아온 내용들을 프린트해준다.
[ vi arp.py ] arp 패킷을 보내기 위한 용도로 만들었다.
상대방의 mac 주소를 모르기때문에 이더넷의 도착지 주소를 브로드캐스트로 뿌려준다.
arp hwtype은 이더넷이기때문에 1, protocol type은 ipv4를 쓰기때문에 0x0800 hwsize는 ethernetsize로 6 protocolsize는 ipv4의 protocol size인 4를 입력한다.
opcode는 이 arp로 보낼 것이기때문에 요청하는 것으로 request인 1를 보낸다.
sendermac, senderip, targetmac, targetip를 입력한다. targetmac은 모르기때문에 0으로 써준다.
그리고 현재 바이트 타입으로 되어있지 않기 때문에 mypacket에 있는 getheader를 통해 합쳐준다.
getheader가 실행되기전에는 mypacket에 setter부분에서 변환시켜 준다.
그 다음에 getheader로 바이트타입의 한줄로 표현하게 된다.
소켓을 하나 만들어준다음에 그것을 보내준다.
[ arp.py 결과창 ]
sniffer를 실행하고 나서 arp를 실행하게 되면 바이트 타입의 한줄로 프린트 된것을 볼 수 있다. 이 데이터가 arp안에 소스코드부분에 쓴 기본적인 내용들이 한줄로 표현된 것이다.
이 데이터를 상대방에게 보내준다.
[ sniffer 결과창 ]
arp request를 통해 브로드캐스트된 내용들이 출력되고, 응답하는 상대방 ip가 자신의 mac주소와 함께 다시 reply로 보내주게 된다.