-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathvtbl.cpp
98 lines (91 loc) · 2.14 KB
/
vtbl.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/*
* C++ Class Virtual Table
*
*
* a +------------+
* | vt +------>+----------+----------+
* +------------+ | AA()::f1 | AA()::f2|
* | i | +----------+----------+
* +------------+
*
* $>g++ vtbl.cpp -Wno-invalid-offsetof -o vtbl
* $>./vtbl
*
*/
#include <stdio.h>
class A
{
public:
A() {
i = 0;
};
virtual void f1() = 0;
int i;
};
class AA : public A
{
public:
virtual void f1() {
printf("%s\n", __FUNCTION__);
};
virtual void f2() {
printf("%s\n", __FUNCTION__);
};
};
class AAA : public AA
{
public:
void f1() {
printf("%s\n", __FUNCTION__);
};
};
typedef void (*PF)();
void f() {
printf("%s\n", __FUNCTION__);
}
int
main(int argc, char* argv[])
{
int a_len = sizeof(A);
int aa_len = sizeof(AA);
int ab_len = sizeof(AAA);
int i_offset_a = ((size_t)(&(((A*)0)->i)));
A* a = new AA;
a->f1();
((AA*)a)->f2();
printf("sizeof(A)=%u\n", sizeof(A));
printf("sizeof(AA)=%u\n", sizeof(AA));
printf("sizeof(AAA)=%u\n", sizeof(AA));
PF pf = f;
pf();
printf("a = %p\n", a);
//virtual table pointer
void* vtptr = (void*)a;
//virtual table
void* vt = (void*)(*(size_t*)vtptr);
//virtual function1 pointer
void* vf1 = (void*)(((size_t*)vt)[0]);
printf("vf1=%p\n", vf1);
//virtual function2 pointer
void* vf2 = (void*)(((size_t*)vt)[1]);
printf("vf2=%p\n", vf2);
printf("a->vtptr = %p\n", (void*)(a));
printf("a->1vf point = %p\n", (PF*)(*((size_t*)(a))));
printf("a->2vf point = %p\n", (PF*)(*((size_t*)(a)))+1);
printf("a->1vf = %p\n", *((PF*)(*((size_t*)(a)))));
printf("a->1vf = %p\n", *((PF*)(((size_t*)(a))[0])));
printf("a->2vf = %p\n", *(((PF*)(*((size_t*)(a))))+1));
printf("a->2vf = %p\n", *(((PF*)(*((size_t*)(a))))[1]));
printf("a->i = %d\n", (int)*(((char*)a) + i_offset_a));
*(((char*)a) + i_offset_a) = 2;
printf("a->i = %d\n", a->i);
pf = *((PF*)(*((size_t*)(a))));
pf();
pf = *((PF*)(((size_t*)(a)))[0]);
pf();
pf = *((PF*)(*((size_t*)(a)))+1);
pf();
pf = *(((PF*)(*((size_t*)(a))))[1]);
pf();
return 0;
}