arm32下继承与多态的逆向分析

来源:互联网 发布:网络教育录取查询 编辑:程序博客网 时间:2024/04/30 15:37

0x0 概述

本文分析了arm32下继承与多态在内存中的表现形式,得到构造函数和析构函数的另外一个识别条件,并且获得了多态的实现原理。

0x1 c代码

#include <stdio.h>class Person{public:        Person(){                printf("Person() \r\n");        }        virtual ~Person(){                printf("~Person()\r\n");        }        virtual void showspeak(){                printf("I am Person\r\n");        }};class Chinese:public Person{public:        Chinese(){                printf("Chinese()\r\n");        }        virtual ~Chinese(){                printf("~Chinese()\r\n");        }}};int main(){        Chinese ch;        Person *p=&ch;        p->showspeak();}

0x2 构造函数


构造函数的实现是先调用基类的构造函数,然后将虚表指针写入对象开头,最后调用自己的构造函数。

0x3 析构函数


析构函数的实现是先将虚表指针写入对象开头,然后调用自己的析构函数,最后调用基类的构造函数。调用基类的构造(析构)函数的顺序可以用来区别构造函数和析构函数。

0x4 多态的实现


多态的实现通过虚表来完成,一般遇见BLX R3这类的指令,就可以怀疑其是实现多态。

0x5 总结

继承通过在继承类的构造(析构)函数中调用基类的构造(析构)函数来实现。构造函数先调用基类的构造函数,析构函数则先执行自己的析构函数,这一点可以用来区别构造函数和析构函数。最后BLX R3极有可能就是用来实现多态的。

0 0