8

我们知道,在给定地址(包括)之后的反汇编指令可以通过以下方式实现:

x/5i address

这将打印 5 条指令,但我如何反汇编前一条指令?

我正在调试 JIT 代码,所以像反汇编这样的事情不起作用。我可以反汇编包含地址的随机范围,例如:

disas address-10 address+10

但这很尴尬,你会看到(bad)(希望不是在中间!)并开始担心你没有做对。我正在寻找的是这样的:

x/-5i address

,但上述方法不起作用。

4

2 回答 2

9

x/-5i 地址不起作用

在 x86 或任何指令大小可变的体系结构上,您通常无法知道前一条指令的起始地址,因此您无法可靠地反汇编前一条指令。

我所做的(与您所做的非常相似)x/15i $pc-35:。当您退后足够数量的字节(此处为 35)时,指令流反汇编通常会重新同步,您(bad)在开始时只会看到一两条指令,但周围的指令$pc看起来是正确的。

于 2013-05-05T15:05:13.273 回答
0

您可以从当前指令 ( $pc) 进行反汇编,然后尝试从几个字节向后反汇编,直到您看到的第二条指令正确为止。

(lldb) x/3i $pc
->  0xeccac5d4: 0x6913 ldr    r3, [r2, #0x10]
    0xeccac5d6: 0xaa02 add    r2, sp, #0x8
    0xeccac5d8: 0x4798 blx    r3
(lldb) x/3i $pc-1
    0xeccac5d3: 0x1368 asrs   r0, r5, #0xd
    0xeccac5d5: 0x0269 lsls   r1, r5, #0x9
    0xeccac5d7: 0x98aa ldr    r0, [sp, #0x2a8]
(lldb) x/3i $pc-2
    0xeccac5d2: 0x6802 ldr    r2, [r0]
->  0xeccac5d4: 0x6913 ldr    r3, [r2, #0x10]   <------ Correct!
    0xeccac5d6: 0xaa02 add    r2, sp, #0x8
于 2017-08-05T18:42:31.760 回答