这个asm代码如何设置SEH?

dai*_*isy 4 x86 assembly exception masm seh

从互联网上抓了一些代码,用来处理SEH异常,

  ASSUME FS:NOTHING
  PUSH  OFFSET Handler
  PUSH  FS:[0]
  MOV  FS:[0], ESP
  ...
Run Code Online (Sandbox Code Playgroud)

FS:[0]应该持有处理程序的地址而不是吗?

所以mov fs:[0], esp是错的,因为esp目前指向原文fs:[0]:

堆栈是这样的:

-----------
| fs:[0]  |  <-- ESP
-----------
| handler |
-----------
Run Code Online (Sandbox Code Playgroud)

那么,这不应该esp + 4像东西一样吗?我显然是错的,但我不明白为什么.

Ale*_*nze 8

[fs:0] 指向异常处理程序的链接列表中的最后一个元素.

每个元素包含两件事:

  1. 下一个/上一个元素的地址
  2. 处理程序/函数的地址

您呈现的代码创建另一个元素,将其链接到当前/最后一个元素,并使新元素成为当前/最后一个元素.

查看Matt Pietrek关于SEH的文章.这些内容在那里有更详细的描述.