一、直接调用、间接调用
-
面向对象的三大特性:封装、继承、多态
-
多态是最重要的,如果把虚函数掌握好了,多态就容易理解了
-
看反汇编的硬编码:
E8 ...:直接调用;FF15 ...:间接调用注入shellcode那章学过直接调用;IAT表那章学过间接调用
-
通过对象直接去调用普通成员方法或者虚函数:从反汇编层面讲,没有任何区别。即都是传入this,接着使用
E8,直接调用#include "stdafx.h" class Person{ public: void method1(){ printf("method1\n"); } virtual void method2(){ //虚函数 printf("method2\n"); } }; int main(int argc, char* argv[]){ Person person; person.method1(); person.method2(); return 0; }
-
如果用指针调用普通成员方法,和用对象调用没有区别;如果用指针调用虚函数:发现调用之前先做了一些额外的操作,而使用的是
FF12间接调用!#include "stdafx.h" class Person{ public: void method1(){ printf("method1\n"); } virtual void method2(){ printf("method2\n"); } }; int main(int argc, char* argv[]){ Person person; Person* p = &person; //用指针的方式调用 p->method1(); p->method2(); return 0; }

本文详细探讨了面向对象编程中的虚函数和多态性,通过反汇编分析了直接调用与间接调用的区别,特别是在调用虚函数时的额外操作。文章还解释了类对象中多出的4字节是虚函数表的地址,并展示了如何通过这个地址访问虚函数表。此外,提到了重载和重写的概念,并讨论了单继承时虚函数表的变化情况。
3225

被折叠的 条评论
为什么被折叠?



