PE格式之 区块表与区块

本文转自:http://www.2cto.com/Article/201203/123127.html

 

_______________________________ 
  | IMAGE_DOS_HEADER     |   <-- Dos部首 
  ------------------------------- 
  | PE,0,0           |   <-- PE文件标志 
  ------------------------------- 
  | IMAGE_FILE_HEADER    |   <-- 映像文件头 
  ------------------------------- 
  | IMAGE_OPTIONAL_HEADER32 |   <-- 映像可选头 
  ------------------------------- 
  | Section Table      |   <-- 节表 
  ------------------------------- 
  | .text          |   <-- 代码区段 
  ------------------------------- 
  | .data          |   <-- 数据区段 
  ------------------------------- 
  | .idata          |   <-- 输入表 
  ------------------------------- 
  | .edata          |   <-- 输出表 
  ------------------------------- 
  | .reloc          |   <-- 重定位表区段 
  ------------------------------- 
  |  ....          | 
  ------------------------------- 
  |  调试信息         | 
  ------------------------------- 
根据这个结构表IMAGE_OPTIONAL_HEADER下面紧接着就是区块表和各种区块,也可以叫做节表和节英文是SECTION。
节表是由一大堆的IMAGE_SECTION_HEADER排列成的一个数据结构。其数量由IMAGE_NT_HEADERS结构中的FileHeader.NumberOfSections成员来决定。
IMAGE_SECTION_HEADER的结构如下
 
typedef struct _IMAGE_SECTION_HEADER  

        BYTE Name[IMAGE_SIZEOF_SHORT_NAME];     // 节表名称,如“.text”  
        //IMAGE_SIZEOF_SHORT_NAME=8 
        union 
         { 
                DWORD PhysicalAddress;        // 物理地址 
                DWORD VirtualSize;                // 真实长度,这两个值是一个联合结构,可以使用其中的任何一个,一 
                                                              // 般是取后一个 
        } Misc; 
        DWORD VirtualAddress;              // 节区的RVA 地址 
        DWORD SizeOfRawData;            // 在文件中对齐后的尺寸 
        DWORD PointerToRawData;        // 在文件中的偏移量 
        DWORD PointerToRelocations;     // 在OBJ文件中使用,重定位的偏移 
        DWORD PointerToLinenumbers;   // 行号表的偏移(供调试使用地) 
        WORD NumberOfRelocations;      // 在OBJ文件中使用,重定位项数目 
        WORD NumberOfLinenumbers;    // 行号表中行号的数目 
        DWORD Characteristics;              // 节属性如可读,可写,可执行等} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;  
Name 里面存的是区块的名字
.text code 什么的就是放代码用的
.data 就是放数据,已经初始化好的
.idata 就是输入表 ,很多加壳程序会修改输入表,hook api 在程序运行api时,让壳取得一定时间的权限来反跟踪,脱壳的一大步骤就是还原输入表。
.edata 输出表
.bbs 未初始化的数据
VirtualSizes是一个非常牛逼的成员,其中的值是区块没有按FileAlignment对其前的大小,通过它可以推算出区块中还有多少没有被使用,很多病毒会在未被是用的空间里
插入自己的代码。
Characteristics 表示该区块的属性 可读啊 可写啊什么的
 
//   IMAGE_SCN_TYPE_REG        0x00000000 // Reserved. 
//   IMAGE_SCN_TYPE_DSECT       0x00000001 // Reserved. 
//   IMAGE_SCN_TYPE_NOLOAD       0x00000002 // Reserved. 
//   IMAGE_SCN_TYPE_GROUP       0x00000004 // Reserved. 
#define IMAGE_SCN_TYPE_NO_PAD       0x00000008 // Reserved. 
//   IMAGE_SCN_TYPE_COPY        0x00000010 // Reserved. 
 
#define IMAGE_SCN_CNT_CODE        0x00000020 // Section contains code. 
                           //区段包含代码 
#define IMAGE_SCN_CNT_INITIALIZED_DATA  0x00000040 // Section contains initialized data. 
                           //区段包含已初始化数据 
#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 // Section contains uninitialized data. 
                           //区段包含未初始化数据 
#define IMAGE_SCN_LNK_OTHER        0x00000100 // Reserved. 
#define IMAGE_SCN_LNK_INFO        0x00000200 // Section contains comments 
                           // or some other type of information. 
//   IMAGE_SCN_TYPE_OVER        0x00000400 // Reserved. 
#define IMAGE_SCN_LNK_REMOVE       0x00000800 // Section contents will not become part of image. 
#define IMAGE_SCN_LNK_COMDAT       0x00001000 // Section contents comdat. 
//                    0x00002000 // Reserved. 
//   IMAGE_SCN_MEM_PROTECTED - Obsolete 0x00004000 
#define IMAGE_SCN_NO_DEFER_SPEC_EXC    0x00004000 // Reset speculative exceptions handling bits 
                           // in the TLB entries for this section. 
#define IMAGE_SCN_GPREL          0x00008000 // Section content can be accessed relative to GP 
#define IMAGE_SCN_MEM_FARDATA       0x00008000 
//   IMAGE_SCN_MEM_SYSHEAP - Obsolete 0x00010000 
#define IMAGE_SCN_MEM_PURGEABLE      0x00020000 
#define IMAGE_SCN_MEM_16BIT        0x00020000 
#define IMAGE_SCN_MEM_LOCKED       0x00040000 
#define IMAGE_SCN_MEM_PRELOAD       0x00080000 
 
#define IMAGE_SCN_ALIGN_1BYTES      0x00100000 // 
#define IMAGE_SCN_ALIGN_2BYTES      0x00200000 // 
#define IMAGE_SCN_ALIGN_4BYTES      0x00300000 // 
#define IMAGE_SCN_ALIGN_8BYTES      0x00400000 // 
#define IMAGE_SCN_ALIGN_16BYTES      0x00500000 // Default alignment if no others are specified. 
#define IMAGE_SCN_ALIGN_32BYTES      0x00600000 // 
#define IMAGE_SCN_ALIGN_64BYTES      0x00700000 // 
#define IMAGE_SCN_ALIGN_128BYTES     0x00800000 // 
#define IMAGE_SCN_ALIGN_256BYTES     0x00900000 // 
#define IMAGE_SCN_ALIGN_512BYTES     0x00A00000 // 
#define IMAGE_SCN_ALIGN_1024BYTES     0x00B00000 // 
#define IMAGE_SCN_ALIGN_2048BYTES     0x00C00000 // 
#define IMAGE_SCN_ALIGN_4096BYTES     0x00D00000 // 
#define IMAGE_SCN_ALIGN_8192BYTES     0x00E00000 // 
// Unused                 0x00F00000 
 
#define IMAGE_SCN_LNK_NRELOC_OVFL     0x01000000 // Section contains extended relocations. 
#define IMAGE_SCN_MEM_DISCARDABLE     0x02000000 // Section can be discarded. 
                           //该区段可丢弃 
#define IMAGE_SCN_MEM_NOT_CACHED     0x04000000 // Section is not cachable. 
#define IMAGE_SCN_MEM_NOT_PAGED      0x08000000 // Section is not pageable. 
#define IMAGE_SCN_MEM_SHARED       0x10000000 // Section is shareable. 
                           //该区段可共享 
#define IMAGE_SCN_MEM_EXECUTE       0x20000000 // Section is executable. 
                           //该区段可执行 
#define IMAGE_SCN_MEM_READ        0x40000000 // Section is readable. 
                           //该区段可读 
#define IMAGE_SCN_MEM_WRITE        0x80000000 // Section is writeable. 
                           //该区段可写 
 
最后写个程序把这个结构读出来
由于我比较懒就只读了Name这个成员,有些加壳软件会修改Name这个字段使读出来的东西乱七八糟,比如UPX的压缩壳,会把Name字段改成UPX0,UPX1这样
 
#include "windows.h" 
#include "stdio.h" 
 
int main(int argc, char* argv[]) 

    FILE *p; 
    int i; 
    unsigned long Signature; 
    IMAGE_FILE_HEADER myfileheader; 
    IMAGE_DOS_HEADER mydosheader; 
    IMAGE_OPTIONAL_HEADER myoptionalheader; 
    IMAGE_SECTION_HEADER mysectionheader; 
 
    p = fopen("test.exe","r+b"); 
    if(p == NULL)return -1; 
 
    fread(&mydosheader,sizeof(mydosheader),1,p); 
    fseek(p,mydosheader.e_lfanew,SEEK_SET); 
    fread(&Signature,sizeof(Signature),1,p); 
 
    fseek(p,mydosheader.e_lfanew+sizeof(Signature),SEEK_SET);//指向IMAGE_FILE_HEADER结构的偏移 
    fread(&myfileheader,sizeof(myfileheader),1,p); 
 
    fseek(p,mydosheader.e_lfanew+sizeof(Signature)+sizeof(myfileheader)+sizeof(myoptionalheader),SEEK_SET); 
    printf("Signature          : %04X\n",Signature); 
    printf("IMAGE_SECTION_HEADER       结构:\n"); 
    for(i=0;i<myfileheader.NumberOfSections;i++){ 
        fread(&mysectionheader,sizeof(mysectionheader),1,p); 
        printf("Name               : %s\n",mysectionheader.Name); 
    } 
    fclose(p); 
    return 0; 

资源下载链接为: https://pan.quark.cn/s/ddc62c5d4a5d Windows Mobile 是微软在 0200 年代至 2010 年代初推出的移动操作系统,曾广泛应用于智能手机和平板电脑。开发者可以借助各种库和框架为其开发功能丰富的应用,其中 “32feet.NET” 是一个开源的 .NET 库,专为 .NET Framework 和 .NET Compact Framework 提供蓝牙开发支持。它包含多个命名空间,例如 InTheHand.Devices.Bluetooth、InTheHand.Net.Personal 和 InTheHand.Phone.Bluetooth,用于实现蓝牙设备交互功能。 InTheHand.Devices.Bluetooth 命名空间用于执行基础蓝牙操作,比如扫描附近设备、建立连接以及发现蓝牙服务等。InTheHand.Net.Personal 提供了更高级的功能,例如创建个人区域网络(PAN)、文件传输和串行端口模拟,便于开发者开发跨设备的数据共享应用。而 InTheHand.Phone.Bluetooth 主要针对 Windows Phone 平台,支持蓝牙配对、消息收发和蓝牙耳机控制等功能,不过由于 Windows Mobile 已停止更新,该命名空间更多适用于旧设备或项目。 压缩包中的文件列看似是维基页面的渲染文件,可能是关于 32feet.NET 的使用教程、API 参考或示例代码。文件名如 13632.html、563803.html 等可能是页面 ID,涵盖蓝牙设备搜索、连接和数据传输等不同主题。 使用 32feet.NET 进行蓝牙开发时,开发者需要注意以下几点:首先,确保开发环境已安装 .NET Framework 或 .NET Compact Framework,以及 32feet.NET
资源下载链接为: https://pan.quark.cn/s/d8a2bf0af1ac Mask R-CNN 是一种在实例分割任务中现优异的深度学习模型,它融合了 Faster R-CNN 的目标检测功能和 CNN 的像素级分类能力,能够实现图像中每个目标的定位、识别分割。本指南将指导你如何使用 Mask R-CNN 训练自定义数据集。 你需要准备包含图像(JPEG 或 PNG 格式)和标注文件(XML 或 JSON 格式)的数据集,标注文件需包含物体类别、坐标和掩模信息。数据集应按照 COCO 标准组织,分为训练集、验证集和可选的测试集。可以使用工具如 COCO API 或 labelme 将原始数据转换为 COCO 格式,并确保图像文件名标注文件名一致且在同一目录下。通常按 8:2 或 9:1 的比例划分训练集和验证集。 从提供的压缩包中安装所需库。运行 pip install -r requirements.txt 安装依赖,包括 TensorFlow、Keras、Cython、COCO API 等。 修改 train_test.py 和 test_model.py 中的路径,使其指向你的数据集目录,确保 ROOT_DIR 指向数据集根目录,ANNOTATION_DIR 指向标注文件所在目录。在 config.py 中根据硬件资源和训练目标调整学习率、批大小、迭代次数等参数。 运行 train_test.py 开始训练。训练时会加载预训练权重并进行微调,期间会定期保存模型,便于评估和恢复。 使用 test_model.py 或 test.py 对模型进行验证和测试。这些脚本会加载保存的模型权重,将其应用于新图像并生成预测结果。 预测结果为二进制掩模,需进一步处理为可读图像。可借助 COCO API 或自定义脚本将掩模合并到原始图像上,生成可视化结果。 若模型性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值