首页
社区
课程
招聘
[求助]关于PE文件的数据段.data和.rdata的问题
发表于: 2005-3-1 17:55 19233

[求助]关于PE文件的数据段.data和.rdata的问题

2005-3-1 17:55
19233
PE文件的数据段分为.data和.rdata(只读),相对于高级语言而言,这两个段分别对应高级语言中的什么地方的数据?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
2
我正在学习中
2005-3-1 18:11
0
雪    币: 1241
活跃值: (160)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
.data当然保存的是数据了。比如程序中的全局变量。
.rdata有时候会部分保存IAT数据。部分保存的是一些结构。比如MFC程序就有一些vptr相关的信息。

各种语言可能都有区别的。自己可以逆向分析一下就知道了。
2005-3-1 21:08
0
雪    币: 99
活跃值: (2438)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
.data  = writable data
.rdata =  readonly data
2005-3-1 22:07
1
雪    币: 200
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
可是我的程序中并无全局变量,我用IDA分析还是看到有很多下面的东东:

.data:1002C000 ; Segment type: Pure data
.data:1002C000 ; Segment permissions: Read/Write
.data:1002C000 _data           segment para public 'DATA' use32
.data:1002C000                 assume cs:_data
.data:1002C000                 ;org 1002C000h
.data:1002C000 unk_1002C000    db    0                 ; DATA XREF: __cinit+29o
.data:1002C001                 db    0
.data:1002C002                 db    0
.data:1002C003                 db    0
.data:1002C004                 db    0
.data:1002C005                 db    0
.data:1002C006                 db    0
.data:1002C007                 db    0
.data:1002C008                 db    0
.data:1002C009                 db    0
.data:1002C00A                 db    0

...............................

上是为什么呢?
2005-3-4 17:24
0
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
6
三楼说的很明白。
在data数据段储存为全局变量或静态数据,在应用程序初始化的时候该段的全部变量归0,有全局静态数据静态数据常量保存。
.rdata 保存函数指针或是间接调用的虚拟函数指针或虚拟表对象/类指针等,不同的编译器可能对该段有所处理不同吧。

自己逆逆,,,大家一起分析
2005-3-4 17:43
0
雪    币: 200
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我还是举个例子来说吧:

void MyFun()
{
   char ch[]="good!";
   MessageBox(ch);
}

=========================

void MyFun()
{
    MessageBox("good!");
}

上面两个程序段,编译之后,"good!"分别存储在哪个数据段里呢?
2005-3-5 16:54
0
雪    币: 161
活跃值: (231)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
看是什么编译器
2005-3-5 16:57
0
雪    币: 200
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
如果是用vc++6.0的编译器呢?

另外,c++中用 new 关键字申请的堆内存与哪个数据段关联? 能从汇编的角度讲讲堆内存是怎么回事吗?
2005-3-6 10:57
0
雪    币: 392
活跃值: (909)
能力值: ( LV9,RANK:690 )
在线值:
发帖
回帖
粉丝
10
最初由 ljtt 发布
人生最重要的事莫过于上WC记得带纸,否则钞票们会死得很冤,即便它们转世三生,都会记住这种仇恨的。


这个。。。哈哈哈
2005-3-6 11:07
0
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
11
最初由 maohbao 发布
我还是举个例子来说吧:

void MyFun()
{
char ch[]="good!";
}


char ch[]=="good!" 应该分配在栈中,因为它在函数MyFun是局部变量,函数执行完毕,自动清栈局部变量。。
2005-3-6 15:30
0
雪    币: 2163
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
.rdata
2021-12-1 18:03
0
雪    币: 5281
活跃值: (3944)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13

一般情况下.data就是一些初始化过的数据(不光是你代码中的数据,也有很多是编译器生成的数据以及依赖库中的数据)。未初始化的可写数据的虚地址通常也在这个段里,但在文件中没有实际数据值。

.rdata通常放只读的数据。但没人规定编译器不能放其它内容。所以这里放啥的都有,导入/导出表,TLS,运行配置,调试信息等等。


如下图:

2021-12-2 00:06
0
游客
登录 | 注册 方可回帖
返回
//