def mutate_recursive_replacement(generalized_input, func, grimoire_inference): depth = rand.select(RECURSIVE_REPLACEMENT_DEPTH) generalized_input = recursive_replacement(generalized_input, grimoire_inference, depth) data = grimoire_inference.generalized_to_string(generalized_input) func(data, label="grim_recursive")
def mutate_replace_strings(generalized_input, func, grimoire_inference, string_matches): if len(string_matches) == 0: return payload = grimoire_inference.generalized_to_string(generalized_input) match = rand.select(string_matches) rand_str = rand.select(grimoire_inference.strings) # replace single instance data = payload[0:match.start()] + rand_str + payload[match.end():] func(data, label="grim_repl_str") # replace all instances data = payload.replace(payload[match.start():match.end()], rand_str) func(data, label="grim_repl_str")
def get_select_bitmap(elements, samples): array = [x for x in range(elements)] bitmap = [0 for _ in range(elements)] for _ in range(samples*elements): val = rand.select(array) bitmap[val] += 1 return bitmap
def get_gauss_sum(array, samples): # gauss sum over range(1...n) expect = 0.5*array[-1]*(array[-1]+1) # random sampled counting should arrive at similar result count = 0 for _ in range(samples*len(array)): count += rand.select(array) real = count/samples return expect, real
def random_generalized(grimoire_inference): rand_generalized = list( grimoire_inference.generalized_inputs.keys())[rand.int( len(grimoire_inference.generalized_inputs))] rand_generalized = pad_generalized_input(rand_generalized) if rand.int(100) > CHOOSE_SUBINPUT and len(rand_generalized) > 0: if rand.int(100) < 50 and len(rand_generalized) > 0: gap_indices = filter_gap_indices(rand_generalized) min_index, max_index = rand.select(gap_indices), rand.select( gap_indices) min_index, max_index = min(min_index, max_index), max(min_index, max_index) rand_generalized = rand_generalized[min_index:max_index + 1] else: random_token = list(grimoire_inference.tokens.keys())[rand.int( len(grimoire_inference.tokens))] rand_generalized = pad_generalized_input(random_token) assert rand_generalized[0] == b'' and rand_generalized[-1] == b'' return rand_generalized
def recursive_replacement(generalized_input, grimoire_inference, depth): for _ in range(depth): if len(generalized_input) >= 64 << 10: return generalized_input gap_indices = filter_gap_indices(generalized_input) if len(gap_indices) == 0: return generalized_input random_index = rand.select(gap_indices) generalized_input = generalized_input[ 0:random_index] + random_generalized( grimoire_inference) + generalized_input[random_index + 1:] return generalized_input