前言
虚函数表(VMT)Hook,又叫指针重定向,是一种常见的Hook技术,在游戏外挂程序中最常见。例如,使用VMTHook在Direct3D / OpenGL引擎游戏里实现内置叠加层。
虚函数表(VMT)
本文中VMT就代指虚函数表。
虚函数表是C++实现多态的一种方式。
每一个有虚函数的类(或有虚函数类的派生类)都有一个VMT,VMT本质上就是一个函数指针数组,通常位于对象内存布局的开头或结尾。每当C++类声明虚(virtual
)函数时,编译器都会增加一个条目到VMT中。
例如,在x86系统上使用VS2019编译以下代码:
class Base
{
public:
Base() {
std::cout << "- Base::Base\n"; }
virtual ~Base() {
std::cout << "- Base::~Base\n"; }
void A() {
std::cout << "- Base::A\n"; }
virtual void B() {
std::cout << "- Base::B\n"; }
virtual void C() {
std::cout << "- Base::C\n"; }
};
class Derived final : public Base
{
public:
Derived() {
std::cout << "- Derived::Derived\n"; }
~Derived() {
std::cout << "- Derived::~Derived\n"; }
void B() override {
std::cout << "- Derived::B\n"; }
void C() override