关于使用masm编译器产生的PE文件"data段"与"data?段"结构的思考与试验
2010-08-12 11:41
585 查看
最近在学习分解PE文件,第一步便是熟悉pe文件的结构。在看到了罗云杉的win32汇编教程的第17章的PEInfo例子时,运行了一下,顺便根据提示做了一定的试验。结果发现了一定的问题。这些问题主要集中在对win32汇编中的.data段和.data?段上。
首先,按照书中(大概是第三章)的说法,.data?段在磁盘上不会预留空间,只有当PE文件被装载(注意是装载,而不是简单的内存映射)的时候,.data?段才会被填充为真正的占有内存的节。于是,我编写了一个非常简单的程序,如下:
代码
.386
.model flat, stdcall
option casemap :none
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
.data?
number dd ?
.data
number2 dd 0
.const
text db 'hello',0
.code
start:
invoke MessageBox, NULL, addr text, addr text, MB_OK
invoke ExitProcess, 0
end start
再次查看,可以看到如下结果,
----------------------------------------------------------
节区名称 节区大小 虚拟地址 Raw_尺寸 Raw_偏移 节区属性
----------------------------------------------------------
.text 00000026 00001000 00000200 00000400 60000020
.rdata 0000009A 00002000 00000200 00000600 40000040
.data 00000008 00003000 00000200 00000800 C0000040
.rsrc 00000010 00004000 00000200 00000A00 40000040
再次修改程序,将number2的定义改成2*16*16个byte大小,即
.data
number2 db 2*16*16 dup(0)
得到结果
----------------------------------------------------------
节区名称 节区大小 虚拟地址 Raw_尺寸 Raw_偏移 节区属性
----------------------------------------------------------
.text 00000026 00001000 00000200 00000400 60000020
.rdata 0000009A 00002000 00000200 00000600 40000040
.data 00000204 00003000 00000200 00000800 C0000040
.rsrc 00000010 00004000 00000200 00000A00 40000040
如果在上次修改的那个程序里再在.data中再加一个number3 db 0 ,即
.data
number2 db 2*16*16 dup(0)
number3 db 0
----------------------------------------------------------
节区名称 节区大小 虚拟地址 Raw_尺寸 Raw_偏移 节区属性
----------------------------------------------------------
.text 00000026 00001000 00000200 00000400 60000020
.rdata 0000009A 00002000 00000200 00000600 40000040
.data 00000208 00003000 00000400 00000800 C0000040
.rsrc 00000010 00004000 00000200 00000C00 40000040
总结:
有上面的一系列的测试结果可知,
1. 在PE文件中,被命名为.data的节实际上是源程序中的.data和.data?的统称,只是.data?不占用磁盘,而.data却实实在在地占用了磁盘
2. 从"节区大小"这里可以看出来,源程序中在没有.data,但是有.data?的情况下,确实在磁盘上没有预留空间,但是在PE文件被装载进内存之后,就会被扩展出来
3. 磁盘的对齐粒度是200h,这其实是一笔不小的开销。远远高于内存的4h的对齐粒度。
首先,按照书中(大概是第三章)的说法,.data?段在磁盘上不会预留空间,只有当PE文件被装载(注意是装载,而不是简单的内存映射)的时候,.data?段才会被填充为真正的占有内存的节。于是,我编写了一个非常简单的程序,如下:
代码
.386
.model flat, stdcall
option casemap :none
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
.data?
number dd ?
.data
number2 dd 0
.const
text db 'hello',0
.code
start:
invoke MessageBox, NULL, addr text, addr text, MB_OK
invoke ExitProcess, 0
end start
再次查看,可以看到如下结果,
----------------------------------------------------------
节区名称 节区大小 虚拟地址 Raw_尺寸 Raw_偏移 节区属性
----------------------------------------------------------
.text 00000026 00001000 00000200 00000400 60000020
.rdata 0000009A 00002000 00000200 00000600 40000040
.data 00000008 00003000 00000200 00000800 C0000040
.rsrc 00000010 00004000 00000200 00000A00 40000040
再次修改程序,将number2的定义改成2*16*16个byte大小,即
.data
number2 db 2*16*16 dup(0)
得到结果
----------------------------------------------------------
节区名称 节区大小 虚拟地址 Raw_尺寸 Raw_偏移 节区属性
----------------------------------------------------------
.text 00000026 00001000 00000200 00000400 60000020
.rdata 0000009A 00002000 00000200 00000600 40000040
.data 00000204 00003000 00000200 00000800 C0000040
.rsrc 00000010 00004000 00000200 00000A00 40000040
如果在上次修改的那个程序里再在.data中再加一个number3 db 0 ,即
.data
number2 db 2*16*16 dup(0)
number3 db 0
----------------------------------------------------------
节区名称 节区大小 虚拟地址 Raw_尺寸 Raw_偏移 节区属性
----------------------------------------------------------
.text 00000026 00001000 00000200 00000400 60000020
.rdata 0000009A 00002000 00000200 00000600 40000040
.data 00000208 00003000 00000400 00000800 C0000040
.rsrc 00000010 00004000 00000200 00000C00 40000040
总结:
有上面的一系列的测试结果可知,
1. 在PE文件中,被命名为.data的节实际上是源程序中的.data和.data?的统称,只是.data?不占用磁盘,而.data却实实在在地占用了磁盘
2. 从"节区大小"这里可以看出来,源程序中在没有.data,但是有.data?的情况下,确实在磁盘上没有预留空间,但是在PE文件被装载进内存之后,就会被扩展出来
3. 磁盘的对齐粒度是200h,这其实是一笔不小的开销。远远高于内存的4h的对齐粒度。
相关文章推荐
- 异常详细信息: System.Data.SqlClient.SqlException: 无法打开物理文件 。。。 操作系统错误 32:"32(另一个程序正在使用此文件,进程无法访问。
- Cannot create file"C:\Users\LML\AppData\Local\Temp\EditorLineEnds.ttr"。另一个程序正在使用此文件,进程无法访问。
- 关于使用Entity Framework时遇到的问题 未找到具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序。请确保在应用程序配置文件的“entityFramework”节中注册了该提供程序
- C#关于"该进程无法访问文件,因为该文件正由另一进程使用"的错误的一点心得(示例)
- 关于phlacon与jQ使用formdata上传文件
- 我的关于编程中调用系统库的过程始终不理解???这篇文件解析了pe文件的结构
- 错误:error C1853:"Debug\...pch"预编译头文件来自编译器版本,或者预编译头C++而在C中使用它
- 使用logstash 运行配置文件,出现you must change the "path.data" setting
- PE结构学习笔记--关于AddressOfEntryPoint位置在文件中怎么确定问题
- 关于安卓 模块内的manifest文件使用占位符的思考
- linux 笔记 关于struct file 结构下 private_data 数据结构的思考
- 关于PE病毒编写的学习(六)——关于PE文件结构操作的程序编写
- 关于使用Ajax传中文数据到后台接受乱码问题 data:{"dictype":"客户信誉度"}
- 在AIX上用IBM的JVM,内存溢出时默认地会产生javacore文件(关于cpu的)和heapdump文件(关于内存的)。手动产生堆栈文件的方法是使用kill -3
- Cannot create file"C:\Users\LML\AppData\Local\Temp\EditorLineEnds.ttr"。另一个程序正在使用此文件,进程无法访问。
- 关于PE病毒编写的学习(六)——关于PE文件结构操作的程序编写
- 关于PE病毒编写的学习(六)——关于PE文件结构操作的程序编写
- 关于"IDEA项目左边栏只能看到文件看不到项目结构"一种新的解释
- 关于(enctype="multipart/form-data") post 提交时中文乱码解决方案(使用jspsmartupload时)
- 关于PHP程序使用file_get_content()函数进行抓取PHP程序与smarty结合编译过程中产生的静态文件,抓取不了?连接超时?(地址映射)