如何使用python通过LLDB读写寄存器?
我正在尝试使用python在寄存器到达断点时读/写寄存器 触发断点时,我能够执行一个简单的python脚本 我遇到的问题是读写单个寄存器。我可以得到一个寄存器列表,但没有寄存器如何使用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 +
* 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