arping.py (2834B)
1 # Scapy 라이브러리에서 필요한 모든 기능을 import
2 from scapy.all import *
3 # 명령행 인자를 처리하기 위해 sys 모듈과 argparse 모듈 사용
4 import sys
5 import time
6 import argparse
7
8 def send_arp_request(target_ip, count, continuous):
9 """
10 특정 IP 주소에 대한 ARP 요청을 여러 번 또는 지속적으로 전송하고, 응답을 받는 함수
11 - target_ip: ARP 요청을 보낼 대상의 IP 주소
12 - count: 전송할 ARP 패킷의 수 (continuous가 True일 때는 무시됨)
13 - continuous: True일 경우 사용자가 멈출 때까지 지속적으로 패킷을 전송
14 """
15
16 if continuous:
17 print(f"[*] Continuously sending ARP requests to {target_ip}...")
18 else:
19 print(f"[*] Sending {count} ARP requests to {target_ip}...")
20
21 try:
22 i = 0
23 while continuous or i < count:
24 # ARP 요청 패킷을 생성
25 arp_request = Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(pdst=target_ip)
26
27 # srp() 함수는 Layer 2 (Ethernet) 계층에서 패킷을 전송하고 응답을 대기하는 함수
28 answered, unanswered = srp(arp_request, timeout=2, verbose=False)
29
30 # 응답이 있는 경우 응답한 패킷들에 대한 MAC 주소를 출력
31 if answered:
32 for send, receive in answered:
33 print(f"[{i+1}] [+] MAC address for {target_ip}: {receive[ARP].hwsrc}")
34 else:
35 print(f"[{i+1}] [!] No response from {target_ip}")
36
37 i += 1
38 # 각 ARP 요청 후 1초 대기
39 time.sleep(1)
40
41 except KeyboardInterrupt:
42 print("\n[!] ARP request stopped by user.")
43
44 if __name__ == "__main__":
45 """
46 스크립트의 메인 실행 부분
47 명령행 인자로 전달된 IP 주소와 패킷 수, 또는 지속 전송 옵션을 사용하여 ARP 요청을 보냄
48 """
49
50 # argparse를 사용하여 명령행 인자 처리
51 parser = argparse.ArgumentParser(description="Script to send ARP requests")
52 # target_ip 인자는 ARP 요청을 보낼 타겟 IP 주소를 지정
53 parser.add_argument("target_ip", help="Target IP address to send ARP request")
54 # -c 또는 --count 플래그는 ARP 요청을 보낼 횟수를 지정하며, 기본값은 1회로 설정
55 parser.add_argument("-c", "--count", type=int, default=1, help="Number of ARP requests to send (default: 1)")
56 # -t 플래그는 사용자가 중지할 때까지 ARP 요청을 지속적으로 보냄
57 parser.add_argument("-t", "--continuous", action="store_true", help="Send ARP requests continuously until stopped")
58 args = parser.parse_args()
59
60 # ARP 요청을 전송하는 함수를 호출
61 send_arp_request(args.target_ip, args.count, args.continuous)