假设标准的 VC++ vTable 布局:
Heap-Addr TableAddr
+-----------+ +-----------+
| TableAddr | ----> | Funcion-1 | ----> Exec region of module
+-----------+ +-----------+
| a | | Funcion-2 | ----> Exec region of module
+-----------+ +-----------+
| b | | Funcion-3 | ----> Exec region of module
+-----------+ +-----------+
| c | | ... |
+-----------+ +-----------+
TableAddr 是否保证始终位于模块内部,或者它可以位于地址空间中的任何位置,如果是这样,什么条件会使 TableAddr 位于模块外部。
为清楚起见:模块是任何具有只读或可执行内存区域的 .exe 或 .dll,允许调用函数。根据我的经验,我只看到 TableAddr 驻留在模块的只读部分中。