예제 #1
0
    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
예제 #2
0
파일: test_api.py 프로젝트: yy221/zelos
 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)
예제 #3
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