使用 LLDB Python API 从内存地址读取 N 个字节
Reading N bytes from a memory address using LLDB's Python API
虽然LLDB的PythonAPI看起来很强大,但是上手有点难。具体来说,我正在寻找一种从给定内存地址读取 N 字节的方法。我想我可以使用 lldb.SBValue.CreateValueFromAddress
方法来做到这一点,该方法映射到:
SBValue_CreateValueFromAddress(SBValue self, char const * name, lldb::addr_t address, SBType type) -> SBValue
不幸的是,我无法从参考文档中弄清楚要传递的参数及其含义。另一种方法是创建一个 lldb.SBAddress
但我再次陷入困境,因为我不清楚 __init__
所需的参数。
问题: 如何使用 LLDB Python API 从给定的内存地址读取 N 个字节?关于该主题的良好阅读 material 也是最受欢迎的。
提前致谢。
在当前 Frame 对象上使用 EvaluateExpression
就可以了。例如:
debugger.GetSelectedTarget().GetProcess().GetSelectedThread().GetFrameAtIndex(0).EvaluateExpression(*(int*)(0x0000000100400000)).GetValue()
基于此answer。
这是 Rust 的 LLDB 格式化程序的示例:
element_type_size = element_type.GetByteSize()
def render_element(i):
address = start_address + i * element_type_size
element_val = raw_value.CreateValueFromAddress(array_name + ("[%s]" % i),
address,
element_type)
这是对所有相同类型的连续内存数组的索引。 name param 似乎是调试器可以用来向用户显示的标签,但与显示的实际值无关(即,您可以将其设置为任何东西,它应该可以工作)。
唉,我还不太明白如何从头开始创建最后一个参数。
你应该使用 SBProcess.ReadMemory
.
def my_command(debugger, command, result, internal_dict):
my_address = 0xdeadbeef # change for some real address
my_data_size = 0x1000 # change for some real memory size
error_ref = lldb.SBError()
process = debugger.GetSelectedTarget().GetProcess()
memory = process.ReadMemory(my_address, my_data_size, error_ref)
if error_ref.Success():
# `memory` is a regular byte string
else:
result.AppendString(str(error_ref))
ReadMemory
如果出错修改error_ref
。
虽然LLDB的PythonAPI看起来很强大,但是上手有点难。具体来说,我正在寻找一种从给定内存地址读取 N 字节的方法。我想我可以使用 lldb.SBValue.CreateValueFromAddress
方法来做到这一点,该方法映射到:
SBValue_CreateValueFromAddress(SBValue self, char const * name, lldb::addr_t address, SBType type) -> SBValue
不幸的是,我无法从参考文档中弄清楚要传递的参数及其含义。另一种方法是创建一个 lldb.SBAddress
但我再次陷入困境,因为我不清楚 __init__
所需的参数。
问题: 如何使用 LLDB Python API 从给定的内存地址读取 N 个字节?关于该主题的良好阅读 material 也是最受欢迎的。
提前致谢。
在当前 Frame 对象上使用 EvaluateExpression
就可以了。例如:
debugger.GetSelectedTarget().GetProcess().GetSelectedThread().GetFrameAtIndex(0).EvaluateExpression(*(int*)(0x0000000100400000)).GetValue()
基于此answer。
这是 Rust 的 LLDB 格式化程序的示例:
element_type_size = element_type.GetByteSize() def render_element(i): address = start_address + i * element_type_size element_val = raw_value.CreateValueFromAddress(array_name + ("[%s]" % i), address, element_type)
这是对所有相同类型的连续内存数组的索引。 name param 似乎是调试器可以用来向用户显示的标签,但与显示的实际值无关(即,您可以将其设置为任何东西,它应该可以工作)。
唉,我还不太明白如何从头开始创建最后一个参数。
你应该使用 SBProcess.ReadMemory
.
def my_command(debugger, command, result, internal_dict):
my_address = 0xdeadbeef # change for some real address
my_data_size = 0x1000 # change for some real memory size
error_ref = lldb.SBError()
process = debugger.GetSelectedTarget().GetProcess()
memory = process.ReadMemory(my_address, my_data_size, error_ref)
if error_ref.Success():
# `memory` is a regular byte string
else:
result.AppendString(str(error_ref))
ReadMemory
如果出错修改error_ref
。