diff --git a/scripts/sniffer.py b/scripts/sniffer.py
index de18eb2..612ff20 100644
--- a/scripts/sniffer.py
+++ b/scripts/sniffer.py
@@ -1,4 +1,134 @@
-# This will be the basic sniffer script
-# Its purpose is to sniff for a specific packet and return its headers-n-data
+import binascii
+import socket
+import struct
 
-pass
+
+class unpack:
+    def __init__(self):
+        self.data = None
+
+    # Ethernet Header
+    def eth_header(self, data):
+        storeobj = data
+        storeobj = struct.unpack("!6s6sH", storeobj)
+        destination_mac = binascii.hexlify(storeobj[0])
+        source_mac = binascii.hexlify(storeobj[1])
+        eth_protocol = storeobj[2]
+        data = {"Destination Mac": destination_mac,
+                "Source Mac": source_mac,
+                "Protocol": eth_protocol}
+        return data
+
+    # ICMP HEADER Extraction
+    def icmp_header(self, data):
+        icmph = struct.unpack('!BBH', data)
+        icmp_type = icmph[0]
+        code = icmph[1]
+        checksum = icmph[2]
+        data = {'ICMP Type': icmp_type,
+                "Code": code,
+                "CheckSum": checksum}
+        return data
+
+    # UDP Header Extraction
+    def udp_header(self, data):
+        storeobj = struct.unpack('!HHHH', data)
+        source_port = storeobj[0]
+        dest_port = storeobj[1]
+        length = storeobj[2]
+        checksum = storeobj[3]
+        data = {"Source Port": source_port,
+                "Destination Port": dest_port,
+                "Length": length,
+                "CheckSum": checksum}
+        return data
+
+    # IP Header Extraction
+    def ip_header(self, data):
+        storeobj = struct.unpack("!BBHHHBBH4s4s", data)
+        _version = storeobj[0]
+        _tos = storeobj[1]
+        _total_length = storeobj[2]
+        _identification = storeobj[3]
+        _fragment_Offset = storeobj[4]
+        _ttl = storeobj[5]
+        _protocol = storeobj[6]
+        _header_checksum = storeobj[7]
+        _source_address = socket.inet_ntoa(storeobj[8])
+        _destination_address = socket.inet_ntoa(storeobj[9])
+
+        data = {'Version': _version,
+                "Tos": _tos,
+                "Total Length": _total_length,
+                "Identification": _identification,
+                "Fragment": _fragment_Offset,
+                "TTL": _ttl,
+                "Protocol": _protocol,
+                "Header CheckSum": _header_checksum,
+                "Source Address": _source_address,
+                "Destination Address": _destination_address}
+        return data
+
+    # Tcp Header Extraction
+    def tcp_header(self, data):
+        storeobj = struct.unpack('!HHLLBBHHH', data)
+        _source_port = storeobj[0]
+        _destination_port = storeobj[1]
+        _sequence_number = storeobj[2]
+        _acknowledge_number = storeobj[3]
+        _offset_reserved = storeobj[4]
+        _tcp_flag = storeobj[5]
+        _window = storeobj[6]
+        _checksum = storeobj[7]
+        _urgent_pointer = storeobj[8]
+        data = {"Source Port": _source_port,
+                "Destination Port": _destination_port,
+                "Sequence Number": _sequence_number,
+                "Acknowledge Number": _acknowledge_number,
+                "Offset & Reserved": _offset_reserved,
+                "Tcp Flag": _tcp_flag,
+                "Window": _window,
+                "CheckSum": _checksum,
+                "Urgent Pointer": _urgent_pointer
+                }
+        return data
+
+# Mac Address Formating
+
+
+def mac_formater(a):
+    b = "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x" % (ord(a[0]), ord(
+        a[1]), ord(a[2]), ord(a[3]), ord(a[4]), ord(a[5]))
+    return b
+
+
+def get_host(q):
+    try:
+        k = socket.gethostbyaddr(q)
+    except Exception:
+        k = 'Unknown'
+    return k
+
+
+s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0800))
+u = unpack()
+count = 5
+while count > 0:
+    count -= 1
+    # Capture packets from network
+    pkt = s.recvfrom(65565)
+
+    print "\n\n===&gt;&gt; [+] ------------ Ethernet Header----- [+]"
+
+    # print data on terminal
+    for i in u.eth_header(pkt[0][0:14]).iteritems():
+        a, b = i
+        print "{} : {} | ".format(a, b),
+    print "\n===&gt;&gt; [+] ------------ IP Header ------------[+]"
+    for i in u.ip_header(pkt[0][14:34]).iteritems():
+        a, b = i
+        print "{} : {} | ".format(a, b),
+    print "\n===&gt;&gt; [+] ------------ Tcp Header ----------- [+]"
+    for i in u.tcp_header(pkt[0][34:54]).iteritems():
+        a, b = i
+        print "{} : {} | ".format(a, b),
