0%

C++逆向与ghidra脚本

最近没学习什么东西,看到了这篇文章顺便学习一下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
29
class 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 有时间补一下