PE文件格式-(MS-DOS头部)

特色

每个PE文件是以一个DOS程序开始的,有了它,一旦程序在DOS下执行,DOS就能识别出这是有效的执行体,然后运行紧随MZ  header之后的DOS stub (DOS块)。

平常把 DOS MZ头与 DOS stub 合称为DOS文件头。

PE文件的第一个字节起始于一个传统的MS-DOS头部,被称作 IMAGE_DOS_HEADER  。其IMAGE_DOS_HEADER结构如下所示:

typedef struct _IMAGE_DOS_HEADER {  // DOS下的.EXE文件头
USHORT e_magic;         // 魔数
USHORT e_cblp;          // 文件最后一页的字节数
USHORT e_cp;            // 文件的页数
USHORT e_crlc;          // 重定位
USHORT e_cparhdr;       // 段中头的大小
USHORT e_minalloc;      // 需要的最少额外段
USHORT e_maxalloc;      // 需要的最多额外段
USHORT e_ss;            // 初始的(相对的)SS寄存器值
USHORT e_sp;            // 初始的SP寄存器值
USHORT e_csum;          // 校验和
USHORT e_ip;            // 初始的IP寄存器值
USHORT e_cs;            // 初始的(相对的)CS寄存器值
USHORT e_lfarlc;        // 重定位表在文件中的地址
USHORT e_ovno;          // 交叠数
USHORT e_res[4];        // 保留字
USHORT e_oemid;         // OEM识别符(用于e_oeminfo成员)
USHORT e_oeminfo;       // OEM信息; e_oemid中指定的
USHORT e_res2[10];      // 保留字
LONG   e_lfanew;        // 新exe头在文件中的地址
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

其中有两个字段比较重要,分别是e_magic和e_lfanew.e_magic字段(一个字大小)需要被设置为值5A3Dh,这个值有个#define,名为IMAGE_DOS_SINGNATURE,ASCII表示法里,它的ASCII值为“MZ”,是MS-DOS的最初创建者之一Mark  Zbikowski字母的缩写。e_lfanew字段是真正的PE文件头的相对偏侈(RVA),其指出真正PE头的文件偏移位置,它点用4个字节,位于文件开始偏移3Ch字节中。

用十六进制编辑器(WinHex Hex Workshop等带偏移显示的尤佳)打开一个32位PE程序,定位在文件起始位置处,此处就是MS-DOS头部,如图:

                               查看PE文件 MS-DOS 头部

文件第一个字符:”MZ”就是e_magic字段。偏移3Ch就是e_lfanew的值,显示为”B0000000″.。由于 Intel CPU属于Little-Endian类(逆序),字符储存时低位在前,高位在后,将次序恢复后,e_lfanew的值为000000B0h,这个值就是真正的PE文件头偏移量。

PE文件格式-文件偏移地址

特色

当PE文件储存在磁盘上时,某个数据的位置相对于文件头的偏移量,称为文件偏移地址( File Offset)或物理地址(RAW Offset)。文件偏移地址从PE文件的第一个字节开始计数,起始值为0。用十六进制工具(例如:Hex Workshop 、WinHex等)打开文件显示的地址就是文件偏移地址。

PE文件格式-相对虚拟地址

特色

在可执行文件中,有许多地方需要指定内存中的地址。例如,引用全局变量时,需要指定它的地址。PE文件尽管有一个首选的载入地址(基地址),但是它们可以载入到进程空间的任何地方,所以不能依赖于PE的载入点。由于这个原因,必须有一个方法来指定地址而不依赖于PE载入点的地址。

为了在PE文件中避免有确定的内存地址,出现了相对虚拟地址(Relative Virtual  Adderss,简称RVA)概念。RVA只是内存中的一个简单的相对于PE文件载入地址的偏移位置,它是一个“相对”地址,或称为“偏移量”。例如,假设一个EXE文件从地址400000h处载入,并且它的代码区块开始于401000h,代码区块的RVA将是:

目标地址 401000h-载入地址 400000h=RAV 1000h

将一个RVA换成真实的地址,只是简单地翻转这个过程:将实际的载入地址加上RVA即可得到实际的内存。顺便说一下,在PE用语里,实际的内存地址被称作虚拟地址(Virtual Address,简称VA),另外也可以把虚拟地址想象为加上首选载入地址的RVA。不要忘了前面得到的载入地址等同于模块句柄。它们之间的关系如下:

虚拟地址 (VA) =基础 (ImageBase)+ 相对虚拟地址(RVA)

PE文件格式-基地址(Image Base)

特色

当PE文件通过windows加载器被装入内存后,内在中的版本被称作模块(mode)。映射文件的起始地址被称为模块句柄(hMode),可以通过模块句柄访问内存中其他的数据结构。这个初始内存地址也称为基地址(Image Base)。

基地址的值是由PE文件本身设定的。按照默认设置,用Visual C++建立的EXE文件基地址是00400000h,DLL文件基地址是10000000h。下面看个例子用LordPE打开一个EXE文件,注意红色框内显示的是这个程序的基地址,可以看出这个程序的基地址是按照默认设置的。再来看下DLL文件同样也是用LordPE来打开它看下ImageBase这里也是按照默认设置的。其实,可以在创建应用程序的EXE文件时改变这个地址,方法是在链接应用时使用链接程序/BASE选项,或者链接后通过REBASE应用程序进行设置。

DOS命令建立各种文件夹

大家都知道在图形界面下如果建立文件或文件夹,其实DOS下也可以建立文件夹。不但可以建立普通文件夹还可以建立一些崎形的文件夹。而这些崎形的文件夹是不能对它操作的。DOS下建立文件夹的命令用到的是MD,如想要在哪个分区建立一个文件夹可以输入 x:这里的x为你想要建立文件夹的分区,我这里以f:为例进入这个分区,然后输入md 文件夹名回车就可以看到在这个分区下建立了一个文件夹。这只是建立个普通的文件夹。接下来我们往更深入点学习,建立一个在图形界面下无法建立的崎形文件夹,该文件夹在windows下一般不能访问或删除。如md 文件夹名后面跟三个小点再加上个\就能建立个崎形文件夹。如果要删除要用到rd这个命令,如rd /s /q x:\崎形文件夹名\就可以把它删除了。

 

0 day基础知识之漏洞概述

  bug与漏洞

  随着现代软件工业的发展,软件规模不断扩大,软件内部的逻辑也变得非常复杂。为了保证软件的质量,测试环节在软件生命周期中占的地位已经得到了普遍重视。在一些著名的大型软件公司中,测试环节(QA)所耗费的资源甚至已经超过了开发。即便如此,不论从理论上还是工程上都没有任何人敢声称能够彻底消灭软件中所有的逻辑缺陷–BU G。

在形形色色的软件逻辑缺陷中,有一部分能够引起非常严重的后果。例如,在网站系统中,如果在用户输入数据的限制方面存在缺陷,将会使服务器变成SQL注入攻击和XSS攻击的目标;服务器软件在解析协议时,如果遇到出乎预料的数据格式而没有进行恰当的异常处理,那么就很可能会给攻击者提供远程控制服务器的机会。我们通常把这类能够引起软件一地”超出设计范围的事情“的BUG称为漏洞(vulnerability)

(1) 功能性逻辑缺陷(BUG):影响软件的正常功能,例如,执行结果错误、图标显示错误等。

(2)安全逻辑缺陷(漏泂):通常情况下不响软件的正常功能,但被攻击者成功利用后,有可能引起软件去执行额外的恶意代码。常见的漏洞包括软件中的缓冲区溢 出漏洞、网站中的跨站脚本漏洞(XSS)、SQL注入漏洞等。

 

PE文件格式之基本概念

PE文件使用的是一个平面地址空间,所有代和数据都被合并在一起,组成一个很大的结构。文件的内容被分割为不同的区块(Section ,又称区段、节等)区中包含代码或数据,各个区块按页边界来对齐,区块没有大小限制,是一个连续结构。每个块都有它自己在内在中的套属性,比如这个块是否包含代码、是否读写或可读/写等。

PE文件不是作为单一内存映射文件被装入内存是很重要的。windows加载器(又称PE装载器)遍历PE文件并决定文件的哪一部分被映射,这映射方式是将文件较高的偏移位置映射到较高的内存地址中。当磁盘文件一旦被载入内存中,磁盘上的数据结构布局和内存的数据结构布局是一致的。这样知道在磁盘的数据结构中寻找一些内容,那么几乎都能在被装入到内存映射文件中找到相同的信息。但数据之间的相对位置可能改变,其某项的偏移地址可能区别于原始的偏移位置

纯手工加密文件夹

关于这个用到的并不是网络上的一些加密工具,而是windows系统自带的一些DOS命令工具,很简单。下面开始这个话题的正题

先要找到你想要加密的文件夹,找到之后,在开始菜单里找到运行,输入CMD进入DOS窗口,进入你要加密的文件夹所在盘符。(注:文件夹的名称最好是英文的这样在输入时方便些。)如:c:\Documents and Setting\Administrator>f:  回车就可以进入你所要加密的文件夹所在的盘符,c:\Documents and Setting\Administrator>这个是你在运行里输入CMD回车后显示的,有些可能不同,仅以自已那显示的为准。然后输入cacls这个命令,{calcls 文件夹名 参数}(注:用这个命令时请查看盘符是什么格式的如NTFS格式,如果不是这种请改成这种格式)如 cacls xg  /t /e /c /d everyone  ,这时文件夹已经被加了密,此时文件夹是打不开的,若是打开会提示拒绝访问,要想要删除也会提示无法删除:访问被拒绝。那么想要还原未加密状态怎么办了。别急,加密和解密用到的都是这一个命令,输入 cacls xg /t /e /c /r everyone,些时文件夹又恢复到原来的状态。如果不想每次都手工输入这么麻烦的话,可以在文件夹所在盘符下建个批处理,以达到快速加密与解密。

这只是手工加密的一小部分,后面还有更加强大的方法,以后我会在后面的日子给大家奉献上来的。希望大家多光临。(by alan)

博客精神

    以前想了很久,一直想要开个自己的个人网站,前几天的一些偶然机会,我开通了博客,正好圆了我多年开网站的梦,我建的这个博客是讨论计算机科学技术方面的一些研究和讨论,希望能多结交一些志同道合的一些朋友,希望能和各位大虾一起共同进步,共同学习。相互认识,OK这写到。以后我多发表一些计算机方面的文章。