import struct
import sys
def build_dns_query_packet() -> bytes:
dns = struct.pack(
"!HHHHHH",
0xABCD, 0x0100, 1, 0, 0, 0, )
dns += b"\x07example\x03com\x00"
dns += struct.pack("!HH", 1, 1)
udp_len = 8 + len(dns)
udp = struct.pack(
"!HHHH",
12345, 53, udp_len, 0, ) + dns
ipv4_total = 20 + len(udp)
ipv4 = struct.pack(
"!BBHHHBBH4s4s",
0x45, 0x00, ipv4_total, 0, 0, 64, 17, 0, bytes([192, 168, 1, 1]), bytes([8, 8, 8, 8]), )
ethernet = struct.pack(
"!6s6sH",
b"\xaa\xbb\xcc\xdd\xee\xff", b"\x11\x22\x33\x44\x55\x66", 0x0800, )
return ethernet + ipv4 + udp
def write_pcap(path: str, n: int) -> None:
pkt = build_dns_query_packet()
pkt_len = len(pkt)
with open(path, "wb") as f:
f.write(struct.pack("<IHHiIII",
0xA1B2C3D4, 2, 4, 0, 0, 65535, 1, ))
for i in range(n):
ts_sec = i // 1000
ts_usec = (i % 1000) * 1000
f.write(struct.pack("<IIII", ts_sec, ts_usec, pkt_len, pkt_len))
f.write(pkt)
def main() -> None:
if len(sys.argv) < 2:
print(f"Usage: {sys.argv[0]} <output_path> [packet_count]", file=sys.stderr)
sys.exit(1)
output_path = sys.argv[1]
count = int(sys.argv[2]) if len(sys.argv) >= 3 else 1000
write_pcap(output_path, count)
print(f"Wrote {count} DNS query packets to {output_path}")
if __name__ == "__main__":
main()