代码之家  ›  专栏  ›  技术社区  ›  Sergio

LLDB在内存转储中显示陷阱操作码

  •  0
  • Sergio  · 技术社区  · 5 年前

    我想知道,在LLDB的内存转储程序中,是否有可能在我刚刚设置了一个触发点的位置看到陷阱操作码? 正如我所见,LLDB足够聪明,可以用原始操作码来隐藏陷阱操作码:

    (lldb) memory read --format instruction --count 5 0x00000076619b5478
    ->  0x76619b5478: 0xf9401668   ldr    x8, [x19, #0x28]
        0x76619b547c: 0xf9400289   ldr    x9, [x20]
        0x76619b5480: 0xeb09011f   cmp    x8, x9
        0x76619b5484: 0x540000e1   b.ne   0x76619b54a0              ; <+200>
        0x76619b5488: 0xa95d7bf3   ldp    x19, x30, [sp, #0x1d0]
    (lldb) breakpoint set --address 0x76619b5488
    Breakpoint 3: where = libface_detector_v2_jni.so`___lldb_unnamed_symbol20247$$libface_detector_v2_jni.so + 176, address = 0x00000076619b5488
    (lldb) memory read --format instruction --count 5 0x00000076619b5478
    ->  0x76619b5478: 0xf9401668   ldr    x8, [x19, #0x28]
        0x76619b547c: 0xf9400289   ldr    x9, [x20]
        0x76619b5480: 0xeb09011f   cmp    x8, x9
        0x76619b5484: 0x540000e1   b.ne   0x76619b54a0              ; <+200>
        0x76619b5488: 0xa95d7bf3   ldp    x19, x30, [sp, #0x1d0]
    

    在这里,我在 0x76619b5488 但dumper仍然在那个地方展示原始指令。 help memory read 没有关于如何看到陷阱操作码的提示。

    有什么想法吗?

    另外,它是一个与Android SDK捆绑的LLDB,声称版本: 7.0.0 .目标是安卓Aarch64。

    0 回复  |  直到 5 年前
        1
  •  3
  •   Employed Russian    5 年前

    在这里,我将中断设置为0x76619b5488,但dumper仍在该位置显示原始指令。

    这是调试器的典型特征:他们不想让您对插入的断点指令感到困惑,所以向您展示 起初的 记忆的内容。

    在x86上,执行任何其他操作都会取消指令流的同步(因为指令长度可变),因此显示 真实的 插入断点的指令会产生完全的垃圾。

    人们怎么能看到陷阱操作码

    您可以复制(拍摄快照)内存区域(例如,1个函数的内存值),并在该函数上有断点时将其与当前内容进行比较。他们不会匹配。这是程序检测正在调试的方式之一。

    然后,您可以要求LLDB分解复制的区域(对于插入断点后进行的复制),您将看到希望观察的断点(但IP相对偏移量将指向错误的位置)。

    我不知道有什么更简单的方法可以做到这一点。