PE信息获取工具

 用TC写了一个简单的PE信息获取工具(TC2.0编译通过)。在命令行下输入:命令  文件路径  即可查看PE文件的相关信息。

头文件:fstruct.h

/*{ DOS 头部结构定义 }*/
#include<stdio.h>
#include<stdlib.h>

typedef unsigned short WORD;
typedef unsigned long  LONG;
typedef unsigned long DWORD;
typedef char BYTE;
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
#define IMAGE_SIZEOF_SHORT_NAME 8 

typedef struct _FIMAGE_DOS_HEADER 
{
   WORD   e_magic;                         /* 魔术数字    ASCII字符MZ                 0x00000000-0x00000001 */
    WORD   e_cblp;                          /* 文件最后页的字节数                      0x00000002-0x00000003 */
    WORD   e_cp;                            /* 文件页数                                0x00000004-0x00000005 */
    WORD   e_crlc;                          /* 重定位元素个数                          0x00000006-0x00000007 */
    WORD   e_minalloc;                      /* 所需的最小附加段                        0x0000000A-0x0000000B */
    WORD   e_maxalloc;                      /* 所需的最大附加段                        0x0000000C-0x0000000D */
    WORD   e_ss;                            /* 初始的堆栈段(SS)相对偏移量值            0x0000000E-0x0000000F */
    WORD   e_sp;                            /* 初始的堆栈指针(SP)值                    0x00000010-0x00000011 */
    WORD   e_csum;                          /* 校验和                                  0x00000012-0x00000013 */
    WORD   e_ip;                            /* 初始的指令指针(IP)值                    0x00000014-0x00000015 */
    WORD   e_cs;                            /* 初始的代码段(CS)相对偏移量值            0x00000016-0x00000017 */
    WORD   e_lfarlc;                        /* 重定位表在文件中的偏移地址              0x00000018-0x00000019 */
    WORD   e_ovno;                          /* 覆盖号                                  0x0000001A-0x0000001B */
    WORD   e_res[4];                        /* 保留字(一般都是为确保对齐而预留)        0x0000001C-0x00000023 */
    WORD   e_oemid;                         /* OEM 标识符(相对于 e_oeminfo)            0x00000024-0x00000025 */
    WORD   e_oeminfo;                       /* OEM 信息,即 e_oemid 的细节             0x00000026-0x00000027 */
    WORD   e_res2[10];                      /* 保留字(一般都是为确保对齐而预留)        0x00000028-0x0000003B */
    LONG   e_lfanew;                        /* 新 exe 头在文件中的偏移地址             0x0000003C-0x0000003F */
} FIMAGE_DOS_HEADER, *FPIMAGE_DOS_HEADER;  

/*文件头定义*/
typedef struct _FIMAGE_FILE_HEADER {
    WORD Machine;
    WORD NumberOfSections;
    DWORD TimeDateStamp;
    DWORD PointerToSymbolTable;
    DWORD NumberOfSymbols;
    WORD SizeOfOptionalHeader;
    WORD Characteristics;
} FIMAGE_FILE_HEADER, *FPIMAGE_FILE_HEADER;


typedef struct _FIMAGE_DATA_DIRECTORY {
    DWORD VirtualAddress;
    DWORD Size;
} FIMAGE_DATA_DIRECTORY,*FPIMAGE_DATA_DIRECTORY;

 

/*可选映像头*/
typedef struct _FIMAGE_OPTIONAL_HEADER {
    WORD    Magic;
    BYTE    MajorLinkerVersion;
    BYTE    MinorLinkerVersion;
    DWORD   SizeOfCode;
    DWORD   SizeOfInitializedData;
    DWORD   SizeOfUninitializedData;
    DWORD   AddressOfEntryPoint;
    DWORD   BaseOfCode;
    DWORD   BaseOfData;
    DWORD   ImageBase;
    DWORD   SectionAlignment;
    DWORD   FileAlignment;
    WORD    MajorOperatingSystemVersion;
    WORD    MinorOperatingSystemVersion;
    WORD    MajorImageVersion;
    WORD    MinorImageVersion;
    WORD    MajorSubsystemVersion;
    WORD    MinorSubsystemVersion;
    DWORD   Win32VersionValue;
    DWORD   SizeOfImage;
    DWORD   SizeOfHeaders;
    DWORD   CheckSum;
    WORD    Subsystem;
    WORD    DllCharacteristics;
    DWORD   SizeOfStackReserve;
    DWORD   SizeOfStackCommit;
    DWORD   SizeOfHeapReserve;
    DWORD   SizeOfHeapCommit;
    DWORD   LoaderFlags;     
    DWORD   NumberOfRvaAndSizes;
    FIMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} FIMAGE_OPTIONAL_HEADER32, *FPIMAGE_OPTIONAL_HEADER32;


/*PE Header定义*/
typedef struct _FIMAGE_NT_HEADERS {              /*PE 头结构定义开始                                                  */
    DWORD Signature;                             /*签名(文件类型标志),文件中的偏移量由 DOS 头中的域 e_lfanew 来指定  */
   FIMAGE_FILE_HEADER FileHeader;               /*PE 文件头结构(占用20个字节)                    */
    FIMAGE_OPTIONAL_HEADER32 OptionalHeader;     /*可选头结构(占用224个字节)                                          */
} FIMAGE_NT_HEADERS32, *FPIMAGE_NT_HEADERS32;

int f_dos_head (FILE * pf);
int f_file_head (FILE * pf,int v_offset);

 

 

同名头文件的实现:fstruct.c

#include<stdio.h>
#include<stdlib.h>
#include "fstruct.h"

int f_dos_head(FILE * pf)
{
  FPIMAGE_DOS_HEADER v_dos_head;
  
  rewind(pf);
  v_dos_head=(FPIMAGE_DOS_HEADER)malloc(sizeof(FIMAGE_DOS_HEADER));
  if(v_dos_head==NULL)
  {
   printf("fail!");
   return 0;
  }
  fread(&v_dos_head->e_magic,2,1,pf);
  if(v_dos_head->e_magic == 0x5A4D)
  {
   fseek(pf,60L,SEEK_SET);
    fread(&v_dos_head->e_lfanew,4,1,pf);
    fseek(pf,v_dos_head->e_lfanew,SEEK_SET);
    fread(&v_dos_head->e_magic,4,1,pf);
    if(v_dos_head->e_magic == 0x4550)
    {
     return v_dos_head->e_lfanew;
    }
    else
    {
     printf("not PE header!");
     return 0;
    }
  }
  else
  {
   printf("not a DOS header!");
   return 0;
  }   
}


int f_file_head(FILE * pf,int v_offset)
{
 FPIMAGE_FILE_HEADER v_file_head;
 FPIMAGE_OPTIONAL_HEADER32 v_optional_head;
 v_file_head=(FPIMAGE_FILE_HEADER)malloc(sizeof(FIMAGE_FILE_HEADER));
 v_optional_head=(FPIMAGE_OPTIONAL_HEADER32)malloc(sizeof(FIMAGE_OPTIONAL_HEADER32));
 if(!v_file_head)
 {
  printf("fail!");
  return 0;
 }
 rewind(pf);
 if(!fseek(pf,v_offset+4,SEEK_SET))
 {
  if(fread(v_file_head,20L,1,pf)>0)
  {
   printf("Machine  : %04XH\n",v_file_head->Machine);
   printf("NumberOfSections  : %04XH\n",v_file_head->NumberOfSections);
   printf("TimeDateStamp  : %08lXH\n",v_file_head->TimeDateStamp);
   printf("PointerToSymbolTable  : %08lXH\n",v_file_head->PointerToSymbolTable);
   printf("NumberOfSymbols  : %08lXH\n",v_file_head->NumberOfSymbols);
   printf("SizeOfOptionalHeader  : %04XH\n",v_file_head->SizeOfOptionalHeader);
   printf("Characteristics  : %04XH\n",v_file_head->Characteristics); 
   }
   else
   {
    printf("fail!");
    return 0;
   }
  if(v_optional_head==NULL)
  {
   printf("fail!");
   return 0;
  }
  
  if(fread(v_optional_head,96L,1,pf)>0)
  {
   printf("Magic  : %04XH\n",v_optional_head->Magic);
   printf("MajorLinkerVersion  : %02XH\n",v_optional_head->MajorLinkerVersion);
   printf("MinorLinkerVersion  : %02XH\n",v_optional_head->MinorLinkerVersion);
   printf("SizeOfCode  : %08lXH\n",v_optional_head->SizeOfCode);
   printf("SizeOfInitializedData  : %08lXH\n",v_optional_head->SizeOfInitializedData);
   printf("SizeOfUninitializedData  : %08lXH\n",v_optional_head->SizeOfUninitializedData);
   printf("AddressOfEntryPoint  : %08lXH\n",v_optional_head->AddressOfEntryPoint);
   printf("BaseOfCode  : %08lXH\n",v_optional_head->BaseOfCode);
   printf("BaseOfData  : %08lXH\n",v_optional_head->BaseOfData);
   printf("ImageBase   : %08lXH\n",v_optional_head->ImageBase);
   printf("SectionAlignment  : %08lXH\n",v_optional_head->SectionAlignment);
   printf("FileAlignment  : %08lXH\n",v_optional_head->FileAlignment);
   printf("MajorOperatingSystemVersion  : %04XH\n",v_optional_head->MajorOperatingSystemVersion);
   printf("MinorOperatingSystemVersion  : %04XH\n",v_optional_head->MinorOperatingSystemVersion);
   printf("MajorImageVersion  : %04XH\n",v_optional_head->MajorImageVersion);
   printf("MinorImageVersion  : %04XH\n",v_optional_head->MinorImageVersion);
   printf("MajorSubsystemVersion  : %04XH\n",v_optional_head->MajorSubsystemVersion);
   printf("MinorSubsystemVersion  : %04XH\n",v_optional_head->MinorSubsystemVersion);
   printf("Win32VersionValue  : %08lXH\n",v_optional_head->Win32VersionValue);
   printf("SizeOfImage  : %08lXH\n",v_optional_head->SizeOfImage);
   printf("SizeOfHeaders  : %08lXH\n",v_optional_head->SizeOfHeaders);
   printf("CheckSum  : %08lXH\n",v_optional_head->CheckSum);
   printf("Subsystem  : %04XH\n",v_optional_head->Subsystem);
   printf("DllCharacteristics  : %04XH\n",v_optional_head->DllCharacteristics);
   printf("SizeOfStackReserve  : %08lXH\n",v_optional_head->SizeOfStackReserve);
   printf("SizeOfStackCommit  : %08lXH\n",v_optional_head->SizeOfStackCommit);
   printf("SizeOfHeapReserve  : %08lXH\n",v_optional_head->SizeOfHeapReserve);
   printf("SizeOfHeapCommit  : %08lXH\n",v_optional_head->SizeOfHeapCommit);
   printf("LoaderFlags  : %08lXH\n",v_optional_head->LoaderFlags);
   printf("NumberOfRvaAndSizes  : %08lXH\n",v_optional_head->NumberOfRvaAndSizes);
   }
   else
   {
    printf("fail!");
    return 0;
   }
  return 1;
  }
  else
  {
   printf("fail!");
   return 0;
  }
}


 

主文件:sfile.c

#include<stdio.h>
#include<stdlib.h>
#include "fstruct.h"

int main(int argc,char *argv[])
{
 FILE *pf;
 if(argc>1)
 {
  pf=fopen(argv[1],"rb");
  if(pf==NULL)
  {
   printf("fail\n");
   return 0;
  }
  else
  {
    f_file_head(pf,f_dos_head(pf));
     fclose(pf);
  }
  }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值