如何使用python通过LLDB读写寄存器?

Car*_*ard 4 python debugging trace ios lldb

我试图在遇到断点时使用 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
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我可以使用哪个 python api 来更改 x1 寄存器值?

Jim*_*ham 5

registersSBFrames 上的属性是一个SBValueList存储寄存器组(GPR 等)的属性。每个寄存器集都是一个 SBValue,各个寄存器被表示为寄存器集的子代,子名就是寄存器名。 x1是 GPR,并且 GPR 始终是 中设置的第一个寄存器registersSBValueListGetFirstValueByName可以按名称获取元素,因此您还可以通过编程找到“通用寄存器”。

所以你会做这样的事情:

error = lldb.SBError()
did_change = lldb.frame.registers[0].GetChildMemberWithName('x1').SetValueFromCString("0x12345",error)
Run Code Online (Sandbox Code Playgroud)

SetValueFromCStringTrue如果它能够更改值,则返回,如果不能,则将原因存储在error参数中。

请注意,像 volatile 寄存器x1不会跨函数调用存储,因此您只能在当前执行的帧中访问或更改它们的值。

SBValues 在这里描述:

https://lldb.llvm.org/python_reference/lldb.SBValue-class.html

如果你想知道你还能用它们做什么。


Dav*_*Lee 5

财产的替代品registersregister财产。通过名称访问寄存器很方便。例如:

(lldb) script print lldb.frame.register["x1"].value
(lldb) script lldb.frame.register["x1"].value = "0"
Run Code Online (Sandbox Code Playgroud)