逆向C++第一步
来源:互联网 发布:全知药水 编辑:程序博客网 时间:2024/06/06 19:37
逆向工程分析人员还应该熟悉对象(或者说一个类的实例)在内存中是个什么样子,说的文绉绉一点就是类在内存中的布局情况。我们先来看一个简单的类:
class CommonBase
{
int co;
};
class Base1: virtual public CommonBase
{
public:
virtual void print1() {}
virtual void print2() {}
private:
int b1;
};
class Base2: virtual public CommonBase
{
public:
virtual void dump1() {}
virtual void dump2() {}
private:
int b2;
};
class Derived: public Base1, public Base2
{
public:
void print2() {}
void dump2() {}
private:
int d;
};
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
F5编译之,你会惊奇地发现,Output里面有如下字样:
1 class Derived size(32):
2 +---
3 | +--- (base class Base1)
4 0 | | {vfptr}
5 4 | | {vbptr}
6 8 | | b1
7 | +---
8 | +--- (base class Base2)
9 12 | | {vfptr}
10 16 | | {vbptr}
11 20 | | b2
12 | +---
13 24 | d
14 +---
15 +--- (virtual base CommonBase)
16 28 | co
17 +---
18
19 Derived::$vftable@Base1@:
20 0 | &Base1::print1
21 1 | &Derived::print2
22
23 Derived::$vftable@Base2@:
24 0 | &Base2::dump1
25 1 | &Derived::dump2
26
27 Derived::$vbtable@Base1@:
28 0 | -4
29 1 | 24 (Derivedd(Base1+4)CommonBase)
30
31 Derived::$vbtable@Base2@:
32 0 | -4
33 1 | 12 (Derivedd(Base2+4)CommonBase)
34
35 Derived::print2 this adjustor: 0
36 Derived::dump2 this adjustor: 12
那么怎么才能得到上面这张图呢?我们可以使用/d1reportSingleClassLayout和/d1reportAllClassLayout 这个编译开关,它可以让MSVC 编译器(译注:至少是MSVC 6.0 以上的版本)生成一个.layout 文件,在该文件中包含有大量的极具价值的类的布局信息,包括基类在派生类中的位置,虚函数表,虚基类表(virtual base class table 我们下面会深入讨论),类的成员变量等信息(实际上我们这些图表都是从.layout文件中取出的)。
设置方法:在Project Properties->C++->Command Line->Additional Options里面加上/d1reportSingleClassLayoutDerived吧!
- 逆向C++第一步
- C的第一步
- 初探C++(第一步)
- C语言的第一步
- 关于C语言的第一步
- 初学C++,正在迈出第一步
- 走上不归路的第一步-C
- 单链表逆向 c
- objective-c 逆向资料
- c语言逆向基础
- 第一步
- 第一步
- 第一步
- 第一步
- 第一步
- 第一步
- 第一步
- 第一步
- 内存对齐#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
- 金山招聘题目: 编程计算从1到2008080808之间的整数有多少个含有数字7
- Message ID 备用
- JS隐藏错误
- DBA该做什么与不该做什么
- 逆向C++第一步
- 2008.11.01
- 随便写写
- .net 生成随机数
- oracle Exp/IMP命令详解
- 2008.11.02
- 安装wince 6.0
- 【转】Winform中在Form上截取消息的两种方法
- void (*f(int, void (*)(int)))(int) 函数解析