def packet_callback(self, _packet): tcp_packet = TCP(_packet.get_payload()) # check if this is a packet which we can modify if self.send_count % Rate.ERR == self.random_modulo_spoil and len( tcp_packet.load) > 1400: self.random_modulo_spoil = random.randint(0, Rate.ERR - 1) load_array = bytearray(tcp_packet.load) load_array[random.randint(0, len(tcp_packet.load) - 1)] = random.randint(0, 255) tcp_packet.load = bytes(load_array) _packet.set_payload(bytes(tcp_packet)) self.send_count += 1 _packet.accept()
def packet_callback(self, _packet): ip_packet = IP(_packet.get_payload()) tcp_packet = TCP(_packet.get_payload()) # check if this is a packet which we can modify if self.send_count % self.send_mod_packet == self.random_modulo: self.random_modulo = random.randint(0, self.send_mod_packet - 1) print("Trying to send stegano packet...") # check state if self.state == ServerState.READY: load_array = bytearray(tcp_packet.load) load_array = self.generate_packet(load_array, self.send_queue.popleft()) self.state = ServerState.KEY_SENT self.server_ip = ip_packet.src self.client_ip = ip_packet.dst tcp_packet.load = bytes(load_array) _packet.set_payload(bytes(tcp_packet)) print("Stegano packet sent.") elif self.state == ServerState.DATA_SENDING: load_array = bytearray(tcp_packet.load) load_array = self.generate_packet(load_array, self.send_queue.popleft()) tcp_packet.load = bytes(load_array) _packet.set_payload(bytes(tcp_packet)) print("Stegano packet sent.") # If it was last send packet in the next sending send FIN KEY if len(self.send_queue) == 0: self.state = ServerState.FIN_SENT elif self.send_count % Rate.ERR.value == self.random_modulo_spoil and len( tcp_packet.load) > 1400: self.random_modulo_spoil = random.randint(0, Rate.ERR.value - 1) load_array = bytearray(tcp_packet.load) load_array[random.randint(0, len(tcp_packet.load) - 1)] = random.randint(0, 255) tcp_packet.load = bytes(load_array) _packet.set_payload(bytes(tcp_packet)) elif ip_packet.src == self.client_ip and len(tcp_packet.load) > 50: if self.is_hash_valid(tcp_packet.load): data_packet = tcp_packet.load if self.state != ServerState.KEY_SENT: data_packet = self.decrypt_data(tcp_packet.load) session_id, sequence_id, flag, data_size, data = self.get_packet_data( data_packet) if session_id == self.session_id: if flag == Flag.KEY.value: self.client_public_key = RSA.importKey(data) self.state = ServerState.DATA_SENDING self.send_file_to_queue() elif flag == Flag.FIN.value and self.state == ServerState.FIN_SENT: tmp_header = self.generate_header( self.session_id, 4294967295, Flag.FIN_ACK.value, os.urandom(10)) encrypted_data = self.encrypt(tmp_header) self.send_queue.append(encrypted_data) self.state = ServerState.CLOSING self.send_count += 1 _packet.accept()