当前位置:主页   - 电脑 - 程序设计 - C/C++
xp下用户程序空间分配(5):加载系统DLL
来源:网络   作者:快乐虾   更新时间:2011-08-11
收藏此页】    【字号    】    【打印】    【关闭

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

  名称

  基址

  大小

  入口点

  E:WINDOWSsystem32ntdll.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    文件头

  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

  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与此类似,不再说明。

编缉推荐阅读以下文章

  • xp下用户程序空间分配(9):还剩下什么?
  • xp下用户程序空间分配(8):MEM_MAPPED
  • xp下用户程序空间分配(7):Heap
  • xp下用户程序空间分配(6):加载用户DLL
  • xp下用户程序空间分配(4):加载主程序
  • xp下用户程序空间分配(3):加载文件
  • xp下用户程序空间分配(2):栈
  • xp下用户程序空间分配(1):大致框架
其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明