PE Format(13)
位20至23指定我没有找到信息的对齐。诸如#definesIMAGE_SCN_ALIGN_16BYTES之类。我曾经见过的唯一值为0,是16位的缺省对齐。我怀疑它们是库之类文件的目标对齐。
如果位24IMAGE_SCN_LNK_NRELOC_OVFL(链接扩展重定位节)被置1,表示节中包含一些我不知道的扩展重定位。
如果位25IMAGE_SCN_MEM_DISCARDABLE(内存可丢弃节)被置1,表示节中的数据在进程启动后就不需要了。它是,举例来说,含有重定位信息的情况。我曾经见过它也用于只执行一次的驱动和服务程序的启动例程,还用于输入目录。
如果位26IMAGE_SCN_MEM_NOT_CACHED(内存不缓存节)被置1,表示节中的数据不应该被缓存。不要问我为什么不。这是不是意味着关掉2级缓存?
如果位27IMAGE_SCN_MEM_NOT_PAGED(内存不可页换出节)被置1,表示节中的数据不应该页换出。它对驱动程序有意义。
如果位28IMAGE_SCN_MEM_SHARED(内存共享节)被置1,表示节中的数据在映象文件的所有正在运行的实例中共享。如果它是,例如DLL文件的未初始化数据,那么DLL的所有正在运行的实例程序在任何时候都将拥有相同的变量内容。
注意:只有第一个实例的节被初始化。
含有代码的节总是被共享写时拷贝(copy-on-write)(亦即:如果重定位必不可少,那么共享就不工作)。(译注:“写时拷贝”的译法也许根本就是错误的,但我一时找不到更准确的翻译,也不清楚其具体含义,只能以此充数了。希望知情着指点。)
如果位29IMAGE_SCN_MEM_EXECUTE(内存可执行节)被置1,表示进程对节的内存有“执行”的存取权限。
如果位30IMAGE_SCN_MEM_READ(内存可读节)被置1,表示进程对节的内存有“读”的存取权限。
如果位31IMAGE_SCN_MEM_WRITE(内存可写节)被置1,表示进程对节的内存有“写”的存取权限。
在节头之后,我们就会发现节本身。在文件中,它们按照“FileAlignment”(文件对齐)的字节数对齐(也就是说,在可选头之后和每个节的数据之后将要填充一些字节)并按照它们的RVA排序。在载入后(内存中), 它们按照“SectionAlignment”(节对齐)的字节数对齐。
试举一例,如果可选头在文件的偏移量981处结束,“FileAlignment”(文件对齐)的值为512,那么第一个节将于1024字节处开始。注意:你可通过“PointerToRawData”(原始数据指针)或者“VirtualAddress”(虚拟地址)的值来找到各节,因此实际上根本没必要在对齐上小题大做。
如果位24IMAGE_SCN_LNK_NRELOC_OVFL(链接扩展重定位节)被置1,表示节中包含一些我不知道的扩展重定位。
如果位25IMAGE_SCN_MEM_DISCARDABLE(内存可丢弃节)被置1,表示节中的数据在进程启动后就不需要了。它是,举例来说,含有重定位信息的情况。我曾经见过它也用于只执行一次的驱动和服务程序的启动例程,还用于输入目录。
如果位26IMAGE_SCN_MEM_NOT_CACHED(内存不缓存节)被置1,表示节中的数据不应该被缓存。不要问我为什么不。这是不是意味着关掉2级缓存?
如果位27IMAGE_SCN_MEM_NOT_PAGED(内存不可页换出节)被置1,表示节中的数据不应该页换出。它对驱动程序有意义。
如果位28IMAGE_SCN_MEM_SHARED(内存共享节)被置1,表示节中的数据在映象文件的所有正在运行的实例中共享。如果它是,例如DLL文件的未初始化数据,那么DLL的所有正在运行的实例程序在任何时候都将拥有相同的变量内容。
注意:只有第一个实例的节被初始化。
含有代码的节总是被共享写时拷贝(copy-on-write)(亦即:如果重定位必不可少,那么共享就不工作)。(译注:“写时拷贝”的译法也许根本就是错误的,但我一时找不到更准确的翻译,也不清楚其具体含义,只能以此充数了。希望知情着指点。)
如果位29IMAGE_SCN_MEM_EXECUTE(内存可执行节)被置1,表示进程对节的内存有“执行”的存取权限。
如果位30IMAGE_SCN_MEM_READ(内存可读节)被置1,表示进程对节的内存有“读”的存取权限。
如果位31IMAGE_SCN_MEM_WRITE(内存可写节)被置1,表示进程对节的内存有“写”的存取权限。
在节头之后,我们就会发现节本身。在文件中,它们按照“FileAlignment”(文件对齐)的字节数对齐(也就是说,在可选头之后和每个节的数据之后将要填充一些字节)并按照它们的RVA排序。在载入后(内存中), 它们按照“SectionAlignment”(节对齐)的字节数对齐。
试举一例,如果可选头在文件的偏移量981处结束,“FileAlignment”(文件对齐)的值为512,那么第一个节将于1024字节处开始。注意:你可通过“PointerToRawData”(原始数据指针)或者“VirtualAddress”(虚拟地址)的值来找到各节,因此实际上根本没必要在对齐上小题大做。

0 条评论:
发表评论
<< 主页