最近没学习什么东西,看到了这篇文章顺便学习一下ghidra脚本
MIT 6.828 没更是因为我lab4最后有一个地方一直没调出来…
原文链接
Introduction to reversing C++ code
C++相比C语言复杂很多,为了支持OOP的特性在C的结构上增加了许多实现,作者从C++类、方法、模板三方面展开讲解
compiler exploer
Virtual table basis
Classes layout
C++为了支持继承时的虚函数在class中增加了虚函数表,这个表类似IO中的vtable,指向各种指针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
29class A {
memberType1 memberA1;
...
memberTypeN memberAN;
virtual methodA1();
...
virtual methodAM();
};
class B {
memberType1 memberB1;
...
memberTypeN memberBP;
virtual methodB1();
...
virtual methodBQ();
};
class C : A, B {
memberType1 memberC1;
...
memberTypeR memberCR;
virtual methodC1();
...
virtual methodCS();
}
上述这段代码对应的内存布局就如下所示
|offset|description|
|:-:|:-:|
|0| vtable C:A|
|1| memberA1|
|…| …|
|AN| memberAN|
|AN + 1| vtable B:A|
|AN + 2 |memberB1|
|…| …|
|AN + 1 + BP| memberBP|
|AN + BP + 2| memberC1|
|… |…|
|AN + BP + 1 + CR| memberCR|
如上C类的虚函数方法只会插入到第一个父类的虚表中
对C++中类虚表ghidra并没有原生支持,但是我们可以自己创建一个函数指针表来自行实现
Method
先摆了 后面ghidra script 有时间补一下