如何用汇编语言检查EIP值?

smw*_*dia 34 x86 assembly

我想用汇编语言获取EIP寄存器的当前值.那可能吗?

use*_*783 56

假设32位x86,请使用以下函数:

get_eip: mov eax, [esp]
         ret
Run Code Online (Sandbox Code Playgroud)

然后,要在EAX中获取EIP的值,只需:

call get_eip
Run Code Online (Sandbox Code Playgroud)

  • 这太棒了:D (2认同)

Fab*_*sen 26

在x86-64(而不是32位x86)上,有RIP相对寻址(RIP是64位模拟EIP).所以在64位代码中,你可以做到

lea rax, [rip]
Run Code Online (Sandbox Code Playgroud)

将当前内容移动RIPRAX(您可以使用lea但不能mov用于此).


Aby*_*byx 10

    call foo
foo:
    pop eax ; address of foo
Run Code Online (Sandbox Code Playgroud)

  • 这种方法有一个微妙的问题.现代处理器试图预测返回地址 - 一个不与回报配对的调用会扰乱预测.见http://blogs.msdn.com/b/oldnewthing/archive/2004/12/16/317157.aspx (8认同)
  • @Abyx然后至少你知道你的程序卡在哪个EIP!:) (3认同)
  • @user200783:令人惊讶的是,`call next_insn` 是特殊情况,不会破坏大多数 CPU 上的返回地址预测器堆栈:http://blog.stuffedcow.net/2018/04/ras-microbenchmarks/#call0 - 它只是硬皮老PPro(大概到PIII)上的一个问题。所以这个答案很好。[直接读取程序计数器](/sf/ask/41997791/) (2认同)