Ell*_*ink 0 c++ gcc detours virtual-functions
我最近一直在绕道而行,并且随之而来.我绕道了很多不同的功能; thiscall,stdcall,cdecl,虚函数等.但有一件事我没有管理(甚至可能不可能),那就是挂钩基类虚函数.例如; 有一个Car类声明了一个虚函数(空)Drive.然后还有3个继承汽车和工具的汽车类Drive.
如果我挂钩Car(基类)Drive函数(使用一个简单的'jmp'钩子)它会被触发时的后代Car触发Drive,如果它们不调用基函数?
更彻底地解释一下:
class Car
{
virtual void Drive(void) { } // Empty virtual function
}
class Lamborghini : public Car
{
void Drive(void) { // does lots of stuff, but does NOT call base function }
}
Run Code Online (Sandbox Code Playgroud)
所以我想知道基本方法是否被调用或者是否可以以某种方式挂钩?函数exectution 直接跳转到Lamborghini::Drive或以某种方式通过Car类,所以只要后代调用它就可以检测到Drive吗?
编辑:如果基类函数为空,是否可以挂钩它,因为它需要5个字节的空间?
不,基本方法不会自动调用.动态调度机制将检测它需要调用哪个覆盖,这将是被调用的函数.这通常通过虚拟表(vtable)实现,该表存储指向类中每个虚函数的最终重写器的指针.当使用动态分派时,编译器通过该表注入间接调用并跳转到正确的函数.
请注意,vtable实际上保存了指向thunks或trampolines的指针,这些指针可能会this在转发调用之前修改(隐式的第一个参数).使用这种方法的优点是,如果this不需要更新,编译器可以直接跳转到最终的覆盖.无论如何,您可以利用此功能并修改vtable以指向您自己的代码(即您可以更新每个vtable中的指针 - 每种类型 - 指向您自己的thunk或函数)
| 归档时间: |
|
| 查看次数: |
1317 次 |
| 最近记录: |