我正在尝试使用python在它到达断点时读/写一个寄存器。
当触发断点时,我能够执行一个简单的python脚本。
我遇到的问题是读写单个寄存器。我可以得到一个寄存器列表,但不是寄存器。
* thread #1, stop reason = signal SIGSTOP
frame #0: 0x000000010521562c dyld` ImageLoaderMachO::usablePrebinding(ImageLoader::LinkContext const&) const + 56
dyld`ImageLoaderMachO::usablePrebinding:
-> 0x10521562c <+56>: ldrb w8, [x19, #0x76]
0x105215630 <+60>: ldrh w9, [x19, #0x74]
0x105215634 <+64>: bfi w9, w8, #16, #8
0x105215638 <+68>: tbz w9, #0x9, 0x105215694 ; <+160>
0x10521563c <+72>: ldr x8, [x19]
0x105215640 <+76>: ldr x8, [x8, #0x378]
0x105215644 <+80>: mov x0, x19
0x105215648 <+84>: blr x8
Target 0: (BBM) stopped.
(lldb) script
Python Interactive Interpreter. To exit, type 'quit()', 'exit()' or Ctrl-D.
>>> print lldb.frame.registers
任何人都可以帮助我,我可以使用哪个python api来更改x1寄存器值?
SBFrames上的registers
属性是一个SBValueList
,它存储寄存器集(GPR等)。每个寄存器集都是SBValue,各个寄存器表示为寄存器集的子节点,子节点名是寄存器名。 x1
是GPR,GPR始终是registers
中的第一个寄存器。 SBValueList
也GetFirstValueByName
按名称获取元素,因此您也可以通过编程方式找到“通用寄存器”。
所以你会做类似的事情:
error = lldb.SBError()
did_change = lldb.frame.registers[0].GetChildMemberWithName('x1').SetValueFromCString("0x12345",error)
SetValueFromCString
如果能够更改值,则返回True
,如果不能,则将原因存储在error
参数中。
请注意,像x1
这样的易失性寄存器不会存储在函数调用之间,因此您只能访问或更改当前正在执行的帧中的值。
SBValues在这里描述:
https://lldb.llvm.org/python_reference/lldb.SBValue-class.html
如果你想知道你还能用它做什么。
registers
属性的另一种选择是register
属性。按名称访问寄存器很方便。例如:
(lldb) script print lldb.frame.register["x1"].value
(lldb) script lldb.frame.register["x1"].value = "0"