我们知道,在给定地址(包括)之后的反汇编指令可以通过以下方式实现:
x/5i address
这将打印 5 条指令,但我如何反汇编前一条指令?
我正在调试 JIT 代码,所以像反汇编这样的事情不起作用。我可以反汇编包含地址的随机范围,例如:
disas address-10 address+10
但这很尴尬,你会看到(bad)
(希望不是在中间!)并开始担心你没有做对。我正在寻找的是这样的:
x/-5i address
,但上述方法不起作用。
我们知道,在给定地址(包括)之后的反汇编指令可以通过以下方式实现:
x/5i address
这将打印 5 条指令,但我如何反汇编前一条指令?
我正在调试 JIT 代码,所以像反汇编这样的事情不起作用。我可以反汇编包含地址的随机范围,例如:
disas address-10 address+10
但这很尴尬,你会看到(bad)
(希望不是在中间!)并开始担心你没有做对。我正在寻找的是这样的:
x/-5i address
,但上述方法不起作用。
x/-5i 地址不起作用
在 x86 或任何指令大小可变的体系结构上,您通常无法知道前一条指令的起始地址,因此您无法可靠地反汇编前一条指令。
我所做的(与您所做的非常相似)x/15i $pc-35
:。当您退后足够数量的字节(此处为 35)时,指令流反汇编通常会重新同步,您(bad)
在开始时只会看到一两条指令,但周围的指令$pc
看起来是正确的。
您可以从当前指令 ( $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