gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:12:10 27 4
gpt4 key购买 nike

我想知道是否有可能使用 LLDB 的内存转储器在我刚刚设置的 beakpoint 的位置看到陷阱操作码?正如我所看到的,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。目标是 Android Aarch64。

最佳答案

Here I set a break at 0x76619b5488 but dumper still shows original instruction at that place.

这是非常典型的调试器:他们不想让您混淆他们插入的断点指令,因此向您展示内存的原始内容。

在 x86 上,做任何其他事情都会使指令流不同步(因为指令是可变长度的),因此显示插入断点的实际指令会产生完全的垃圾。

how one could see trap opcodes

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

然后您可以要求 LLDB 反汇编复制的区域(对于插入断点后获取的副本),您将看到您希望观察的断点(但 IP 相对偏移量将指向错误的位置)。

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

关于linux - LLDB 在内存转储中显示陷阱操作码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59258605/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com