逆向反汇编--- 虚函数特征识别与虚表的建立

本文深入探讨虚函数在面向对象编程中的重要性和特性,详细阐述虚表指针的获取、初始化过程,以及虚表结构体的建立方法。通过ID...
摘要由CSDN通过智能技术生成

一、虚函数重要性

虚函数是面向对象的重要组成部分,是多态的基础,如果定义了虚函数但是没有定义构造函数,编译器必须提供默认的构造函数(因为必须要初始化虚表指针);

二、虚函数特性与识别

虚表指针一定是在对象的首地址的前4个字节(固定的,且4字节,这一点很重要),虚表指针指向的虚函数表的首地址,虚函数作为成员函数使用; 对于开发者来说,虚表和虚表指针都是隐藏的

如果类没有虚函数,构造的时候不会进行初始化虚表指针的操作;

2.1 虚表的获取: 都是先得到this 指针,然后得到虚表指针,成员函数调用需要传递this指针到ecx,最后间接调用。

具体汇编代码如下: 

mov  ecx, dword ptr[ebp - 14h]  ; ecx 得到this指针

mov  edx, dword ptr [ecx]  ; 得到虚表地址this指针指向的第一个4字节就是虚表地址; edx 就是虚表地址; 

mov esi,esp

mov ecx, dword ptr [ebp -14h]     ;成员函数调用,需要ecx保存this指针

call dword ptr [edx + 4]      ;间接调用 虚函数

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值