def read_ptr(self, addr): # TODO: maybe use read_memory stuff ? try: val = gxf.parse_and_eval("*(void **)%#x" % addr) val.fetch_lazy() except gdb.MemoryError as e: raise gxf.MemoryError(e) return val
def get_heading(self, stack="$sp"): # We need three primitives: # compute_jmp_addr (flags + expression) # compute_ret_addr (from stack) # compute_call_addr (expression) if self.itype is RET: return gxf.parse_and_eval("*(void **) (%s)" % stack) if self.itype is CALL: exp = self.get_expression() val = exp.eval() return val if self.itype is JMP and check_flags(self.inst): exp = self.get_expression() val = exp.eval() return val
def get_addrsz(): return int(gxf.parse_and_eval("sizeof (void *)"))
def read_str(self, addr, *args, **kwargs): ptr = gxf.parse_and_eval("(char *)%#x" % addr) return ptr.string(*args, **kwargs)
def read_str(self, addr, *args, maxlen=4096, **kwargs): if maxlen is not None: ptr = gxf.parse_and_eval("*(char (*)[%d])%#x" % (maxlen, addr)) else: ptr = gxf.parse_and_eval("(char *)%#x" % addr) return ptr.string(*args, **kwargs)