exe解析
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解析的更多相关文章
- Sharepoint学习笔记—习题系列--70-573习题解析 -(Q115-Q117)
Question 115You create a timer job.You need to debug the timer job.To which process should you attac ...
- Sharepoint学习笔记—习题系列--70-573习题解析 -(Q54-Q56)
Question 54You create custom code to import content to SharePoint sites.You create a custom site def ...
- 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 ...
- c# 借助cmd命令解析apk文件信息
借助aapt.exe文件 aapt.exe 解析apk包信息cmd命令: aapt dump badging *.apkaapt d badging *.apk >1.txt(保存成1.txt文 ...
- QQ网页链接打开本地QQ.exe原理
一.观察现象 QQ推广上有相关文档 http://shang.qq.com/v3/widget.html 新建一个html,点击链接就会启动本地QQ. <html> <body> ...
- PHP中VC6、VC9、TS、NTS版本的区别与用法详解
Thread safe(线程安全)是运行在Apache上以模块的PHP上,如果你以CGI的模式运行PHP,请选择非线程安全模式(non-thread safe). 1. VC6与VC9的区别: VC6 ...
- [Android Pro] Android签名与认证详细分析之一(CERT.RSA剖析)
转载自:http://www.thinksaas.cn/group/topic/335450/ 一.Android签名概述 我们已经知道的是:Android对每一个Apk文件都会进行签名,在Apk文件 ...
- win2003 服务器安全设置详细介绍
第一步:一.先关闭不需要的端口 我比较小心,先关了端口.只开了3389 21 80 1433(MYSQL)有些人一直说什么默认的3389不安全,对此我不否认,但是利用的途径也只能一个一个的穷举爆破, ...
- PHP版本中的VC6,VC9,VC11,TS,NTS区别
以windows为例,看看下载到得php zip的文件名 php-5.4.4-nts-Win32-VC9-x86.zip VC6:legacy Visual Studio 6 compiler,是使用 ...
随机推荐
- C# 使用IENUMERABLE,YIELD
C# 使用IENUMERABLE,YIELD 前言 在上篇文章中我得出结论,遍历迭代器修改迭代器中项目的值未生效,是因为使用了yield return,并且每次遍历迭代器都执行返回迭代器的方法.这篇文 ...
- 线程:Message和Runnable
原文地址http://blog.csdn.net/flowingflying/article/details/6370184 程序需要相应用户的操作,最要能在200ms(0.2s)之内,如果超过5秒没 ...
- Windows Phone 8初学者开发—第21部分:永久保存Wav音频文件
原文 Windows Phone 8初学者开发—第21部分:永久保存Wav音频文件 第21部分:永久保存Wav音频文件 原文地址:http://channel9.msdn.com/Series/Win ...
- 基于visual Studio2013解决算法导论之006最大堆排序
题目 最大堆排序 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #i ...
- StreamWrite-StreamRead 读写文本文件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Eclipse用法和技巧二十:一个快速打印技巧
调试的时候经常用到打印语句,当需要添加的说明字符串和需要打印的数值混淆到一起的时候,需要先写字符串如,"the string here is",接着再输入变量的值.这样一来一去还是 ...
- 经典系统windows xp sp3官方原版下载(附XP序列号)
经典系统windows xp sp3官方原版下载(附XP序列号) 在过几日,微软最新的操作系统windows 7就将像外发售了!虽然Vista操作系统已经问世多年,但XP系统仍然占据着王位,在市 ...
- Juuluu 旗下企业站点管理系统3.0.1公布!
KgE金刚企业站点管理系统是广州聚龙软件为国内中小企业开发的一款企业站点管理系统,KgE採用可视化的标签模型,可在Dreamvear等网页编辑下可视化编辑,KgE使用javaeemsyqlyuijqu ...
- 【模式识别】Boosting
Boosting简单介绍 分类中通常使用将多个弱分类器组合成强分类器进行分类的方法,统称为集成分类方法(Ensemble Method).比較简单的如在Boosting之前出现Bagging的方法,首 ...
- Swift - 初始化方法返回nil表示初始化失败
自Swift1.1开始,初始化init方法便有返回nil的能力.我们可以在init声明的时候在其后面加上一个 ? 或者 ! 来表示初始化失败时可能返回nil. 比如,给Int类添加一个将字符串初始化成 ...