4

我从互联网上获取了一些代码,这些代码应该用 SEH 处理异常,

  ASSUME FS:NOTHING
  PUSH  OFFSET Handler
  PUSH  FS:[0]
  MOV  FS:[0], ESP
  ...

但是FS:[0]应该持有处理程序的地址,对吗?

所以mov fs:[0], esp是错误的,因为esp当前指向原始fs:[0]

堆栈是这样的:

-----------
| fs:[0]  |  <-- ESP
-----------
| handler |
-----------

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

4

1 回答 1

8

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

每个元素包含两件事:

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

您提供的代码创建了另一个元素,将其链接到当前/最后一个元素,并使新元素成为当前/最后一个元素。

查看 Matt Pietrek 关于 SEH 的文章。那里更详细地描述了这些东西。

于 2013-01-15T11:36:14.270 回答