diff options
Diffstat (limited to 'lldb_target.py')
| -rw-r--r-- | lldb_target.py | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/lldb_target.py b/lldb_target.py index 1ff9f53..93efb7d 100644 --- a/lldb_target.py +++ b/lldb_target.py @@ -72,14 +72,22 @@ class LLDBConcreteTarget(ConcreteTarget): self.debugger.Terminate() print(f'Program exited with status {self.process.GetState()}') - def read_register(self, regname: str) -> int: + def _get_register(self, regname: str) -> lldb.SBValue: + """Find a register by name. + + :raise SimConcreteRegisterError: If no register with the specified name + can be found. + """ frame = self.process.GetThreadAtIndex(0).GetFrameAtIndex(0) reg = frame.FindRegister(regname) if reg is None: raise SimConcreteRegisterError( - f'[In LLDBConcreteTarget.read_register]: Register {regname}' + f'[In LLDBConcreteTarget._get_register]: Register {regname}' f' not found.') + return reg + def read_register(self, regname: str) -> int: + reg = self._get_register(regname) val = reg.GetValue() if val is None: raise SimConcreteRegisterError( @@ -88,6 +96,15 @@ class LLDBConcreteTarget(ConcreteTarget): return int(val, 16) + def write_register(self, regname: str, value: int): + reg = self._get_register(regname) + error = lldb.SBError() + reg.SetValueFromCString(hex(value), error) + if not error.success: + raise SimConcreteRegisterError( + f'[In LLDBConcreteTarget.write_register]: Unable to set' + f' {regname} to value {hex(value)}!') + def read_memory(self, addr, size): err = lldb.SBError() content = self.process.ReadMemory(addr, size, err) |