使用LLDB的Python API从内存地址读取N个字节

时间:2016-12-23 20:47:05

标签: python lldb

虽然LLDB的Python API看起来非常强大,但开始时有点困难。具体来说,我正在寻找一种从给定的内存地址读取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个字节?关于这个主题的好阅读材料也是最受欢迎的。

提前致谢。

3 个答案:

答案 0 :(得分:1)

您应该使用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

答案 1 :(得分:0)

在当前Frame对象上使用EvaluateExpression可以解决问题。例如:

debugger.GetSelectedTarget().GetProcess().GetSelectedThread().GetFrameAtIndex(0).EvaluateExpression(*(int*)(0x0000000100400000)).GetValue()

基于此answer

答案 2 :(得分:0)

这是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)

这是索引到所有相同类型的连续内存数组。名称param似乎是调试器可以用来向用户显示的标签,但与显示的实际值无关(即,您可以将其设置为任何内容并且它应该工作)。

唉,我还没弄清楚如何从头开始创造最终的论点。