IMAGE_DOS_HEADER      size   0x40

e_lfanew                           0xe0

当中有0xA0的间隔数据。

IMAGE_NT_HEADERS        size  0xf8

Section Header紧接着NT_HEADERS

通过IMAGE_NT_HEADERS结构中的Section Number,解析所有的Section Header

每个Section Header中记录了Section Data的真实文件偏移与Section Data Size。

这里有一个奇怪的问题,按道理来说,Section Header后紧接着就是Section Data,但在我的测试文件中,却不是,Section Header完成后文件偏移为0x2f0,而最开始有数据的Section Data起始偏移是在0x400,这中间差了不少了,具体存放了什么数据,没有找到说明。

不过分析Section Data的偏移以及大小发现,Section Data数据后没有其它数据了,SectionData是文件最后的数据。

现在总结下,问题就两个:

1、 Section Header与Section Data中间的数据是什么?

2、 Section Data数据如何解析?

整理下最终的exe文件结构布局

IMAGE_DOS_HEADER

空闲部分

IMAGE_NT_HEADERS                    地址为 IMAGE_DOS_HEADER中e_lfanew字段值

IMAGE_SECTION_HEADER

IMAGE_SECTION_HEADER

IMAGE_SECTION_HEADER              Section Header数量通过IMAGE_NT_HEADERS 中的FileHeader.NumberOfSections确定

未知

SectionData

Section Data                                     这里的数据通过IMAGE_SECTION_HEADER记录的文件指针偏移以及大小读取

示例C代码:

#include<iostream>

#include<Windows.h>

#include<vector>

int main(intargc,char** argv)

{

FILE*fp = fopen(argv[1],"rb");

if(!fp)

{

std::cerr<<"Readfile error!\n";

return-1;

}

fseek(fp,0,SEEK_END);

intiLen = ftell(fp)+1;

fseek(fp,0,SEEK_SET);

char*pC = new char[iLen];

intiRead = fread(pC,1,iLen,fp);

fclose(fp);

//解析

IMAGE_DOS_HEADER*                m_pDOSHeader= (IMAGE_DOS_HEADER*)(pC);

intiDosHeaderSize = sizeof(IMAGE_DOS_HEADER);

IMAGE_NT_HEADERS*                m_pNTHeaders32= (IMAGE_NT_HEADERS *) ((BYTE*)m_pDOSHeader +

m_pDOSHeader->e_lfanew);

intiNTHeaderSize = sizeof(IMAGE_NT_HEADERS);

intiSectionStart = m_pDOSHeader->e_lfanew + iNTHeaderSize;

std::vector<IMAGE_SECTION_HEADER*>vecSectionHeaders;

for(inti=0; i<m_pNTHeaders32->FileHeader.NumberOfSections; i++)

{

IMAGE_SECTION_HEADER*pSectionHeader = (IMAGE_SECTION_HEADER*)((BYTE*)m_pDOSHeader +

iSectionStart+ i*sizeof(IMAGE_SECTION_HEADER));

vecSectionHeaders.push_back(pSectionHeader);

}

intiCurPos = iSectionStart +m_pNTHeaders32->FileHeader.NumberOfSections*sizeof(IMAGE_SECTION_HEADER);

return0;

}

exe解析的更多相关文章

  1. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q115-Q117)

    Question 115You create a timer job.You need to debug the timer job.To which process should you attac ...

  2. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q54-Q56)

    Question 54You create custom code to import content to SharePoint sites.You create a custom site def ...

  3. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q40-Q44)

    Question 40You need to send a single value from a consumer Web Part to a provider Web Part.Which int ...

  4. c# 借助cmd命令解析apk文件信息

    借助aapt.exe文件 aapt.exe 解析apk包信息cmd命令: aapt dump badging *.apkaapt d badging *.apk >1.txt(保存成1.txt文 ...

  5. QQ网页链接打开本地QQ.exe原理

    一.观察现象 QQ推广上有相关文档 http://shang.qq.com/v3/widget.html 新建一个html,点击链接就会启动本地QQ. <html> <body> ...

  6. PHP中VC6、VC9、TS、NTS版本的区别与用法详解

    Thread safe(线程安全)是运行在Apache上以模块的PHP上,如果你以CGI的模式运行PHP,请选择非线程安全模式(non-thread safe). 1. VC6与VC9的区别: VC6 ...

  7. [Android Pro] Android签名与认证详细分析之一(CERT.RSA剖析)

    转载自:http://www.thinksaas.cn/group/topic/335450/ 一.Android签名概述 我们已经知道的是:Android对每一个Apk文件都会进行签名,在Apk文件 ...

  8. win2003 服务器安全设置详细介绍

    第一步:一.先关闭不需要的端口  我比较小心,先关了端口.只开了3389 21 80 1433(MYSQL)有些人一直说什么默认的3389不安全,对此我不否认,但是利用的途径也只能一个一个的穷举爆破, ...

  9. PHP版本中的VC6,VC9,VC11,TS,NTS区别

    以windows为例,看看下载到得php zip的文件名 php-5.4.4-nts-Win32-VC9-x86.zip VC6:legacy Visual Studio 6 compiler,是使用 ...

随机推荐

  1. InputStream中read()与read(byte[] b)

    原文:InputStream中read()与read(byte[] b) read()与read(byte[] b)这两个方法在抽象类InputStream中前者是作为抽象方法存在的,后者不是,JDK ...

  2. RVCT的Linux环境变量配置 ARM® RVDS™ 4.1(b713)

    下载解压 armrvds.tar.gz到/opt 下 在自己的build.sh下导入RVCT的环境变量配置ARM® RVDS™4.1(b713): export ARMROOT=/opt/armrvd ...

  3. 教程:查找内存泄漏 (JavaScript)

    本主题带领您完成使用 JavaScript 内存分析器确定并修复简单内存问题的过程.在本教程中,我们创建一个生成大量数据的应用程序.我们预期在导航到新页时该应用程序会释放数据.  说明 JavaScr ...

  4. Revit 2015 API 的全部变化和新功能

    这里从SDK的文章中摘录出全部的API变化.主要是希望用户用搜索引擎时能找到相关信息: Major changes and renovations to the Revit API APIchange ...

  5. c语言:链表排序, 链表反转

    下面将实现链表排序的排序和遍历显示功能: 所定义的链表结构如下: head -> p1 -> p2 ->p3 ->....->pn; head的本身不作为数据节点,hea ...

  6. QQ登录-第三方SDK的接入总结

    由于项目的需要,使用了[QQ登录]SDK 的相关功能!   1.集成[QQ登录]SDK   [QQ登录]SDK下载地址: http://wiki.open.qq.com/wiki/website/SD ...

  7. WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化

    原文:WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化 [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制 ...

  8. 基于visual Studio2013解决面试题之1409基数排序

     题目

  9. LoadRunner监控数据库服务器

    使用LoadRunner的数据库服务器资源监控器,可以在场景或会话步骤运行期间监控DB2.Oracle.SQL Server或Sybase数据库的资源使用率.在场景或会话步骤运行期间,使用这些监控器可 ...

  10. net core VS goang web

    asp.net core VS goang web[修正篇] 先前写过一篇文章:http://www.cnblogs.com/gengzhe/p/5557789.html,也是asp.net core ...