def ql_syscall_execve(ql: Qiling, pathname: int, argv: int, envp: int): file_path = ql.os.utils.read_cstring(pathname) real_path = ql.os.path.transform_to_real_path(file_path) def __read_str_array(addr: int) -> Iterator[str]: if addr: while True: elem = ql.mem.read_ptr(addr) if elem == 0: break yield ql.os.utils.read_cstring(elem) addr += ql.pointersize args = [s for s in __read_str_array(argv)] env = {} for s in __read_str_array(envp): k, _, v = s.partition('=') env[k] = v ql.emu_stop() ql.log.debug( f'execve({file_path}, [{", ".join(args)}], [{", ".join(f"{k}={v}" for k, v in env.items())}])' ) ql.loader.argv = args ql.loader.env = env ql._path = real_path ql.mem.map_info = [] ql.clear_ql_hooks() # Clean debugger to prevent port conflicts ql.debugger = None if ql.code: return ql._uc = ql.arch.init_uc QlCoreHooks.__init__(ql, ql._uc) ql.os.load() ql.loader.run() ql.run()