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. jQuery手写几个常见的滑动下拉菜单 分分秒秒学习JS

    一般的企业网站再我们再实际工作中,有些特效,用jQuery来做,显得极其简单,除非一些大的公司,需要封装自己的类. 今天,我们讲解jQuery入门知识,来写几个简单jQuery滑动下拉菜单.感受一下j ...

  2. Android studio gradle配置

    什么是Gradle? Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言. gr ...

  3. Android FindMyPhone功能模块的实现

    类似iPhone手机上面“查找我的iPhone” 1. 手机定位 需要考虑到国内和国外,国内使用百度地图,国外使用google地图,两种地图,属于不同的坐标系. 手机这边为了避免不同坐标系的问题,直接 ...

  4. servlet的filter的使用

    一.概述 过滤器是servlet的一个重要特性,它提供一种机制,允许在过滤器中,即可以修改浏览器的请求信息,也可以对服务器处理后的响应信息进行修改. 一个过滤器是一个实现了Filter接口的java类 ...

  5. mysql事务和锁InnoDB(转)

    背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文,准备 ...

  6. zookeeper 之znode 节点

    <pre name="code" class="html">使用 ls 命令来查看当前 ZooKeeper 中所包含的内容: [zk: 10.77. ...

  7. spring+mybatis利用interceptor(plugin)兑现数据库读写分离

    使用spring的动态路由实现数据库负载均衡 系统中存在的多台服务器是"地位相当"的,不过,同一时间他们都处于活动(Active)状态,处于负载均衡等因素考虑,数据访问请求需要在这 ...

  8. 用c++开发基于tcp协议的文件上传功能

    用c++开发基于tcp协议的文件上传功能 2005我正在一家游戏公司做程序员,当时一直在看<Windows网络编程> 这本书,把里面提到的每种IO模型都试了一次,强烈推荐学习网络编程的同学 ...

  9. Android播放音乐时跳动的屏谱demo

    Android实现播放音频时的跳动频谱,并实现可以调节的均衡器. Main.java package com.wjq.audiofx; import android.app.Activity; imp ...

  10. linux命令:使用man, 导出man

    要查一个命令怎么使用,使用"man 命令", eg: man find, man ls; "info 命令"貌似也可以看, info find, info ls ...