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

如何使用python通过LLDB读写寄存器?,python,ios,debugging,trace,lldb,Python,Ios,Debugging,Trace,Lldb,我正在尝试使用python在寄存器到达断点时读/写寄存器 触发断点时,我能够执行一个简单的python脚本 我遇到的问题是读写单个寄存器。我可以得到一个寄存器列表,但没有寄存器 * thread #1, stop reason = signal SIGSTOP frame #0: 0x000000010521562c dyld` ImageLoaderMachO::usablePrebinding(ImageLoader::LinkContext const&) const +

我正在尝试使用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
*线程#1,停止原因=信号SIGSTOP
帧#0:0x000000010521562c dyld`ImageLoaderMachO::usablePrebinding(ImageLoader::LinkContext常量&)常量+56
dyld`ImageLoaderMachO::usablePrebinding:
->0x10521562c:ldrb w8[x19,#0x76]
0x105215630:ldrh w9[x19,#0x74]
0x105215634:bfi w9,w8,#16,#8
0x105215638:tbz w9,#0x9,0x105215694;
0x10521563c:ldr x8[x19]
0x105215640:LDRx8[x8,#0x378]
0x105215644:mov x0,x19
0x105215648:blr x8
目标0:(BBM)已停止。
(lldb)脚本
Python交互式解释器。要退出,请键入“退出()”、“退出()”或Ctrl-D。
>>>打印lldb.frame.registers

谁能帮助我使用哪种python api来更改x1寄存器值吗?

SBFrames上的
registers
属性是一个
SBValueList
,它存储寄存器集(GPR等)。每个寄存器集都是一个SBValue,各个寄存器表示为寄存器集的子寄存器,子寄存器名为寄存器名
x1
是一个GPR,GPR总是
寄存器中设置的第一个寄存器
SBValueList
GetFirstValueByName
按名称获取元素,因此您还可以通过编程方式找到“通用寄存器”

所以你可以这样做:

error = lldb.SBError()
did_change = lldb.frame.registers[0].GetChildMemberWithName('x1').SetValueFromCString("0x12345",error)
SetValueFromCString
如果能够更改值,则返回
True
,如果不能更改,则原因将存储在
error
参数中

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

此处描述了SBR值:


如果您想知道还可以对它们做些什么。

可以使用
registers
属性来替代
register
属性。通过名称访问寄存器非常方便。例如:

(lldb) script print lldb.frame.register["x1"].value
(lldb) script lldb.frame.register["x1"].value = "0"

@Dave Lee的回答在
lldb
脚本
界面中起作用

当我在一个完整的脚本中尝试同样的方法时,我得到了空的寄存器值

文件解释了所有问题。您需要传入exe\u ctx以获得正确的
上下文。这是
lldb.SBExecutionContext

def YDFooBarFunction(debugger, command, exe_ctx, result, internal_dict):
    """
        Reads and writes a register.
    """
    frame = exe_ctx.frame
    error = lldb.SBError()
    disposition = frame.FindRegister("rsi")
    print("[*]Original register: " + str(disposition))

    if disposition.unsigned == 2:
        print "[!]found 2 in the register"
        result = frame.registers[0].GetChildMemberWithName('rsi').SetValueFromCString("0x1", error)
        messages = {None: 'error', True: 'pass', False: 'fail'}
        print ("[*]PATCHING result: " + messages[result])

    thread = frame.GetThread()
    process = thread.GetProcess()
    process.Continue()
我希望这能节省人们打猎的时间

注意,我用伟人(@Jim Ingham)的部分答案写了一个寄存器

* 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