123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- import struct
- import socket
- import select
- import random
- ICMP_CODE = socket.getprotobyname('icmp')
- def checksum(source_string):
- sum = 0
- count_to = (len(source_string) / 2) * 2
- count = 0
- while count < count_to:
- this_val = source_string[count + 1]*256+source_string[count]
- sum = sum + this_val
- sum = sum & 0xffffffff
- count = count + 2
- if count_to < len(source_string):
- sum = sum + source_string[len(source_string) - 1]
- sum = sum & 0xffffffff
- sum = (sum >> 16) + (sum & 0xffff)
- sum = sum + (sum >> 16)
- answer = ~sum
- answer = answer & 0xffff
- answer = answer >> 8 | (answer << 8 & 0xff00)
- return answer
- def create_packet(id, data):
- ICMP_ECHO_REQUEST = 8 #Код типа ICMP - в нашем случае ECHO
- header = struct.pack('bbHHh', ICMP_ECHO_REQUEST, 0, 0, id, 1)
- data = data
- my_checksum = checksum(header + data)
- header = struct.pack('bbHHh', ICMP_ECHO_REQUEST, 0, socket.htons(my_checksum), id, 1)
- return header + data
- def send(dest_addr,data):
- my_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, ICMP_CODE)
- host = socket.gethostbyname(dest_addr)
- packet_id = random.randint(0,65535)
- packet = create_packet(packet_id,data)
-
- while packet:
- sent = my_socket.sendto(packet, (dest_addr, 1))
- packet = packet[sent:]
- return my_socket,packet_id
- def recv(my_socket, packet_id):
- ready = select.select([my_socket], [], [], 2) #таймаут 2с
- rec_packet, addr = my_socket.recvfrom(1024)
- icmp_header = rec_packet[20:28] # Байты с 20 по 28 - заголовок ICMP
- type, code, checksum, p_id, sequence = struct.unpack(
- 'bbHHh', icmp_header)
- data = rec_packet[28:] # Наш hello будет лежать после заголовка ICMP
- return data
- def main():
- sock, id=send("8.8.8.8",b"hohoho")
- print(recv(sock,id))
- if __name__ == '__main__':
- main()
|