快乐虾
http://blog.youkuaiyun.com/lights_joy/
lights@hb165.com
本文适用于
Xp sp3
vs2008
欢迎转载,但请保留作者信息
ntdll.dll是加载的第一个系统DLL,它的模块信息:
| 名称 | 基址 | 大小 | 入口点 |
| E:\WINDOWS\system32\ntdll.dll | 7c920000 | 00093000 | 7c932c28 |
对应的内存块:
| 基址 | 分配基址 | 分配保护 | 大小 | 状态 | 保护 | 类型 |
| 7c920000 | 7c920000 | 00000080 | 00001000 | 00001000 | 00000002 | 01000000 |
| 7c921000 | 7c920000 | 00000080 | 0007a000 | 00001000 | 00000020 | 01000000 |
| 7c99b000 | 7c920000 | 00000080 | 00003000 | 00001000 | 00000004 | 01000000 |
| 7c99e000 | 7c920000 | 00000080 | 00001000 | 00001000 | 00000008 | 01000000 |
| 7c99f000 | 7c920000 | 00000080 | 00001000 | 00001000 | 00000004 | 01000000 |
| 7c9a0000 | 7c920000 | 00000080 | 00013000 | 00001000 | 00000002 | 01000000 |
| 7c9b3000 | 00000000 | 00000000 | 00bdd000 | 00010000 | 00000001 | 00000000 |
和exe略微有所区别,还是用dumpbin把它的文件内容导出来进行比较。
1.1 文件头
DLL和EXE文件一样都是PE格式,因此它们的文件头的结构是一样的,看看从ntdll.dll中dump出来的信息:
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 | 00001000 | 00001000 | 00000002 | 01000000 |
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 | 0007a000 | 00001000 | 00000020 | 01000000 |
这个和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 | 00003000 | 00001000 | 00000004 | 01000000 |
| 7c99e000 | 7c920000 | 00000080 | 00001000 | 00001000 | 00000008 | 01000000 |
| 7c99f000 | 7c920000 | 00000080 | 00001000 | 00001000 | 00000004 | 01000000 |
和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 | 00013000 | 00001000 | 00000002 | 01000000 |
这个也和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 | 00013000 | 00001000 | 00000002 | 01000000 |
和EXE文件一样,这个段也没有单独分配的内存,直接和.rsrc段合并在一起。
其它的系统DLL与此类似,不再说明。
1 参考资料
xp下用户程序空间分配(4):加载主程序(2009-8-27)
xp下用户程序空间分配(3):加载文件(2009-8-26)
xp下用户程序空间分配(2):栈(2009-8-26)
xp下用户程序空间分配(1):大致框架(2009-8-26)
本文详细解析了ntdll.dll的内存布局,包括其不同段的虚拟大小、虚拟地址范围及内存保护属性等,并对比了与EXE文件的差异。
2万+

被折叠的 条评论
为什么被折叠?



