|
@@ -37,7 +37,7 @@ class Message():
|
|
|
str_ = "{0}. at {1}: {2}-->{3}, {4}, refer:{5}".format(self.msg_id, self.time, self.src, self.dst, self.type, self.refer_msg_id)
|
|
|
return str_
|
|
|
|
|
|
-from random import randint, randrange, choice
|
|
|
+from random import randint, randrange, choice, uniform
|
|
|
from collections import deque
|
|
|
from scipy.stats import gamma
|
|
|
from lea import Lea
|
|
@@ -305,6 +305,24 @@ class MembersMgmtCommAttack(BaseAttack.BaseAttack):
|
|
|
bot_configs[bot]["TTL"] = self.statistics.process_db_query("most_used(ttlValue)")
|
|
|
|
|
|
|
|
|
+ def add_delay(timestamp, minDelay, delay):
|
|
|
+ '''
|
|
|
+ Adds delay to a timestamp, with a minimum value of minDelay. But usually a value close to delay
|
|
|
+ :param timestamp: the timestamp that is to be increased
|
|
|
+ :param minDelay: the minimum value that is to add to the timestamp
|
|
|
+ :param delay: The general size of the delay. Statistically speaking: the expected value
|
|
|
+ :return: the updated timestamp
|
|
|
+ '''
|
|
|
+
|
|
|
+ randomdelay = Lea.fromValFreqsDict({0.15*delay: 7, 0.3*delay: 10, 0.7*delay:20,
|
|
|
+ delay:33, 1.2*delay:20, 1.6*delay: 10, 1.9*delay: 7, 2.5*delay: 3, 4*delay: 1})
|
|
|
+ if 0.1*delay < minDelay:
|
|
|
+ print("Warning: minDelay probably too big when computing time_stamps")
|
|
|
+
|
|
|
+ general_offset = randomdelay.random()
|
|
|
+ unique_offset = uniform(-0.1*general_offset, 0.1*general_offset)
|
|
|
+ return timestamp + minDelay + general_offset + unique_offset
|
|
|
+
|
|
|
# parse input CSV or XML
|
|
|
filepath_xml = self.get_param_value(Param.FILE_XML)
|
|
|
filepath_csv = self.get_param_value(Param.FILE_CSV)
|
|
@@ -376,7 +394,62 @@ class MembersMgmtCommAttack(BaseAttack.BaseAttack):
|
|
|
add_ids_to_config(sorted(external_ids), existing_external_ips, new_external_ips, bot_configs, idtype="external", router_mac=router_mac)
|
|
|
|
|
|
#### Set realistic timestamps for messages ####
|
|
|
- #### ... ####
|
|
|
+
|
|
|
+ most_used_ip_address = self.statistics.get_most_used_ip_address()
|
|
|
+ minDelay, maxDelay = self.get_reply_delay(most_used_ip_address)
|
|
|
+ next_timestamp = self.get_param_value(Param.INJECT_AT_TIMESTAMP)
|
|
|
+ pcap_duration = float(self._get_capture_duration())
|
|
|
+ equi_timeslice = pcap_duration/len(messages)
|
|
|
+
|
|
|
+ # Dict, takes a tuple of 2 Bots as a key (IP with lower number first), returns the time when the Hello_reply came in
|
|
|
+ Hello_times = {}
|
|
|
+ # msg_IDs with already updated timestamps
|
|
|
+ updated_msgs = []
|
|
|
+
|
|
|
+ for req_msg in messages:
|
|
|
+ updated = 0
|
|
|
+ if(req_msg.msg_id in updated_msgs):
|
|
|
+ #message already updated
|
|
|
+ continue
|
|
|
+
|
|
|
+ if(req_msg.msg_id == -1):
|
|
|
+ #message has no corresponding request/response
|
|
|
+ req_msg.time = next_timestamp
|
|
|
+ next_timestamp = add_delay(next_timestamp, minDelay, equi_timeslice)
|
|
|
+ updated_msgs.append(req_msg.msg_id)
|
|
|
+ continue
|
|
|
+
|
|
|
+
|
|
|
+ elif req_msg.type != MessageType.SALITY_HELLO:
|
|
|
+ #Hello msg must have preceded, so make sure the timestamp of this msg is after the HELLO_REPLY
|
|
|
+ if int(req_msg.src) < int(req_msg.dst):
|
|
|
+ hello_time = Hello_times[(req_msg.src, req_msg.dst)]
|
|
|
+ else:
|
|
|
+ hello_time = Hello_times[(req_msg.dst, req_msg.src)]
|
|
|
+
|
|
|
+ if next_timestamp < hello_time:
|
|
|
+ #use the time of the hello_reply instead of next_timestamp to update this pair of messages
|
|
|
+ post_hello = add_delay(hello_time, minDelay, equi_timeslice)
|
|
|
+ respns_msg = messages[req_msg.refer_msg_id]
|
|
|
+ respns_msg.time = add_delay(post_hello, minDelay, equi_timeslice)
|
|
|
+ req_msg.time = post_hello
|
|
|
+ updated = 1
|
|
|
+
|
|
|
+ if not updated:
|
|
|
+ #update normally
|
|
|
+ respns_msg = messages[req_msg.refer_msg_id]
|
|
|
+ respns_msg.time = add_delay(next_timestamp, minDelay, equi_timeslice)
|
|
|
+ req_msg.time = next_timestamp
|
|
|
+ next_timestamp = add_delay(next_timestamp, minDelay, equi_timeslice)
|
|
|
+
|
|
|
+ updated_msgs.append(req_msg.msg_id)
|
|
|
+ updated_msgs.append(req_msg.refer_msg_id)
|
|
|
+
|
|
|
+ if req_msg.type == MessageType.SALITY_HELLO:
|
|
|
+ if int(req_msg.src) < int(req_msg.dst):
|
|
|
+ Hello_times[(req_msg.src, req_msg.dst)] = respns_msg.time
|
|
|
+ else:
|
|
|
+ Hello_times[(req_msg.dst, req_msg.src)] = respns_msg.time
|
|
|
|
|
|
# create port configurations for the bots
|
|
|
for bot in bot_configs:
|