编写 VF 表钩子¶
在深入讨论如何放置 VF 表钩子之前,我们需要再谈谈那些烦人的调用约定。VF 表被类实例用来调用虚成员函数,所有成员函数都有 __thiscall 约定。__thiscall 这个名称来源于成员函数用来引用活动类实例的 this 指针。因此,成员函数把 this 作为 ECX 上的伪参数。
通过声明一个充当所有 __thiscall 钩子回调容器的类,可以匹配 __thiscall 的原型,但我不喜欢这个方法。相反,我发现用内联汇编控制数据更容易。让我们探讨在钩住一个看起来像这样的类时如何控制数据:
class someBaseClass {
public:
virtual DWORD someFunction(DWORD arg1) {}
};
class someClass : public someBaseClass {
public:
virtual DWORD someFunction(DWORD arg1) {}
};
someBaseClass 类只有一个成员(一个公共虚函数),someClass 类继承自 someBaseClass 并重载了 someBaseClass::someFunction 成员。要钩住 someClass::someFunction,你在 VF 表钩子中复制原型,如清单 8-3 所示(跟着项目中的 VFHookExample.cpp 文件做)。