获取PE文件的区段表,用的方法是,首先打开CreateFile,然后读取这个文件的DosHeader,

从DosHeader中取e_lfanew这个成员的值,这样就能知道“PE00”的偏移,然后SetFilePointer文件的指针

到e_lfanew + sizeof(IMAGE_NT_SIGNATURE)这个地址,读取FileHeader结构

,从文件头结构中获取NumberOfSections区段的个数,根据区段个数分配够用的缓冲区,

最后SetFilePointer将文件指针从当前位置偏移FileHeader.SizeOfOptionalHeader,进行读取IMAGE_SECTION_HEADER。

OK,搞定。

代码如下:

//清空列表控件
 m_ListCtrlSection.DeleteAllItems();

IMAGE_DOS_HEADER DosHeader = {0};
 IMAGE_FILE_HEADER FileHeader = {0};
 HANDLE  hFile = INVALID_HANDLE_VALUE;
 DWORD  dwReadLen = 0;
 WORD  NumOfSec = 0; //区段表个数
 IMAGE_SECTION_HEADER *pSecHeader = NULL;
 //打开文件
 hFile = CreateFile("C://windows//system32//cmd.exe",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
 if (hFile == INVALID_HANDLE_VALUE)
 {
  MessageBox(_T("无法打开文件,分析失败!"));
  return;
 }
 
 //读取数据
 if (!ReadFile(hFile,&DosHeader,sizeof(DosHeader),&dwReadLen,NULL))
 {
  MessageBox(_T("无法读取文件,分析失败!"));
  return;
 }
 SetFilePointer(hFile,DosHeader.e_lfanew + sizeof(IMAGE_NT_SIGNATURE),NULL,FILE_BEGIN);
 ReadFile(hFile,&FileHeader,sizeof(FileHeader),&dwReadLen,NULL);
 //得出区段个数
 NumOfSec = FileHeader.NumberOfSections;
 //分配区段内存
 DWORD SectionSize = NumOfSec * IMAGE_SIZEOF_SECTION_HEADER;
 char *pSecBuff = new char[SectionSize + 1];
 //移动指针到区段表
 SetFilePointer(hFile,FileHeader.SizeOfOptionalHeader,NULL,FILE_CURRENT);
 ReadFile(hFile,pSecBuff,SectionSize,&dwReadLen,NULL);

//读取完毕,关闭句柄
 CloseHandle(hFile);

int iIndexItem = 0;
 TCHAR tzBuff[10] = {0};
 char szSecName[IMAGE_SIZEOF_SHORT_NAME] = {0};
 //内存数据指针转换
 pSecHeader = (PIMAGE_SECTION_HEADER)pSecBuff;
 for (int i = 0; i < NumOfSec; i++)
 {
  memcpy(szSecName,pSecHeader->Name,8);
  iIndexItem = m_ListCtrlSection.InsertItem(i,(LPCTSTR)szSecName);
  
  //显示VirtualAddress和VirtualSize
  wsprintf(tzBuff,_T("%08X"),pSecHeader->VirtualAddress);
  m_ListCtrlSection.SetItemText(iIndexItem,1,tzBuff);
  wsprintf(tzBuff,_T("%08X"),pSecHeader->Misc.VirtualSize);
  m_ListCtrlSection.SetItemText(iIndexItem,2,tzBuff);
  
  //显示RawAddress和RawData
  wsprintf(tzBuff,_T("%08X"),pSecHeader->PointerToRawData);
  m_ListCtrlSection.SetItemText(iIndexItem,3,tzBuff);
  wsprintf(tzBuff,_T("%08X"),pSecHeader->SizeOfRawData);
  m_ListCtrlSection.SetItemText(iIndexItem,4,tzBuff);

wsprintf(tzBuff,_T("%08X"),pSecHeader->Characteristics);
  m_ListCtrlSection.SetItemText(iIndexItem,5,tzBuff);

//指针后移
  pSecHeader++;
 }
 //释放内存
 if (pSecBuff)
 {
  delete []pSecBuff;
 }

获取PE文件的区段表相关推荐

  1. C++获取PE文件的入口点

    2009-10-07 10:17 C++获取PE文件的入口点 源码: #include "stdafx.h" #include <iostream> #include ...

  2. 图解PE文件实例研究

    一 使用Win32汇编的PE信息查看小工具查看和研究PE文件 PE信息查看工具有多种.下面先使用在<Windows PE权威指南>中所附带的用Win32汇编编写的PE信息查看小工具来查看P ...

  3. [系统安全] 四十一.APT系列(6)Python解析PE文件并获取时间戳判断来源区域

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  4. PE文件病毒实验(二)——实验报告

    实验目的:掌握PE文件格式:理解病毒感染PE文件的原理. 实验内容: (1) 了解PE文件格式. (2) 根据实验步骤,编程实现在PE文件中插入病毒代码.运行插入病毒代码后的PE文件. (3) 编程实 ...

  5. 对PE文件进行十六进制代码(机器码)提取并保存到外部文件

    前言与声明 秉持开源和共享的理念,博主在这里分享自己的代码. 博客中的代码可以将PE文件的十六进制代码(机器码)提取出来,这些机器码可用于机器学习.软件分析等. 声明: 转载请标明来处,创作不易! 代 ...

  6. 对Windows 平台下PE文件数字签名的一些研究

    Windows平台上PE文件的数字签名有两个作用:确保文件来自指定的发布者和文件被签名后没有被修改过.因此有些软件用数字签名来验证文件是否来自家厂商以及文件的完整性,安全软件也经常通过验证文件是否有数 ...

  7. PE文件解析(1):Dos头与NT头

    文章目录 DOS头 NT头 标准NT头 可选NT头 什么是PE文件? PE文件是在windows平台可执行的文件. 包括:.exe(可执行程序),dll(动态链接库).sys(驱动程序) 这是PE文件 ...

  8. [re入门]PE文件小知识

    从PE入手的信息收集,让恶意样本无处可逃 一. PE文件格式的基础知识 1.1 认识PE文件 1.2 整体结构 1.3 基地址 1.4 相对虚拟地址 1.5 文件偏移地址 1.6 结构 1.6.1 D ...

  9. PE文件格式和ELF文件格式(上)----PE文件

    PE文件格式详解 作者:MSDN 译者:李马 Windows NT 3.1引入了一种名为PE文件格式的新可执行文件格式.PE文件格式的规范包含在了MSDN的CD中(Specs and Strategy ...

最新文章

  1. 网络常用命令收藏与整理
  2. html显示本地磁盘 图片,手把手教你为本地磁盘增添背景图片(图解)
  3. 【暖*墟】#逆矩阵# 矩阵求逆的思路与方法
  4. c#获取电脑硬件信息参数说明(硬盘篇 Win32_DiskDrive)
  5. 抖音python广告_抖音上好看的小姐姐,Python给你都下载了
  6. [转]C#与数据结构--树论--平衡二叉树(AVL Tree)
  7. 【Visual C++】游戏开发笔记之八——基础动画显示(二)游戏循环的使用
  8. 移动开发:给安卓软件开发初学者简单的教程
  9. 运营商取消不限量套餐 网友:这是变相涨价
  10. stm32编码器正反转计数程序_第六章:STM32CubeMx 定时器编码器模式基本使用方法...
  11. C语言 判断一个数是否为素数
  12. JdbcTemplate实验
  13. java实现tcp服务器(单线程、多线程)、客户端
  14. 拓端tecdat|R语言有限混合模型聚类FMM、广义线性回归模型GLM混合应用分析威士忌市场和研究专利申请、支出数据
  15. 学堂在线计算机通信网络,第二章 数据通信的基础知识 计算机网络笔记 学堂在线 2.4差错控制...
  16. 如果你的电脑只能安装三个软件, 你会选择哪三个?
  17. IT行业前景怎么样,你还有机会吗?
  18. Server报错:“Starting Tomcat v9.0 Server at localhost` has encountered a problem”(已解决)
  19. Android实现横幅通知
  20. 京东/淘宝的手机销售榜(前4名 -- 手机品牌 --手机型号*3 --手机分辨率 -- 手机操作系统 --安卓版本号)...

热门文章

  1. MVP+WCF+三层结构搭建项目框架(上)
  2. Python--12 内嵌函数和闭包
  3. 《OpenGL超级宝典》编程环境配置
  4. 遍历XML引擎版本以适应代码
  5. 网络安全-windowserver搭建DHCP服务器
  6. HarmonyOS之深入解析图像的位图操作和属性解码
  7. 2019年第十届蓝桥杯 - 省赛 - C/C++大学A组 - D. 迷宫
  8. 216. Combination Sum III 组合总和 III
  9. 167. Two Sum II - Input array is sorted 两数之和 II - 输入有序数组
  10. 76. 最小覆盖子串