Windows PE 结构 之 节表结构解析及遍历

Windows PE 结构 之 节表结构解析及遍历 - 侠者安全社区
Windows PE 结构 之 节表结构解析及遍历
此内容为付费阅读,请付费后查看
会员专属资源
您暂无购买权限,请先开通会员
开通会员
付费阅读

0x0 基础知识

00 区段名及其含义

区段名含义
.text默认的代码区块, 它的内容全是指令代码,链接器把所有目标文件的text块连接成一个大的.text块,使用Borland C++编译器产生的代码存放在CODE的区域里
.data默认的读/写数据块, 全局变量, 静态变量一般放在这个区段
.rdata默认只读数据区块,但程序中很少用到该块中的数据,一般两种情况用到,一是MS 的链接器产生EXE文件中用于存放调试目录,二是用于存放说明字符串,如果程序的DEF文件中指定了DESCRIPTION,字符串就会出现在rdata中
.idata包含其他外来的DLL的函数及数据信息, 即 输入表,将.idata区块合并成另一个区块已成为一种惯例,典型的是.rdata区块,默认的,链接器只在创建一个Release模式的可执行文件时才能将idata合并到另外一个区块中
.edata输出表,当创建一个输出API或数据的可执行文件时,连接器会创建一个.EXP文件,这个.EXP文件包含一个.edata区块,其会被加载到可执行文件中,经常被合并到.text或.rdata 区块中
.rsrc资源表, 包括模块的全部资源,如图标,菜单,位图等,这个区块是只读的,无论如何不应该把它命名为.rsrc以外的名字,也不能合并到其他的区块里
.bss未初始化的数据,很少在用,取而代之的是执行文件的.data区块的的VirtualSize被扩展大的空间里用来装未初始化的数据.
.crt用于C++ 运行时(CRT)所添加的数据
.tlsTLS表,TLS的意思是线程局部存储器,用于支持通过_declspec(thread)声明的线程局部存储变量的数据,这包括数据的初始化值,也包括运行时所需要的额外变量
.reloc重定位表,可执行文件的基址重定位,基址重定位,一般仅Dll需要的
.sdata相对于全局指针的可被定位的 短的读写数据
.pdata异常表, 包含CPU特定的IAMGE_RUNTIME_FUNTION_ENTRY结构数组,DataDirectory中的IMAGE_DIRECTORY_ENTRY_EXCEPTION指向它.
.didat延迟导入表,延迟装入输入数据,在非Release模式下可以找到

01 区段类别及分布

区段示例

    Windows PE 结构 之 节表结构解析及遍历-侠者安全社区
    typedef struct _IMAGE_SECTION_HEADER {
        BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];   // 8 bytes 块名
        union {
                DWORD   PhysicalAddress;   // 无
                DWORD   VirtualSize;
        } Misc;
        DWORD   VirtualAddress;
        DWORD   SizeOfRawData;
        DWORD   PointerToRawData;
        DWORD   PointerToRelocations;
        DWORD   PointerToLinenumbers;
        WORD    NumberOfRelocations;
        WORD    NumberOfLinenumbers;
        DWORD   Characteristics;
    } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

    • Name:区段的名称
    • VirtualSize:区段在内存对齐中的大小
    • VirtualOffset:区段在内存中的相对虚拟地址RVA
    • RawSize:区段在文件对齐后的的大小
    • RawOffset:区段在文件中的偏移地址
    • Characteristics:特征值(下图中我们可以看到.text特征值600000020)

    通过区段图,得出程序加载到内存后的分布以及文件在硬盘的分布

    Windows PE 结构 之 节表结构解析及遍历-侠者安全社区
    • 程序加载到内存之后,都会分配4GB的内存地址空间(注:并不是内存大小)
    • 在区段与区段之间并不是紧挨着的,因为内存会进行0x1000的内存对齐,空出来的空间进行填充0字节的数据。例如5B4B~6000的空间都是填充的0字节数据

    如何正确识别一个区段为代码段

    • 方法一:通过Image_Option_Header中代码块起始RVA(BaseOfCode)中的地址
    • 方法二:通过区段的特征值标志(属性)MEM_EXECUTE(可执行)、MEM_READ(可读),判断这个是代码段。例如 .text 区段(通过右击区段行,选择Edit Header即可查看):
    Windows PE 结构 之 节表结构解析及遍历-侠者安全社区

    0x1 实现代码

    © 版权声明
    THE END
    喜欢就支持一下吧
    点赞8 分享
    评论 抢沙发
    头像
    欢迎您留下宝贵的见解!
    提交
    头像

    昵称

    取消
    昵称表情

      暂无评论内容