def _syscall_callback(self, zelos: Zelos, sysname: str, args, retval: int): if zelos.thread is None: return thread_name = zelos.thread.name self.syscall_cnt += 1 self.syscall_thread_cnt[thread_name] += 1 # End execution if syscall limit reached if (zelos.config.syscall_limit > 0 and self.syscall_cnt >= zelos.config.syscall_limit): zelos.stop("syscall limit") return # End thread if syscall thread limit reached if (zelos.config.syscall_thread_limit != 0 and self.syscall_thread_cnt[thread_name] % zelos.config.syscall_thread_limit == 0): zelos.end_thread() return # Swap threads if syscall thread swap limit reached if (zelos.config.syscall_thread_swap > 0 and self.syscall_cnt % zelos.config.syscall_thread_swap == 0): zelos.swap_thread("syscall limit thread swap") return
def test_end_thread(self): z = Zelos(path.join(DATA_DIR, "static_elf_helloworld")) addr = 0x0816348F z.plugins.runner.run_to_addr(addr) z.end_thread() tm = z.internal_engine.thread_manager self.assertEqual(tm.num_active_threads(), 0)
def _syscall_callback(self, zelos: Zelos, sysname: str, args, retval: int): self.syscall_cnt += 1 # End execution if syscall limit reached if self.syscall_limit > 0 and self.syscall_cnt >= self.syscall_limit: zelos.stop("syscall limit") return # End thread if syscall thread limit reached if self.syscall_thread_limit != 0 and zelos.thread is not None: thread_name = zelos.thread.name self.syscall_thread_cnt[thread_name] += 1 if ( self.syscall_thread_cnt[thread_name] % self.syscall_thread_limit == 0 ): zelos.end_thread() return # Swap threads if syscall thread swap limit reached if ( self.syscall_thread_swap > 0 and self.syscall_cnt % self.syscall_thread_swap == 0 ): zelos.swap_thread("syscall limit thread swap") # Disable syscall printing if lots of repetitions occur if ( self._last_syscall_count <= self.rep_syscall_print_limit and self.rep_syscall_print_limit > 0 ): rep_print_limit = self.rep_syscall_print_limit syscall_manager = zelos.internal_engine.zos.syscall_manager if sysname == self._last_syscall: self._last_syscall_count += 1 else: self._last_syscall = sysname if self._last_syscall_count > rep_print_limit: self.logger.info(f"Syscall printing reenabled") syscall_manager.should_print_syscalls = True self._last_syscall_count = 1 if self._last_syscall_count == rep_print_limit: self.logger.info( f"Syscall {self._last_syscall} called over " f"{rep_print_limit} times. No longer printing syscalls" ) syscall_manager.should_print_syscalls = False