xp下用户程序空间分配(5):加载系统DLL

快乐虾

http://blog.csdn.net/lights_joy/

[email protected]

本文适用于

Xp sp3

vs2008

欢迎转载,但请保留作者信息

ntdll.dll是加载的第一个系统DLL,它的模块信息:

名称

基址

大小

入口点

E:\WINDOWS\system32\ntdll.dll

7c920000

00093000

7c932c28

对应的内存块:

基址

分配基址

分配保护

大小

状态

保护

类型

7c920000

7c920000

00000080
PAGE_EXECUTE_WRITECOPY

00001000

00001000
MEM_COMMIT

00000002
PAGE_READONLY

01000000
MEM_IMAGE

7c921000

7c920000

00000080
PAGE_EXECUTE_WRITECOPY

0007a000

00001000
MEM_COMMIT

00000020
PAGE_EXECUTE_READ

01000000
MEM_IMAGE

7c99b000

7c920000

00000080
PAGE_EXECUTE_WRITECOPY

00003000

00001000
MEM_COMMIT

00000004
PAGE_READWRITE

01000000
MEM_IMAGE

7c99e000

7c920000

00000080
PAGE_EXECUTE_WRITECOPY

00001000

00001000
MEM_COMMIT

00000008
PAGE_WRITECOPY

01000000
MEM_IMAGE

7c99f000

7c920000

00000080
PAGE_EXECUTE_WRITECOPY

00001000

00001000
MEM_COMMIT

00000004
PAGE_READWRITE

01000000
MEM_IMAGE

7c9a0000

7c920000

00000080
PAGE_EXECUTE_WRITECOPY

00013000

00001000
MEM_COMMIT

00000002
PAGE_READONLY

01000000
MEM_IMAGE

7c9b3000

00000000

00000000

00bdd000

00010000
MEM_FREE

00000001
PAGE_NOACCESS

00000000

exe略微有所区别,还是用dumpbin把它的文件内容导出来进行比较。

1.1 文件头

DLLEXE文件一样都是PE格式,因此它们的文件头的结构是一样的,看看从ntdll.dlldump出来的信息:

14C machine (x86)

4 number of sections

4802BDC5 time date stamp Mon Apr 14 10:13:25 2008

0 file pointer to symbol table

0 number of symbols

E0 size of optional header

210E characteristics

Executable

Line numbers stripped

Symbols stripped

32 bit word machine

DLL

Windows为其分配了一块空间:

基址

分配基址

分配保护

大小

状态

保护

类型

7c920000

7c920000

00000080
PAGE_EXECUTE_WRITECOPY

00001000

00001000
MEM_COMMIT

00000002
PAGE_READONLY

01000000
MEM_IMAGE

1.2 代码段

先看看文件中要求分配的地址:

SECTION HEADER #1

.text name

79FB6 virtual size

1000 virtual address (7C921000 to 7C99AFB5)

7A000 size of raw data

400 file pointer to raw data (00000400 to 0007A3FF)

0 file pointer to relocation table

0 file pointer to line numbers

0 number of relocations

0 number of line numbers

60000020 flags

Code

Execute Read

再看看windows在内存中分配的空间:

基址

分配基址

分配保护

大小

状态

保护

类型

7c921000

7c920000

00000080
PAGE_EXECUTE_WRITECOPY

0007a000

00001000
MEM_COMMIT

00000020
PAGE_EXECUTE_READ

01000000
MEM_IMAGE

这个和EXE文件是一样的。

1.3 数据段

这个DLL里面居然没有只读的数据段,直接就是一个数据段。

SECTION HEADER #2

.data name

4A00 virtual size

7B000 virtual address (7C99B000 to 7C99F9FF)

3200 size of raw data

7A400 file pointer to raw data (0007A400 to 0007D5FF)

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

看看windows分配的内存块:

基址

分配基址

分配保护

大小

状态

保护

类型

7c99b000

7c920000

00000080
PAGE_EXECUTE_WRITECOPY

00003000

00001000
MEM_COMMIT

00000004
PAGE_READWRITE

01000000
MEM_IMAGE

7c99e000

7c920000

00000080
PAGE_EXECUTE_WRITECOPY

00001000

00001000
MEM_COMMIT

00000008
PAGE_WRITECOPY

01000000
MEM_IMAGE

7c99f000

7c920000

00000080
PAGE_EXECUTE_WRITECOPY

00001000

00001000
MEM_COMMIT

00000004
PAGE_READWRITE

01000000
MEM_IMAGE

exe文件相比,这个数据段分为了三块,不像exe那样只分为两块。

1.4 .rsrc

文件中dump出来的头信息:

SECTION HEADER #3

.rsrc name

F7D4 virtual size

80000 virtual address (7C9A0000 to 7C9AF7D3)

F800 size of raw data

7D600 file pointer to raw data (0007D600 to 0008CDFF)

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

再看windows分配的内存:

基址

分配基址

分配保护

大小

状态

保护

类型

7c9a0000

7c920000

00000080
PAGE_EXECUTE_WRITECOPY

00013000

00001000
MEM_COMMIT

00000002
PAGE_READONLY

01000000
MEM_IMAGE

这个也和EXE文件一样,没什么说的。

1.5 .reloc

看看文件头:

SECTION HEADER #4

.reloc name

2E84 virtual size

90000 virtual address (7C9B0000 to 7C9B2E83)

3000 size of raw data

8CE00 file pointer to raw data (0008CE00 to 0008FDFF)

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

再看分配的内存:

基址

分配基址

分配保护

大小

状态

保护

类型

7c9a0000

7c920000

00000080
PAGE_EXECUTE_WRITECOPY

00013000

00001000
MEM_COMMIT

00000002
PAGE_READONLY

01000000
MEM_IMAGE

EXE文件一样,这个段也没有单独分配的内存,直接和.rsrc段合并在一起。

其它的系统DLL与此类似,不再说明。

1 参考资料

xp下用户程序空间分配(4):加载主程序(2009-8-27)

xp下用户程序空间分配(3):加载文件(2009-8-26)

xp下用户程序空间分配(2):栈(2009-8-26)

xp下用户程序空间分配(1):大致框架(2009-8-26)

你可能感兴趣的:(数据结构,框架,.net,windows,XP)