使用 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