os dword ptr es:[edi]
int patmatch;
………………
由此可见windows应该是把这个段的 内容原封不动地读进来了,执行时PC指针将指向这块内存的数据。
1.3 只读数据段
这是exe里面的第二个段,看看它的section head:
.rdata name
6FD0 virtual size
5D000 virtual address (0045D000 to 00463FCF)
7000 size of raw data
5C200 file pointer to raw data (0005C200 to 000631FF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
40000040 flags
Initialized Data
Read Only
再看内存里面 的section head:
同样,满足了文件的要求。
这个只读数据段的绝大部分数据与文件中读出的一致,但是对于导入 表之类的数据,在加载到内存之后将由windows动态更改。
1.4 数据段
先看看从文件中dump出来的section head:
SECTION HEADER #3
.data name
352C virtual size
64000 virtual address (00464000 to 0046752B)
1400 size of raw data
63200 file pointer to raw data (00063200 to 000645FF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
C0000040 flags
Initialized Data
Read Write
再看看内存里面的section head:
从这里可以看到,实际上这个段的内存是分为两部分的,第一个部分用于存放Relocation table,第 二个部分才是程序里的全局变量。因为第二个部分是允许在程序中修改的,因此它的保护标志设置成了 PAGE_READWRITE。
随便在程序里面找个全局变量,看一下地址,的确是落在这个范围的,呵呵。前几 天还使劲在想怎么取得数据段的首地址,得来全不费工夫!用VirtualQuery足矣!
1.5 .rsrc
先看看从bash.exe里面dump出来的section head:
SECTION HEADER #4
.rsrc name
2B4 virtual size
68000 virtual address (00468000 to 004682B3)
400 size of raw data
64600 file pointer to raw data (00064600 to 000649FF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
40000040 flags
Initialized Data
Read Only
再看看内存里面的section head:
这一块的内容和从文件中读取的内容完全一致。
1.6 .reloc
先看看从文件中dump出来的头:
SECTION HEADER #5
.reloc name
58D0 virtual size
69000 virtual address (00469000 to 0046E8CF)
5A00 size of raw data
64A00 file pointer to raw data (00064A00 to 0006A3FF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
42000040 flags
Initialized Data
Discardable
Read Only
再看看内存里面的section head:
比较发现它在内存中的数据和从文件中读取出来的原始数据是一致的。Reloc的过程暂且不管,再看 看其它的东西。 |