x86 Intel 汇编中的尖括号

Angle brackets in x86 Intel assembly

我是汇编的新手,正在阅读一本指南,其中介绍了取自 Ollydbg 的 pinball 函数示例。我试图理解大部分说明的作用,但下面一行让我完全困惑:

01017455  |. E8 249D0000    CALL <JMP.&msvcrt.??3@YAXPAX@Z>

尖括号在这方面是什么意思?该函数的名称有什么意义吗?名称中的 "JMP." 也令人困惑 - 它只是函数名称的一部分并且应该被忽略吗?

这似乎是对文件中静态链接 .LIB 的调用。在 Windows 上,API/library 调用是通过调用 executable 的特殊部分中的 JMP 指令实现的。

例如

CALL <JMP.&msvcrt.??3@YAXPAX@Z>

会对下面的指令

执行CALL
JMP.&msvcrt.??3@YAXPAX@Z

CALL将return地址压栈,然后跳转到本段后面的JMP指令。这个 JMP 不会修改 return 地址 - 所以它实际上就像一个直接的 CALL.

简化版:

curEIP:
  CALL <JMP.&msvcrt.??3@YAXPAX@Z>     ; pushes (curEIP+insLen) to the stack and JMPs to (some virtual label named) `msvcrt.??3` in this section named above
  ...
msvcrt.??3:
  JMP YAXPAX@Z                        ; JMPs to `YAXPAX@Z` - address of the real function in the statically linked LIB in memory
  ...
; after the CALL completes...

...它returns到之前压入堆栈的return值地址(初始EIP+instructionLengthInBytes)继续执行。

What do angle brackets mean in this respect?

只是约定俗成,将上述方案的相关数据展示给大家

and is there anything meaningful in the name of that function?

是的。看上面。括号中的名称因调试器而异。

The "JMP." in the name has confused as well - is it just part of the function name and should be ignored?

<JMP... 简单地指出,以下 chars/address 将被解释为对 executable 中静态链接库的跳转 table 的引用(在(上面提到的)特殊包含部分)。看看 PE-Explorer/Debugger 重演那个。

尖括号用于 Windows API 调用。

例如,如果我使用 Kernel32 库中的函数,它会调用带有天使括号的 Kernel32。