如何确定虚函数在虚函数表中的位置2 (Windows x64版本)

之前写了一篇blog,描述 Windows 在x86 下,如何确定Virtual Function在Table中的位置。
没有写x64的情况,主要原因是x64不支持内联汇编。
我们知道MSVC编译器不会直接访问Table,而是会写一个thunk间接访问。
我们第一步要获得这个thunk的地址,用伪代码就是: &Class::vfn_name
c++认为这是一个成员函数指针,他是无法转化为void*的。(还是有办法的)
所以在上一篇blog中,我们用如下的泛型函数和内联汇编实现

template<typename src_type>
void* pointer_cast(src_type src)
{
   
    void* ret = NULL;
    __asm
    {
   
        mov eax, src
        mov ret, eax
    }
    return ret;
}

调用如下:

 void* p_thunk_fn = pointer_cast(&Class::vfn_name);

这样就通过”黑魔法“获得了这个thunk的地址。
当然,到了x64这个方法就行不通了。
后来我在咨询deepseek的时候,他偶尔提了一嘴,说可以用Union的方法
在这里插入图片描述
然后我想起来还有这个玩法,以前看到过。
这样直接通过Union就可以骗过编译器,获得thunk的地址
实现如下:

union FunctionPointer {
   
    void (Class::*vfn_name)(int arg);
    void* ptr;
};

FunctionPointer fp;
fp.vfn_name = &Class::vfn_name;
void* thunk = fn.ptr; //getchu~

当然,我们为了获取所有地址,需要每一个函数都写一个这样的FunctionPointer
这样要疯掉。
让deepseek给我写了一个泛型,这时候体现出ai作为工具能极大提高工作效率!

template <typename T>
union TFP;

// 特化模板,支持成员函数指针
template <typename ClassType, typename ReturnType, typename.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值