def main(): signal.signal(signal.SIGUSR1, handle_pdb) print(os.getpid()) time.sleep(1) config = FuzzerConfiguration() num_processes = config.argument_values['p'] num_concolic = config.argument_values['concolic'] reload = False if config.argument_values['Purge'] and check_if_old_state_exits( config.argument_values['work_dir']): print_warning("Old workspace found!") print_warning("Wiping old workspace...") prepare_working_dir(config.argument_values['work_dir'], purge=config.argument_values['Purge']) time.sleep(2) if not check_if_old_state_exits(config.argument_values['work_dir']): if not prepare_working_dir(config.argument_values['work_dir'], purge=config.argument_values['Purge']): print_fail("Working directory is weired or corrupted...") return 1 if not copy_seed_files(config.argument_values['work_dir'], config.argument_values['seed_dir']): print_fail("Seed directory is empty...") return 1 config.save_data() else: log_core("Old state exist -> loading...") config.load_data() reload = True DO_USE_UI = (USE_UI and not config.argument_values['verbose'] and config.argument_values['f']) comm = Communicator(num_processes=num_processes, concolic_thread=num_concolic) master = MasterProcess(comm, reload=reload) mapserver_process = multiprocessing.Process(name='MAPSERVER', target=mapserver_loader, args=(comm, reload)) modelserver_process = multiprocessing.Process(name='MODELSERVER', target=modelserver_loader, args=(comm, )) update_process = multiprocessing.Process(name='UPDATE', target=update_loader, args=(comm, DO_USE_UI)) slaves = [] for i in range(num_processes): slave = SlaveThread(comm, i, reload=reload) slaves.append(slave) concolic_models = [] for i in range(num_concolic): controller = ConcolicController(comm, num_processes, i) slaves.append(controller) concolic_models.append(controller.model) concserv = ConcolicServerThread(comm, num_processes, num_concolic, concolic_models) comm.start() comm.create_shm() update_process.start() time.sleep(.1) mapserver_process.start() modelserver_process.start() concserv.start() for slave in slaves: slave.start() # print('Starting master loop') try: master.loop() except KeyboardInterrupt: master.stop() print('Saving data') # Wait for child processes to properly exit mapserver_process.join() update_process.join() concserv.stop() # Properly stop threads for slave in slaves: slave.stop() time.sleep(1) # Stop communicator last because Queues may be in used comm.stop() master.save_data() print('Data saved')
def start(): config = FuzzerConfiguration() if not post_self_check(config): return -1 if config.argument_values['v']: enable_logging() num_processes = config.argument_values['p'] if config.argument_values['Purge'] and check_if_old_state_exits( config.argument_values['work_dir']): print_warning("Old workspace found!") if ask_for_permission("PURGE", " to wipe old workspace:"): print_warning("Wiping old workspace...") prepare_working_dir(config.argument_values['work_dir'], purge=True) time.sleep(2) else: print_fail("Aborting...") return 0 if not check_if_old_state_exits(config.argument_values['work_dir']): if not prepare_working_dir(config.argument_values['work_dir'], purge=True): print_fail("Working directory is weired or corrupted...") return 1 if not copy_seed_files(config.argument_values['work_dir'], config.argument_values['seed_dir']): print_fail("Seed directory is empty...") return 1 config.save_data() else: log_core("Old state exist -> loading...") config.load_data() comm = Communicator(num_processes=num_processes, tasks_per_requests=config.argument_values['t'], bitmap_size=config.config_values["BITMAP_SHM_SIZE"]) comm.create_shm() qlookup = QemuLookupSet() master = MasterProcess(comm) update_process = multiprocessing.Process(name='UPDATE', target=update_loader, args=(comm, )) mapserver_process = multiprocessing.Process(name='MAPSERVER', target=mapserver_loader, args=(comm, )) slaves = [] for i in range(num_processes): slaves.append( multiprocessing.Process(name='SLAVE' + str(i), target=slave_loader, args=(comm, i))) slaves[i].start() update_process.start() mapserver_process.start() try: master.loop() except KeyboardInterrupt: master.save_data() log_core("Date saved!") signal.signal(signal.SIGINT, signal.SIG_IGN) counter = 0 print_pre_exit_msg(counter, clrscr=True) for slave in slaves: while True: counter += 1 print_pre_exit_msg(counter) slave.join(timeout=0.25) if not slave.is_alive(): break print_exit_msg() return 0