Android SO逆向-C++虚函数表解析
来源:互联网 发布:英语不好学java 编辑:程序博客网 时间:2024/05/01 22:04
0x00 一般继承(无虚函数覆盖)
class Base {public:Base() { ALOGD("Base ..."); }virtual void f() { ALOGD("Base::f"); } void g() { ALOGD("Base::g"); }virtual void h() { ALOGD("Base::h"); }virtual ~Base() { ALOGD("~Base ..."); }};
class Derived : public Base {public:Derived() : Base(){ ALOGD("Derived ...");}virtual void f1() { ALOGD("Derived::f"); }virtual void g1() { ALOGD("Derived::g"); }virtual void h1() { ALOGD("Derived::h"); }virtual ~Derived(){ ALOGD("~Derived ..."); }};
Base* base;base = new Derived();delete base;虚函数表如下图:
0x01 一般继承(有虚函数覆盖)
class Base {public:Base() { ALOGD("Base ..."); }virtual void f() { ALOGD("Base::f"); }virtual void g() { ALOGD("Base::g"); }virtual void h() { ALOGD("Base::h"); }virtual ~Base() { ALOGD("~Base ..."); }};
class Derived : public Base {public:Derived() : Base(){ ALOGD("Derived ...");}virtual void f() { ALOGD("Derived::f"); }virtual void g1() { ALOGD("Derived::g"); }virtual void h1() { ALOGD("Derived::h"); }virtual ~Derived(){ ALOGD("~Derived ..."); }};
Base* base;base = new Derived();delete base;虚函数表如下图:
0x02 多重继承(无虚函数覆盖)
class Base {public:Base() { ALOGD("Base ..."); }virtual void f() { ALOGD("Base::f"); }virtual void g() { ALOGD("Base::g"); }virtual void h() { ALOGD("Base::h"); }virtual ~Base() { ALOGD("~Base ..."); }};class Base1 {public:Base1() { ALOGD("Base1 ..."); }virtual void f() { ALOGD("Base1::f"); }virtual void g() { ALOGD("Base1::g"); }virtual void h() { ALOGD("Base1::h"); }virtual ~Base1() {ALOGD("~Base1 ...");}};class Base2 {public:Base2() { ALOGD("Base2 ..."); }virtual void f() { ALOGD("Base2::f"); }virtual void g() { ALOGD("Base2::g"); }virtual void h() { ALOGD("Base2::h"); }virtual ~Base2() { ALOGD("~Base2 ..."); }};class Derived : public Base , public Base1 ,public Base2{public:Derived() : Base(){ ALOGD("Derived ...");}virtual void f1() { ALOGD("Derived::f"); }virtual void g1() { ALOGD("Derived::g"); }virtual void h1() { ALOGD("Derived::h"); }virtual ~Derived(){ ALOGD("~Derived ..."); }};
Base* base;base = new Derived();delete base;
虚函数表如下:
.data.rel.ro:00003DD8.data.rel.ro:00003DD8 ; Segment type: Pure data.data.rel.ro:00003DD8 AREA .data.rel.ro, DATA, ALIGN=3.data.rel.ro:00003DD8 ; ORG 0x3DD8.data.rel.ro:00003DD8 WEAK _ZTV4Base.data.rel.ro:00003DD8 ; `vtable for'Base.data.rel.ro:00003DD8 _ZTV4Base DCB 0 ; DATA XREF: Base::~Base()+8o.data.rel.ro:00003DD8 ; Derived::Derived(void)+Eo ....data.rel.ro:00003DD9 DCB 0.data.rel.ro:00003DDA DCB 0.data.rel.ro:00003DDB DCB 0.data.rel.ro:00003DDC DCB 0.data.rel.ro:00003DDD DCB 0.data.rel.ro:00003DDE DCB 0.data.rel.ro:00003DDF DCB 0.data.rel.ro:00003DE0 DCD _ZN4Base1fEv+1.data.rel.ro:00003DE4 DCD _ZN4Base1gEv+1.data.rel.ro:00003DE8 DCD _ZN4Base1hEv+1.data.rel.ro:00003DEC DCD _ZN4BaseD2Ev+1.data.rel.ro:00003DF0 DCD _ZN4BaseD0Ev+1.data.rel.ro:00003DF4 ALIGN 8.data.rel.ro:00003DF8 WEAK _ZTV5Base1.data.rel.ro:00003DF8 ; `vtable for'Base1.data.rel.ro:00003DF8 _ZTV5Base1 DCB 0 ; DATA XREF: Base1::~Base1()+8o.data.rel.ro:00003DF8 ; Derived::Derived(void)+26o ....data.rel.ro:00003DF9 DCB 0.data.rel.ro:00003DFA DCB 0.data.rel.ro:00003DFB DCB 0.data.rel.ro:00003DFC DCB 0.data.rel.ro:00003DFD DCB 0.data.rel.ro:00003DFE DCB 0.data.rel.ro:00003DFF DCB 0.data.rel.ro:00003E00 DCD _ZN5Base11fEv+1.data.rel.ro:00003E04 DCD _ZN5Base11gEv+1.data.rel.ro:00003E08 DCD _ZN5Base11hEv+1.data.rel.ro:00003E0C DCD _ZN5Base1D2Ev+1.data.rel.ro:00003E10 DCD _ZN5Base1D0Ev+1.data.rel.ro:00003E14 ALIGN 8.data.rel.ro:00003E18 WEAK _ZTV5Base2.data.rel.ro:00003E18 ; `vtable for'Base2.data.rel.ro:00003E18 _ZTV5Base2 DCB 0 ; DATA XREF: Base2::~Base2()+8o.data.rel.ro:00003E18 ; Derived::Derived(void)+3Co ....data.rel.ro:00003E19 DCB 0.data.rel.ro:00003E1A DCB 0.data.rel.ro:00003E1B DCB 0.data.rel.ro:00003E1C DCB 0.data.rel.ro:00003E1D DCB 0.data.rel.ro:00003E1E DCB 0.data.rel.ro:00003E1F DCB 0.data.rel.ro:00003E20 DCD _ZN5Base21fEv+1.data.rel.ro:00003E24 DCD _ZN5Base21gEv+1.data.rel.ro:00003E28 DCD _ZN5Base21hEv+1.data.rel.ro:00003E2C DCD _ZN5Base2D2Ev+1.data.rel.ro:00003E30 DCD _ZN5Base2D0Ev+1.data.rel.ro:00003E34 ALIGN 8.data.rel.ro:00003E38 WEAK _ZTV7Derived.data.rel.ro:00003E38 ; `vtable for'Derived.data.rel.ro:00003E38 _ZTV7Derived DCB 0 ; DATA XREF: Derived::~Derived()+Co.data.rel.ro:00003E38 ; Derived::Derived(void)+52o ....data.rel.ro:00003E39 DCB 0.data.rel.ro:00003E3A DCB 0.data.rel.ro:00003E3B DCB 0.data.rel.ro:00003E3C DCB 0.data.rel.ro:00003E3D DCB 0.data.rel.ro:00003E3E DCB 0.data.rel.ro:00003E3F DCB 0.data.rel.ro:00003E40 DCD _ZN4Base1fEv+1.data.rel.ro:00003E44 DCD _ZN4Base1gEv+1.data.rel.ro:00003E48 DCD _ZN4Base1hEv+1.data.rel.ro:00003E4C DCD _ZN7DerivedD2Ev+1.data.rel.ro:00003E50 DCD _ZN7DerivedD0Ev+1.data.rel.ro:00003E54 DCD _ZN7Derived2f1Ev+1.data.rel.ro:00003E58 DCD _ZN7Derived2g1Ev+1.data.rel.ro:00003E5C DCD _ZN7Derived2h1Ev+1.data.rel.ro:00003E60 DCB 0xFC ; .data.rel.ro:00003E61 DCB 0xFF.data.rel.ro:00003E62 DCB 0xFF.data.rel.ro:00003E63 DCB 0xFF.data.rel.ro:00003E64 DCB 0.data.rel.ro:00003E65 DCB 0.data.rel.ro:00003E66 DCB 0.data.rel.ro:00003E67 DCB 0.data.rel.ro:00003E68 DCD _ZN5Base11fEv+1.data.rel.ro:00003E6C DCD _ZN5Base11gEv+1.data.rel.ro:00003E70 DCD _ZN5Base11hEv+1.data.rel.ro:00003E74 DCD _ZThn4_N7DerivedD1Ev+1.data.rel.ro:00003E78 DCD _ZThn4_N7DerivedD0Ev+1.data.rel.ro:00003E7C DCB 0xF8 ; .data.rel.ro:00003E7D DCB 0xFF.data.rel.ro:00003E7E DCB 0xFF.data.rel.ro:00003E7F DCB 0xFF.data.rel.ro:00003E80 DCB 0.data.rel.ro:00003E81 DCB 0.data.rel.ro:00003E82 DCB 0.data.rel.ro:00003E83 DCB 0.data.rel.ro:00003E84 DCD _ZN5Base21fEv+1.data.rel.ro:00003E88 DCD _ZN5Base21gEv+1.data.rel.ro:00003E8C DCD _ZN5Base21hEv+1.data.rel.ro:00003E90 DCD _ZThn8_N7DerivedD1Ev+1.data.rel.ro:00003E94 DCD _ZThn8_N7DerivedD0Ev+1.data.rel.ro:00003E94 ; .data.rel.ro ends
0x03 多重继承(有虚函数覆盖)
class Base {public:Base() { ALOGD("Base ..."); }virtual void f() { ALOGD("Base::f"); }virtual void g() { ALOGD("Base::g"); }virtual void h() { ALOGD("Base::h"); }virtual ~Base() { ALOGD("~Base ..."); }};class Base1 {public:Base1() { ALOGD("Base1 ..."); }virtual void f() { ALOGD("Base1::f"); }virtual void g() { ALOGD("Base1::g"); }virtual void h() { ALOGD("Base1::h"); }virtual ~Base1() {ALOGD("~Base1 ...");}};class Base2 {public:Base2() { ALOGD("Base2 ..."); }virtual void f() { ALOGD("Base2::f"); }virtual void g() { ALOGD("Base2::g"); }virtual void h() { ALOGD("Base2::h"); }virtual ~Base2() { ALOGD("~Base2 ..."); }};class Derived : public Base , public Base1 ,public Base2{public:Derived() : Base(){ ALOGD("Derived ...");}virtual void f() { ALOGD("Derived::f"); }virtual void g1() { ALOGD("Derived::g"); }virtual void h1() { ALOGD("Derived::h"); }virtual ~Derived(){ ALOGD("~Derived ..."); }};
Base* base;base = new Derived();delete base;
.data.rel.ro:00003DD8 ; Segment type: Pure data.data.rel.ro:00003DD8 AREA .data.rel.ro, DATA, ALIGN=3.data.rel.ro:00003DD8 ; ORG 0x3DD8.data.rel.ro:00003DD8 WEAK _ZTV4Base.data.rel.ro:00003DD8 ; `vtable for'Base.data.rel.ro:00003DD8 _ZTV4Base DCB 0 ; DATA XREF: Base::~Base()+8o.data.rel.ro:00003DD8 ; Derived::Derived(void)+Eo ....data.rel.ro:00003DD9 DCB 0.data.rel.ro:00003DDA DCB 0.data.rel.ro:00003DDB DCB 0.data.rel.ro:00003DDC DCB 0.data.rel.ro:00003DDD DCB 0.data.rel.ro:00003DDE DCB 0.data.rel.ro:00003DDF DCB 0.data.rel.ro:00003DE0 DCD _ZN4Base1fEv+1.data.rel.ro:00003DE4 DCD _ZN4Base1gEv+1.data.rel.ro:00003DE8 DCD _ZN4Base1hEv+1.data.rel.ro:00003DEC DCD _ZN4BaseD2Ev+1.data.rel.ro:00003DF0 DCD _ZN4BaseD0Ev+1.data.rel.ro:00003DF4 ALIGN 8.data.rel.ro:00003DF8 WEAK _ZTV5Base1.data.rel.ro:00003DF8 ; `vtable for'Base1.data.rel.ro:00003DF8 _ZTV5Base1 DCB 0 ; DATA XREF: Base1::~Base1()+8o.data.rel.ro:00003DF8 ; Derived::Derived(void)+26o ....data.rel.ro:00003DF9 DCB 0.data.rel.ro:00003DFA DCB 0.data.rel.ro:00003DFB DCB 0.data.rel.ro:00003DFC DCB 0.data.rel.ro:00003DFD DCB 0.data.rel.ro:00003DFE DCB 0.data.rel.ro:00003DFF DCB 0.data.rel.ro:00003E00 DCD _ZN5Base11fEv+1.data.rel.ro:00003E04 DCD _ZN5Base11gEv+1.data.rel.ro:00003E08 DCD _ZN5Base11hEv+1.data.rel.ro:00003E0C DCD _ZN5Base1D2Ev+1.data.rel.ro:00003E10 DCD _ZN5Base1D0Ev+1.data.rel.ro:00003E14 ALIGN 8.data.rel.ro:00003E18 WEAK _ZTV5Base2.data.rel.ro:00003E18 ; `vtable for'Base2.data.rel.ro:00003E18 _ZTV5Base2 DCB 0 ; DATA XREF: Base2::~Base2()+8o.data.rel.ro:00003E18 ; Derived::Derived(void)+3Co ....data.rel.ro:00003E19 DCB 0.data.rel.ro:00003E1A DCB 0.data.rel.ro:00003E1B DCB 0.data.rel.ro:00003E1C DCB 0.data.rel.ro:00003E1D DCB 0.data.rel.ro:00003E1E DCB 0.data.rel.ro:00003E1F DCB 0.data.rel.ro:00003E20 DCD _ZN5Base21fEv+1.data.rel.ro:00003E24 DCD _ZN5Base21gEv+1.data.rel.ro:00003E28 DCD _ZN5Base21hEv+1.data.rel.ro:00003E2C DCD _ZN5Base2D2Ev+1.data.rel.ro:00003E30 DCD _ZN5Base2D0Ev+1.data.rel.ro:00003E34 ALIGN 8.data.rel.ro:00003E38 WEAK _ZTV7Derived.data.rel.ro:00003E38 ; `vtable for'Derived.data.rel.ro:00003E38 _ZTV7Derived DCB 0 ; DATA XREF: Derived::~Derived()+Co.data.rel.ro:00003E38 ; Derived::Derived(void)+52o ....data.rel.ro:00003E39 DCB 0.data.rel.ro:00003E3A DCB 0.data.rel.ro:00003E3B DCB 0.data.rel.ro:00003E3C DCB 0.data.rel.ro:00003E3D DCB 0.data.rel.ro:00003E3E DCB 0.data.rel.ro:00003E3F DCB 0.data.rel.ro:00003E40 DCD _ZN7Derived1fEv+1.data.rel.ro:00003E44 DCD _ZN4Base1gEv+1.data.rel.ro:00003E48 DCD _ZN4Base1hEv+1.data.rel.ro:00003E4C DCD _ZN7DerivedD2Ev+1.data.rel.ro:00003E50 DCD _ZN7DerivedD0Ev+1.data.rel.ro:00003E54 DCD _ZN7Derived2g1Ev+1.data.rel.ro:00003E58 DCD _ZN7Derived2h1Ev+1.data.rel.ro:00003E5C DCB 0xFC ; .data.rel.ro:00003E5D DCB 0xFF.data.rel.ro:00003E5E DCB 0xFF.data.rel.ro:00003E5F DCB 0xFF.data.rel.ro:00003E60 DCB 0.data.rel.ro:00003E61 DCB 0.data.rel.ro:00003E62 DCB 0.data.rel.ro:00003E63 DCB 0.data.rel.ro:00003E64 DCD _ZThn4_N7Derived1fEv+1.data.rel.ro:00003E68 DCD _ZN5Base11gEv+1.data.rel.ro:00003E6C DCD _ZN5Base11hEv+1.data.rel.ro:00003E70 DCD _ZThn4_N7DerivedD1Ev+1.data.rel.ro:00003E74 DCD _ZThn4_N7DerivedD0Ev+1.data.rel.ro:00003E78 DCB 0xF8 ; .data.rel.ro:00003E79 DCB 0xFF.data.rel.ro:00003E7A DCB 0xFF.data.rel.ro:00003E7B DCB 0xFF.data.rel.ro:00003E7C DCB 0.data.rel.ro:00003E7D DCB 0.data.rel.ro:00003E7E DCB 0.data.rel.ro:00003E7F DCB 0.data.rel.ro:00003E80 DCD _ZThn8_N7Derived1fEv+1.data.rel.ro:00003E84 DCD _ZN5Base21gEv+1.data.rel.ro:00003E88 DCD _ZN5Base21hEv+1.data.rel.ro:00003E8C DCD _ZThn8_N7DerivedD1Ev+1.data.rel.ro:00003E90 DCD _ZThn8_N7DerivedD0Ev+1.data.rel.ro:00003E94 ALIGN 8.data.rel.ro:00003E94 ; .data.rel.ro ends
class Base {public:Base() { ALOGD("Base ..."); }virtual void f() { ALOGD("Base::f"); }virtual void g() { ALOGD("Base::g"); }virtual void h() { ALOGD("Base::h"); }virtual ~Base() { ALOGD("~Base ..."); }};
class Derived : public Base {public:Derived() : Base(){ ALOGD("Derived ...");}virtual void f() { ALOGD("Derived::f"); }virtual void g1() { ALOGD("Derived::g"); }virtual void h1() { ALOGD("Derived::h"); }virtual ~Derived(){ ALOGD("~Derived ..."); }};class Derived1 : public Base {public:Derived1() : Base(){ ALOGD("Derived1 ...");}virtual void f() { ALOGD("Derived1::f"); }virtual void g2() { ALOGD("Derived1::g"); }virtual void h2() { ALOGD("Derived1::h"); }virtual ~Derived1(){ ALOGD("~Derived1 ..."); }};
Base* base;if (i == 0) {base = new Derived();} else {base = new Derived1();}fun(base);delete base;虚函数表如下:
.data.rel.ro:00003E30 ; Segment type: Pure data.data.rel.ro:00003E30 AREA .data.rel.ro, DATA, ALIGN=3.data.rel.ro:00003E30 ; ORG 0x3E30.data.rel.ro:00003E30 WEAK _ZTV4Base.data.rel.ro:00003E30 ; `vtable for'Base.data.rel.ro:00003E30 _ZTV4Base DCB 0 ; DATA XREF: Base::~Base()+8o.data.rel.ro:00003E30 ; Java_com_example_ndkreverse8_Lesson8_main+8o ....data.rel.ro:00003E31 DCB 0.data.rel.ro:00003E32 DCB 0.data.rel.ro:00003E33 DCB 0.data.rel.ro:00003E34 DCB 0.data.rel.ro:00003E35 DCB 0.data.rel.ro:00003E36 DCB 0.data.rel.ro:00003E37 DCB 0.data.rel.ro:00003E38 DCD _ZN4Base1fEv+1.data.rel.ro:00003E3C DCD _ZN4Base1gEv+1.data.rel.ro:00003E40 DCD _ZN4Base1hEv+1.data.rel.ro:00003E44 DCD _ZN4BaseD2Ev+1.data.rel.ro:00003E48 DCD _ZN4BaseD0Ev+1.data.rel.ro:00003E4C ALIGN 0x10.data.rel.ro:00003E50 WEAK _ZTV7Derived.data.rel.ro:00003E50 ; `vtable for'Derived.data.rel.ro:00003E50 _ZTV7Derived DCB 0 ; DATA XREF: Derived::~Derived()+8o.data.rel.ro:00003E50 ; Java_com_example_ndkreverse8_Lesson8_main+2Co ....data.rel.ro:00003E51 DCB 0.data.rel.ro:00003E52 DCB 0.data.rel.ro:00003E53 DCB 0.data.rel.ro:00003E54 DCB 0.data.rel.ro:00003E55 DCB 0.data.rel.ro:00003E56 DCB 0.data.rel.ro:00003E57 DCB 0.data.rel.ro:00003E58 DCD _ZN7Derived1fEv+1.data.rel.ro:00003E5C DCD _ZN4Base1gEv+1.data.rel.ro:00003E60 DCD _ZN4Base1hEv+1.data.rel.ro:00003E64 DCD _ZN7DerivedD2Ev+1.data.rel.ro:00003E68 DCD _ZN7DerivedD0Ev+1.data.rel.ro:00003E6C DCD _ZN7Derived2g1Ev+1.data.rel.ro:00003E70 DCD _ZN7Derived2h1Ev+1.data.rel.ro:00003E74 ALIGN 8.data.rel.ro:00003E78 WEAK _ZTV8Derived1.data.rel.ro:00003E78 ; `vtable for'Derived1.data.rel.ro:00003E78 _ZTV8Derived1 DCB 0 ; DATA XREF: Derived1::~Derived1()+8o.data.rel.ro:00003E78 ; Java_com_example_ndkreverse8_Lesson8_main+58o ....data.rel.ro:00003E79 DCB 0.data.rel.ro:00003E7A DCB 0.data.rel.ro:00003E7B DCB 0.data.rel.ro:00003E7C DCB 0.data.rel.ro:00003E7D DCB 0.data.rel.ro:00003E7E DCB 0.data.rel.ro:00003E7F DCB 0.data.rel.ro:00003E80 DCD _ZN8Derived11fEv+1.data.rel.ro:00003E84 DCD _ZN4Base1gEv+1.data.rel.ro:00003E88 DCD _ZN4Base1hEv+1.data.rel.ro:00003E8C DCD _ZN8Derived1D2Ev+1.data.rel.ro:00003E90 DCD _ZN8Derived1D0Ev+1.data.rel.ro:00003E94 DCD _ZN8Derived12g2Ev+1.data.rel.ro:00003E98 DCD _ZN8Derived12h2Ev+1.data.rel.ro:00003E9C ALIGN 0x10.data.rel.ro:00003E9C ; .data.rel.ro ends如何使用不同的方法呢?
.text:00001234 EXPORT Java_com_example_ndkreverse8_Lesson8_main.text:00001234 Java_com_example_ndkreverse8_Lesson8_main.text:00001234 PUSH {R3-R5,LR}.text:00001236 MOVS R0, #4 ; unsigned int ;只存放一个虚表指针,只申请了4个字节3.text:00001238 LDR R5, =(_ZTV4Base_ptr - 0x123E).text:0000123A ADD R5, PC ; _ZTV4Base_ptr.text:0000123C LDR R5, [R5] ; `vtable for'Base.text:0000123E CBNZ R2, loc_126A ;判断R2是否为0.text:00001240 BLX _Znwj ; operator new(uint).text:00001244 ADDS R5, #8.text:00001246 LDR R2, =(aBase____0 - 0x124C).text:00001248 ADD R2, PC ; "Base ...".text:0000124A STR R5, [R0].text:0000124C MOV R4, R0.text:0000124E LDR R5, =(aLesson8 - 0x1256).text:00001250 MOVS R0, #3.text:00001252 ADD R5, PC ; "lesson8".text:00001254 MOV R1, R5.text:00001256 BLX __android_log_print.text:0000125A LDR R3, =(_ZTV7Derived_ptr - 0x1262).text:0000125C LDR R2, =(aDerived____0 - 0x1268).text:0000125E ADD R3, PC ; _ZTV7Derived_ptr.text:00001260 LDR R3, [R3] ; `vtable for'Derived.text:00001262 ADDS R3, #8.text:00001264 ADD R2, PC ; "Derived ...".text:00001266 STR R3, [R4].text:00001268 B loc_1292.text:0000126A ; ---------------------------------------------------------------------------.text:0000126A.text:0000126A loc_126A ; CODE XREF: Java_com_example_ndkreverse8_Lesson8_main+Aj.text:0000126A BLX _Znwj ; operator new(uint).text:0000126E ADDS R5, #8.text:00001270 LDR R2, =(aBase____0 - 0x1276).text:00001272 ADD R2, PC ; "Base ...".text:00001274 STR R5, [R0].text:00001276 MOV R4, R0.text:00001278 LDR R5, =(aLesson8 - 0x1280).text:0000127A MOVS R0, #3.text:0000127C ADD R5, PC ; "lesson8".text:0000127E MOV R1, R5.text:00001280 BLX __android_log_print.text:00001284 LDR R2, =(aDerived1____0 - 0x128C).text:00001286 LDR R3, =(_ZTV8Derived1_ptr - 0x128E).text:00001288 ADD R2, PC ; "Derived1 ...".text:0000128A ADD R3, PC ; _ZTV8Derived1_ptr.text:0000128C LDR R3, [R3] ; `vtable for'Derived1.text:0000128E ADDS R3, #8.text:00001290 STR R3, [R4].text:00001292.text:00001292 loc_1292 ; CODE XREF: Java_com_example_ndkreverse8_Lesson8_main+34j.text:00001292 MOV R1, R5.text:00001294 MOVS R0, #3.text:00001296 BLX __android_log_print.text:0000129A MOV R0, R4 ; Base *.text:0000129C BL _Z3funP4Base ; fun(Base *);R0为对象首地址,为虚表指针,指向00003E58 DCD _ZN7Derived1fEv+1或者00003E80 DCD _ZN8Derived11fEv+1.text:000012A0 LDR R3, [R4].text:000012A2 MOV R0, R4.text:000012A4 LDR R3, [R3,#0x10].text:000012A6 BLX R3.text:000012A8 POP {R3-R5,PC}.text:000012A8 ; End of function Java_com_example_ndkreverse8_Lesson8_main
.text:0000122A EXPORT _Z3funP4Base.text:0000122A _Z3funP4Base ; CODE XREF: Java_com_example_ndkreverse8_Lesson8_main+68p.text:0000122A PUSH {R3,LR}.text:0000122C LDR R3, [R0].text:0000122E LDR R3, [R3] ;执行_ZN7Derived1fEv或者_ZN8Derived11fEv.text:00001230 BLX R3.text:00001232 POP {R3,PC}.text:00001232 ; End of function fun(Base *).text:00001232
只有虚函数才会出现在虚表中,如果函数为非虚函数,那么不会出现在虚表中。
子类的虚表中会出现父类的虚方法,如果子类覆盖父类的虚方法,那么在子类的虚表中父类的虚方法会被改写为子类的方法,并且子类的虚表中子类的虚方法不会再出现该方法。
0 0
- Android SO逆向-C++虚函数表解析
- Android SO逆向-对象的继承和虚函数
- 【编程语言】c++--虚函数表解析
- C++虚函数表解析
- C++ 虚函数表解析(难点*)
- [C++](转载)虚函数表解析
- 虚函数表解析
- 虚函数表解析
- 虚函数表解析
- 虚函数表解析
- 虚函数表解析
- 虚函数表解析
- 虚函数表解析
- 虚函数表解析
- 虚函数表解析
- 虚函数表解析
- 虚函数表解析
- 虚函数表解析
- 【认证】【瑞典】Sweden : Boxer, Boxer HD,Comhem
- 如何获取select标签的内容
- (5)业务逻辑的实现:数据如何处理
- Add Digits
- c语言编程 :模拟实现简单扫雷游戏
- Android SO逆向-C++虚函数表解析
- elastisearch搜索书名和作者
- 嚷嚷
- weex 学习开发笔记
- C++学习笔记二(简单文本文件的输出)
- 逻辑基础
- 我的第一篇博客
- 2017年大数据分析领域的六大发展趋势
- bzoj3531