当前位置: 首页 > 编程日记 > 正文

PE文件和COFF文件格式分析--MS-DOS 2.0兼容Exe文件段

MS 2.0节是PE文件格式中第一个“节”。其大致结构如下:(转载请指明来源于breaksoftware的csdn博客)

在VC\PlatformSDK\Include\WinNT.h文件中有对MS-DOS 2.0兼容EXE文件头的完整定义

typedef struct _IMAGE_DOS_HEADER {      // DOS .EXE headerWORD   e_magic;                     // Magic numberWORD   e_cblp;                      // Bytes on last page of fileWORD   e_cp;                        // Pages in fileWORD   e_crlc;                      // RelocationsWORD   e_cparhdr;                   // Size of header in paragraphsWORD   e_minalloc;                  // Minimum extra paragraphs neededWORD   e_maxalloc;                  // Maximum extra paragraphs neededWORD   e_ss;                        // Initial (relative) SS valueWORD   e_sp;                        // Initial SP valueWORD   e_csum;                      // ChecksumWORD   e_ip;                        // Initial IP valueWORD   e_cs;                        // Initial (relative) CS valueWORD   e_lfarlc;                    // File address of relocation tableWORD   e_ovno;                      // Overlay numberWORD   e_res[4];                    // Reserved wordsWORD   e_oemid;                     // OEM identifier (for e_oeminfo)WORD   e_oeminfo;                   // OEM information; e_oemid specificWORD   e_res2[10];                  // Reserved wordsLONG   e_lfanew;                    // File address of new exe header} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

这个结构占用0x40个字节,其中我们将主要关注两个成员变量:e_magic和e_lfanew。

以我xp电脑上notepad为例,我们使用UE打开C:\windows\notepad.exe


可以发现IMAGE_DOS_HEADER结构中e_magic对应的数据位0x5A4D(MZ),e_lfanew对应的是0x000000E0。这个两个数据是这个结构体中最需要关心的两个成员变量。幻数(Magic Num)这个概念是用于区分一个格式文件的类型,就像一个人的姓,知道你姓啥之后,就可以明确你是不是我们族人。同样,解析这些文件的程序也会去尝试读取这样的幻数,以确认这个文件符合它要求的。在我所知道的一些格式中,他们的幻数往往是这个格式发明者的名称缩写(或者是格式后缀)。我们这个MS-Dos 2.0兼容EXE文件头中的幻数MZ也是纪念他的发明者,可以想到,这个名字应该不是盖茨,因为MZ和Bill Gates(BG)一点也没关系,也不是Paul Allen(PA),更不可能是销售出生的Steve Ballmer。它是Mark Zbikowski,中文翻译是马克·茨柏克沃斯基。

那么为什么PE格式文件会有个Dos文件头呢?Dos系统时代,有两种(我所知道的,我压根没经历过那个年代)可执行文件格式,一种是.exe为后缀的文件,其结构是MZ格式。另一种是以.com为后缀的文件,其结构是COM格式。从Wiki上对MZ格式的介绍可以看出来,MZ格式要比COM格式要新,MZ格式头中包含了重定向信息(本文第一个图中),且其支持可执行体大于64KiB。如今我们电脑上PE可执行文件的后缀也是.exe,为了让该后缀程序在Dos和Nt间有个过渡,我们需要让Dos系统能知道它不能“正确”执行该Exe文件。于是我们PE可执行文件一开始处便插入了一个MS-Dos 2.0兼容Exe文件头,Dos系统加载我们PE文件时,从一开始读取我们文件,发现是“DOS下可执行程序”,于是成功且顺利的执行我们的程序中DOS系统可执行部分,这部分DOS程序输出“该程序不能在DOS上”执行的提示。

现在我们来看下MS-2.0节结构图和我们结构体的对应关系:

MS-Dos 2.0兼容Exe文件头   对应于IMAGE_DOS_HEADER中e_magic到e_ovno

未使用 对应于 e_res[4],虽说这段没使用,但是我还是觉得这段很有意思的。我在做注册表沙箱时,研究了下某公司的沙箱,可是它的沙箱不让regedit.exe进入沙箱运行,于是我就改了e_res[4]这段数据中部分,从而让修改后的regedit.exe在它的沙箱中运行。为什么呢?很容易想象,“MD5+签名”是安全公司一大“安全准绳”。我改了这个没啥用的数据段,不会影响程序运行,但是会使MD5不同,且签名被破坏。这段地址是(文件起始偏移0x1C)


OEM标志 对应于 e_oemid

OEM信息 对应于 e_oeminfo

OEM信息和PE文件头偏移 之间存在一段空白,这段空白对应于 e_res2[10],这段数据和之前e_res[4]一样,改改也无妨。这段地址是(偏移0x28)


PE文件头偏移 对应于 e_lfanew,其位于0x3C偏移处。

MS-Dos 2.0占位程序和重定向表和未使用数据段如下图,因为我也没仔细研究过这个结构,所以也不能准确区分出哪块是占位程序,哪块是重定向表,哪块是未使用段。

从上面的数据我们可以看到,如果我们程序运行在Dos下,会输出“This program connot be run in Dos mode"。

那么NT系统加载我们的PE可执行程序呢?它不会去执行DOS占位程序,而会跳到PE头位置继续读取和执行。PE头位置就是e_lfanew字段的值,该值是PE头和文件头的之间的偏移量。如本例中就是0x000000E0。我们去该偏移去查看数据


看到PE了么?这个PE是PE头的Magic Num。我会在之后介绍PE文件头及其相关知识。

以上是非常常见的MS-DOS 2.0兼容Exe文件段,似乎有点枯燥。那我们现在思考一个问题,应该很有意思的。MS-DOS 2.0兼容Exe文件段是为了程序在DOS环境下运行时提示“不兼容”。但是目前DOS环境真的很少了,似乎我们真的没必要去纠结于我们的程序是否会在DOS下提示“不兼容”,即使在DOS不能运行,也没什么大不了的——反正功能也用不了。那么这么一大块空间,我们是不是可以放点别的?是的,我们可以。举个例子,我电脑上PPTV有个.ax文件叫(.ax文件就是DirectShow Filters的DLL文件)CoreAVC.ax。它就将它的导入表放在这段空间里!


看到了?导入表是使用了Kernerl32.dll中的LoadLibraryA和GetProcessAddress两个函数。再仔细看,而除了e_magic和e_lfanew两个字段要保证OK外,其他字段和DOS代码空间都可以被利用!那么不禁有人要问,这样做有什么好处呢?首先,减少了PE文件大小(虽然只是那么一点点)。其次,它可以让一些非常强大的分析工具分析出错,比如我电脑上的PE Explorer,因为它足够“较真”,所以它识别不出来该文件的信息。至于原因,我会在之后介绍导入表的时候给出来。这儿再废话几句,研究完PE文件格式,我发现一个道理:标准是标准,即使标准很严谨,但是如果标准实现不完善,那么也会产生各种有趣的漏洞和利用。

贴一下代码

#define DOSMAGIC     0x5A4DBOOL CGetPEInfo::IsMzFile() {size_t unWordSize = sizeof(WORD);ULONG ulFileSize =(ULONG)( m_lpFileEnd - m_lpFileStart );if ( ulFileSize < unWordSize ) {return FALSE;}WORD wMagic = 0;SafeCopy( &wMagic, m_lpFileStart, unWordSize );return (DOSMAGIC == wMagic) ? TRUE : FALSE;
}BOOL CGetPEInfo::GetDOSHeaderInfo() {if ( FALSE == IsMzFile() ) {return FALSE;}size_t unDosHeader = sizeof(IMAGE_DOS_HEADER);memset( &m_DosHeader, 0, unDosHeader );BOOL bSuc = SafeCopy( &m_DosHeader,m_lpFileStart, unDosHeader );if ( FALSE == bSuc ) {_ASSERT(FALSE);}else {m_dwInfoMask |= DOSHEADER;}return bSuc;
}


相关文章:

时间可以是二维的?基于二维时间图的视频内容片段检测 | AAAI 2020

作者 | 彭厚文、傅建龙来源 | 微软研究院AI头条&#xff08;ID: MSRAsia&#xff09;编者按&#xff1a;当时间从一维走向二维&#xff0c;时序信息处理问题中一种全新的建模思路由此产生。根据这种新思路及其产生的二维时间图概念&#xff0c;微软亚洲研究院提出一种新的解决时…

《燃烧的岁月》

温含着优美的文句中&#xff0c;字里行间&#xff0c;透过一层薄薄的纸&#xff0c;牵挂起往事如烟&#xff0c;曾经的努力和成长&#xff0c;透过那以视频同时走过的路&#xff0c;默默无闻&#xff0c;牵挂着的是一句句唯美的文笔&#xff0c;留下情感的诗句文笔&#xff0c;…

PE文件和COFF文件格式分析——签名、COFF文件头和可选文件头1

本文将讨论PE文件中非常重要的一部分信息。&#xff08;转载请指明来源于breakSoftware的CSDN博客&#xff09; 首先说一下VC中对应的数据结构。“签名、COFF文件头和可选文件头”这三部分信息组合在一起是一个叫IMAGE_NT_HEADERS的结构体。 typedef struct _IMAGE_NT_HEADERS6…

遇到bug心寒了?用Enter键即可解决!

本文图片来自网络做程序员难不难&#xff1f;很难&#xff01;做个程序员压力大不大&#xff1f;超级大&#xff01;&#xff01;测试bug时&#xff08;图片来自网络&#xff09;当找到Bug&#xff0c;开始修改的你……&#xff08;图片来自网络&#xff09;那怎么办&#xff1…

8月第1周安全回顾 0Day漏洞成企业最大威胁 应重视网络监听

文章同时发表在&#xff1a;[url]http://netsecurity.51cto.com/art/200708/52822.htm[/url]本周&#xff08;0730至0805&#xff09;安全方面值得关注的新闻集中在安全管理、安全威胁和安全产品方面。安全管理&#xff1a;0Day漏洞***成为企业信息安全的最大威胁新闻&#xff…

最大匹配、最小顶点覆盖、最大独立集、最小路径覆盖(转)

在讲述这两个算法之前&#xff0c;首先有几个概念需要明白&#xff1a; 二分图: 二分图又称二部图&#xff0c;是图论中的一种特殊模型。设G(V,E)是一个无向图&#xff0c;如果顶点V可以分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个…

一种在注入进程中使用WTL创建无焦点不在任务栏出现“吸附”窗口的方法和思路

最近一直在做沙箱项目&#xff0c;在项目快接近结尾的时候&#xff0c;我想给在我们沙箱中运行的程序界面打上一个标记——标识其在我们沙箱中运行的。我大致想法是&#xff1a;在被注入程序的顶层窗口上方显示一个“标题性”窗口&#xff0c;顶层窗口外框外显示一个“异形”的…

转:ASP.NET状态保存方法

ASP.NET状态保存分为客户端保存和服务器端保存两种&#xff1a;使用客户端选项存储页信息而不使用服务器资源的这些选项往往具有最低的安全性但具有最快 的服务器性能&#xff0c;因为对服务器资源的要求是适度的。但是&#xff0c;由于必须将信息发送到客户端来进行存储&#…

时至今日,NLP怎么还这么难!

作者 | 刘知远在微博和知乎上关注自然语言处理&#xff08;NLP&#xff09;技术的朋友&#xff0c;应该都对#NLP太难了#、#自然语言理解太难了#两个话题标签不陌生&#xff0c;其下汇集了各种不仅难煞计算机、甚至让人也发懵的费解句子或歧义引起的笑话。然而&#xff0c;这些例…

Quartz定时任务学习(四)调度器

org.quartz.Scheduler 类层次 作为一个 Quartz 用户&#xff0c;你要与实现了 org.quartz.Scheduler 接口的类交互。在你调用它的任何 API 之前&#xff0c;你需要知道如何创建一个 Scheduler 的实例。取而代之的是用了某个工厂方法来确保了构造出 Sheduler 实例并正确的得到初…

反汇编算法介绍和应用——线性扫描算法分析

做过逆向的朋友应该会很熟悉IDA和Windbg这类的软件。IDA的强项在于静态反汇编&#xff0c;Windbg的强项在于动态调试。往往将这两款软件结合使用会达到事半功倍的效果。可能经常玩这个的朋友会发现IDA反汇编的代码准确度要高于Windbg&#xff0c;深究其原因&#xff0c;是因为I…

项目计划书的内容

1.引言 1.1计划的目的 1.2项目的范围和目标 1.2.1范围描述 1.2.2主要功能 1.2.3性能 1.2.4管理和技术约束 2.项目估算 2.1使用的历史数据 2.2使用的评估技术 2.3工作量、成本、时间估算 3.风险管理战略 3.1风险识别 3.2有关风险的讨论 3.3风险管理计划 3.3.1风险计划 3.3.2风险…

不用写代码就能学用Pandas,适合新老程序员的神器Bamboolib

作者 | Rahul Agarwal译者 | 陆离编辑 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;曾经&#xff0c;你有没有因为学习与使用 Pandas 进行数据检索等操作而感到厌烦过&#xff1f;实现同样的功能&#xff0c;Pandas 给用户提供了很多种方法&…

后海日记(8)

来深圳已经这么长时间了&#xff0c;深圳给我的感觉总体很好&#xff0c;天那么蓝&#xff0c;空气也很清新&#xff0c;总的来说很不错。 努力学习&#xff0c;早日成才。 加油&#xff01;版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 转载于:…

反汇编算法介绍和应用——递归下降算法分析

上一篇博文我介绍了Windbg使用的线性扫描&#xff08;linear sweep&#xff09;反汇编算法。本文我将介绍IDA使用的递归下降&#xff08;recursive descent&#xff09;反汇编算法。&#xff08;转载请指明来源于breaksoftware的csdn博客&#xff09; 递归&#xff08;recursiv…

如何快速get到AI工程师面试重点,这12道题必备!

作者 | JP Tech译者 | 刘畅编辑 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】2020 年的三月春招要来了&#xff0c;现在想要 Get 一个算法工程师的实习或全职机会&#xff0c;已经不是一件易事了。如果现在着手复习&#xff0c;茫茫题海…

金邦黑金刚4G内存 VS Vista系统

我的机器配置是 Intel Core 2 4320CPU 金邦黑金刚2G DDR2 800*2 P965P-DS3主板 N 8600GTS 为什么在Vista中 只识别了3.5G 我升级了主版BIOS 主版最高支持8G,哎结果网上一看&#xff0c;才明白。。。现在的系统不是很好的支持4G的内存。…

程序员的量化交易之路(25)--Cointrader之MarketData市场数据实体(12)

转载需注明出处&#xff1a;http://blog.csdn.net/minimicall&#xff0c;http://cloudtrade.top/ 前面一节我们说到了远端事件。其中&#xff0c;市场数据就属于远端事件。市场数据有什么&#xff1f;我们通过代码来回答这个问题&#xff1a; package org.cryptocoinpartners.…

滴滴开源在2019:十大重点项目盘点,DoKit客户端研发助手首破1万Star

整理 | Jane出品 | AI科技大本营&#xff08;ID&#xff1b;rgznai100&#xff09;2018 年&#xff0c;科技企业纷纷布局开源战略后迎来的第一个“丰收年”。但对滴滴来说&#xff0c;2019 年才迎来其第一波开源小高潮。自2017年滴滴零星开源数个项目后&#xff0c;滴滴开源项目…

PE文件和COFF文件格式分析——签名、COFF文件头和可选文件头2

之前的博文中介绍了IMAGE_FILE_HEADER结构&#xff0c;现在来讨论比较复杂的“可选文件头”结构体。(转载请指明来自breaksoftware的csdn博客)先看下其声明 typedef struct _IMAGE_OPTIONAL_HEADER {//// Standard fields.//WORD Magic;...DWORD BaseOfData; // not e…

9月第1周安全回顾 IM安全威胁严重 企业增加无线安全投入

本文同时发表在&#xff1a;[url]http://netsecurity.51cto.com/art/200709/55180.htm[/url]本周&#xff08;0827至0902&#xff09;安全方面值得关注的新闻集中在安全产品、即时通信安全、无线安全和安全市场。安全产品&#xff1a;Intel vPro技术逐渐升温&#xff0c;关注指…

centos下LAMP之源码编译安装httpd

1 最好先安装组件[rootlocalhost ~]# yum groupinstall additional development [rootlocalhost ~]# yum groupinstall development tool2 安装ap1.5.2r(Apache Portable Runtime),安装apr-util 1.5.4工具[rootlocalhost ~]wget http://mirrors.cnnic.cn/apache//apr/apr-1.5.2…

PE文件和COFF文件格式分析——签名、COFF文件头和可选文件头3

《PE2》中介绍了一些可选文件头中重要的属性&#xff0c;为了全面起见&#xff0c;本文将会讲解那些不是那么重要的属性。虽然不重要&#xff0c;但是还是可以发现很多好玩的情况。首先看一下32位的可选文件头详细定义。&#xff08;转载请指明来源于breaksoftware的CSDN博客&a…

高效决策的三个关键

“领导者的责任&#xff0c;归纳起来&#xff0c;主要是出主意、用干部两件事。”***的这句话高度概括了领导者的关键任务&#xff0c;而这两件事都有一个共同的核心——决策。决策是管理者的天职&#xff0c;与其说这是他们的权力&#xff0c;不如说是一种责任。每一个经理人&…

开发者都想收藏的深度学习脑图,我们抢先曝光了!

可以看到&#xff0c;通过机器学习技术&#xff0c;软件或服务的功能和体验得到了质的提升。比如&#xff0c;我们甚至可以通过启发式引擎智能地预测并调节云计算分布式系统的节点压力&#xff0c;以此改善服务的弹性和稳定性&#xff0c;这是多么美妙。而对移动平台来说&#…

Cookie 位置_无需整理

为什么80%的码农都做不了架构师&#xff1f;>>> Cookie 位置 C:\Users\admin\AppData\Roaming\Microsoft\Windows\Cookies 转载于:https://my.oschina.net/Majw/blog/464018

PE文件和COFF文件格式分析——节信息

在《PE文件和COFF文件格式分析——签名、COFF文件头和可选文件头3》中&#xff0c;我们看到一些区块的信息都有偏移指向。而我们本文讨论的节信息是没有任何偏移指向的&#xff0c;所以它是紧跟在可选文件头后面的。&#xff08;转载请注明来源于breaksoftware的csdn博客&#…

强悍!使用Flash和Silverlight制作控件

Silverlight已经发布了正式版本&#xff0c;我也到网站下载了一个并看看&#xff0c;突然发现了他的例子中包含了这个公司。NETiKA TECH。之所以说他强&#xff0c;是因为他尽然使用Flash和Silverlight制作了仿造WinForm的控件&#xff0c;包括&#xff1a;常见的控件&#xff…

《评人工智能如何走向新阶段》后记(再续8)

由AI科技大本营下载自视觉中国2019.12.13 81.近来一波人工智能热潮是在大数据的海量样本及超强计算能力两者支撑下形成的。所以说这一波人工智能是由大数据喂养出来的。这时的机器智能在感知智能和计算智能等一些具体问题上已经达到甚至超越人类水平&#xff0c;目前在语音识别…

Hadoop集群安全性:Hadoop中Namenode单点故障的解决方案及详介AvatarNode

2019独角兽企业重金招聘Python工程师标准>>> 正如大家所知&#xff0c;NameNode在Hadoop系统中存在单点故障问题&#xff0c;这个对于标榜高可用性的Hadoop来说一直是个软肋。本文讨论一下为了解决这个问题而存在的几个solution。 1. Secondary NameNode 原理&#…