手工构造典型PE文件

合集下载

手写PE文件(不借助编译器,用十六进制数进行编写)

手写PE文件(不借助编译器,用十六进制数进行编写)

⼿写PE⽂件(不借助编译器,⽤⼗六进制数进⾏编写)这⼏天在看科锐钱⽼师有关PE⽂件的视频,感觉通过⼿写PE⽂件确实能增加对PE⽂件的了解,对结构也能更加熟悉,所以⾃⼰实操了下。

由于平时分析时,都是借⽤CFF等PE⽂件分析⼯具,对很多结构⾥⾯的成员的具体含义也不清楚,⼿写下来还是有点费劲的,写完之后对PE⽂件也清楚了很多。

主要⽤到的⼯具有WinHex(⽤来主要编写),OD(主要看加载到内存后是否符合⾃⼰预期,以及调试功能),CFF⼩辣椒(在整体结构,起码是头的数据框架完全出来前,最好先别⽤,⾃⼰去查下各⾃的成员所代表的含义)记住⼤概的间隔,可以快速得到PE⽂件的相关数据:当⽂件内容以16字节排列开时:DOS头:0x40=64字节长度,占4⾏空间数据;前2字节的e_magic成员"MZ"标记代表其是DOS可执⾏⽂件,为第4排往回数4字节数据e_lfanew成员,为距离NT头的偏移,两者相加得到NT头位置。

NT头:0xF8=248字节长度,占15⾏半空间数据;1.NT头的PE标记,占4字节2.⽂件头:占0x14=20字节,占1⾏4个数据;第⼀个word数据代表运⾏平台(CPU类型0x14C为X86、0x200为Intel Itanium、0x8664为X64)、第⼆个word代表着该PE⽂件的节表个数,中间为参考下数据,可填CC,倒数第⼆个word为可选PE头的⼤⼩,最后⼀个word为该⽂件的属性(1固定基址 2可执⾏⽂件 4删除COFF⾏号 8删除COFF符号表 0x20处理2G以上的地址 100⽀持32位 200⽆调试信息 400映射到可执⾏⽂件 800映射到⽹络 1000映射系统⽂件 2000 DLL⽂件 4000仅在单处理器运⾏属性值由上述⼗六进制数进⾏&处理得到)3.可选⽂件头:共占0xE0=224字节,占14⾏数据;其中可选PE头分别由0x60=96字节的普通成员和0x78=120的数组数据还有8字节的0组成3.1可选⽂件头成员:0x60=96字节,第⼀个word数据为标记字(0x0107为ROM 映像,0x010B为普通可执⾏⽂件)、第5字节的dword为程序的代码长度、第⼆⾏的第⼀个dword为OEP(RVA),即原始⼊⼝点位置、最后⼀个dword为程序加载的⽬标基址第三⾏前2个dword分别分内存对齐⼤⼩和⽂件对齐⼤⼩第四⾏第⼀个word为要求最低⼦系统版本的主版本号(如下图)、倒数第⼆个dword为程序的映射⼤⼩、倒数第⼀个dw ord为程序的头部⼤⼩(各种头+节表的总⼤⼩)第五⾏第5字节的word为可执⾏⽂件期望的⼦系统(1驱动程序2窗⼝程序3控制台程序(DLL)等..)、后⼀个word为Dllmain( )函数被调⽤的时机(默认为0)、后⾯接的4个dword(跨越到第六⾏)分别为栈保留、栈提交,堆保留,堆提交的值 (保0留即为有多少(银⾏有多少钱),提交即为⽤多少(你取多少钱))3.2数据结构:占0x80=128字节,共有16个元素,每个元素占8字节长度数据(先地址(RVA)后长度),其中最后⼀项为未使⽤元素,可设为CC(由于这⾥为⼿写PE,没有太多功能,所以只填写了导⼊表的位置,以便系统能找到调⽤函数的位置)即可节表:占0x28=40字节,2⾏半的数据;前8字节为节名(⾮必须)、最后16字节的4个dword分别为内存⼤⼩、内存起点、⽂件⼤⼩、⽂件起点,数据末尾的4字节为节属性以上,⽂件头(可选PE头->SizeOfHeaders)全部编写完,占0x138(图⽚上的是因为DOS头最后的成员为F8,最⼩为40),对齐后,⽂件头独占⼀页空间(此时为0x200对齐)接下来在下⼀页的空间中填充信息,记得区分⽂件中的页和内存中的页的⼤⼩导⼊表张⼀⾏半,前4字节为INT表地址,当INT表为0时,导⼊表以IAT(第⼆⾏第1个dword)为线索寻找函数地址,注意,这⾥的地址,全是RVA,⽽且是IAT表的位置,表⾥⾯再存放着相应的函数信息。

逆向分析实验2PE文件结构分析

逆向分析实验2PE文件结构分析

实验二PE文件结构分析一. 实验目的1.了解PE文件的输入表结构;2.手工解析PE文件的输入表;3.编程实现PE文件输入表的解析。

二. 实验内容1.第一步:手动解析输入表结构(1)使用工具箱中的工具e verything,寻找当前系统中任意一个e xe文件,文件名称是: actmovie.exe(2)使用LordPE“PE编辑器”打开exe文件,确定输入表的RVA,截图如下(图1):(3)点击PE编辑器右侧的“位置计算器”,得到文件偏移值,截图如下(图2):(4)使用16进制编辑工具,跳转到相应的输入文件偏移地址,输入表是每个IID对应一个DLL,根据IID大小,这里取20字节的数据进行分析,将输入表第一个IID结构的数据与IID结构体的成员一一对应,具体如下所示:IMAGE_IMPORT_DESCRIPTOR {OriginalFirstThunk = 000013C0TimeDateStamp = FFFFFFFFForwarderChain = FFFFFFFFName = 000014C0FirstThunk = 0000100C}(5)关注OriginalFirstThunk和Name两个成员,其中Name是一个RVA,用步骤(3)的方法得到其文件偏移值为 000008C0 ,在16进制编辑工具转到这个偏移地址,可见输入表的第一个D LL名为 msvcrt.dll ,截图如下(图3):(6)分析一下OriginalFirstThunk,它指向一个类型为IMAGE_THUNK_DATA的数组,上面已经分析出了它的值为000013C0 ,这是一个RVA,用步骤(3)的方法得到文件偏移地址 00007C0 。

在16进制编辑工具转到这个偏移地址,其中前面4个字节的数据为 63 5F 00 C8 ,截图如下(图4):(7)可以看出,这是以序号(填“以名字”或“以序号”)的方式输入函数;用与步骤(3)相同的方式在16进制编辑工具中对应IMAGE_IMPORT_BY_NAME结构的数据,可以看到函数的输入序号为 20 ,函数名为 cexit ,截图如下(图5):(8)验证:使用L ordPE单击“目录表”界面中输入表右侧的“…按钮”,打开输入表对话框,可以验证获取的DLL名和函数名是否正确。

PE文件结构(二)

PE文件结构(二)

l
// Pe.h: 定义CPe类
//
#ifndef _PE_H__INCLUDED
#define _PE_H__INCLUDED
#include <io.h>
#include <fcntl.h>
#include <sys\stat.h>
typedef struct PE_HEADER_MAP
经过3层IMAGE_RESOURCE_DIRECTORY_ENTRY(一般是3层,也有可能更少些)最终可以找到一个IMAGE_RESOURCE_DATA_ENTRY结构,这个结构中存有相应资源的位置和大小。这个结构长16个字节,有4个参数,其原型如下:
l
typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
标识一个IMAGE_RESOURCE_DIRECTORY_ENTRY一般都是使用Id,就是一个整数。但是也有少数使用IMAGE_RESOURCE_DIR_STRING_U来标识一个资源类型。这个结构定义如下:
typedef struct _IMAGE_RESOURCE_DIR_STRING_U {
class CPe
{
public:
CPe();
virtual ~CPe();
public:
void CalcAddress(const void *base);
void ModifyPe(CString strFileName,CString strMsg);
void WriteFile(CString strFileName,CString strMsg);
BOOL WriteNewEntry(int ret,long offset,DWORD dwAddress);

手工构造最小的pe

手工构造最小的pe

手工构造最小的pe标题:可能是最小的 pe 程序 -- 我手工构造了一个 pe 程序, 只 305 个字节, 可正确执行(Win9x). .. (5千字)发信人:王涛1234时间:2002-3-2 20:06:17详细信息:标题: 可能是最小的 pe 程序 -- 我手工构造了一个 pe 程序, 只 305 个字节, 可正确执行(Win9x).内容:世界最小的 pe 程序我手工构造了一个 pe 程序, 只 305 个字节,可以在我的中文 windows98 第一版下正确运行. 是不是够得上陆麟大侠所说的"世界最小的 pe 程序",我也不能确定. 传上来, 大家看着玩玩吧. 用手工构造,没用任何编译软件.可能对大家理解 pe 文件格式有用. 要知道, pe 程序格式可是 "瘟都死" 操作系统的主要程序文件格式呀.如果有哪位高人能给我减少几个字节,我将向他学习.以下就是软件的全部字节: 共 305 个字节.用 ultraedit 等十六进制编辑软件新建一个十六进制文件,全填 00 ,大小 305 个字节,再按照以下内容修改好,存盘,改名为 minipe.exe 即可. 每行的 ":" 号及前面的数字是十六进制地址,每行的后面是文本显示,不是软件内容,不应写入软件,我想大家应该明白.如果此贴较乱,把您的查看器的字体设小一点就行了.以下是软件全部内容:00000000: 4D 5A 50 00-02 00 00 00-04 00 0F 00-50 45 00 00 MZP PE00000010: 4C 01 01 00-00 00 00 00-00 00 00 00-00 00 00 00 L00000020: E0 00 8E 81-0B 01 00 00-C0 50 00 00-00 00 00 00 ?巵繮00000030: 00 00 00 00-30 11 00 00-00 10 00 00-0C 00 00 00 000000040: 00 00 40 00-00 10 00 00-30 01 00 00-01 00 00 00 @ 000000050: 00 00 00 00-04 00 00 00-00 00 00 00-00 60 00 00 `00000060: 30 01 00 00-3D CE 00 00-02 00 00 00-00 00 01 00 0 =?00000070: 00 20 00 00-00 00 01 00-00 10 00 00-00 00 00 0000000080: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 0000000090: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00000000A0: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00000000B0: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00000000C0: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00000000D0: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00000000E0: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00000000F0: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 0000000100: 00 00 00 00-43 4F 44 45-00 00 00 00-00 50 00 00 CODE P00000110: 00 10 00 00-01 00 00 00-30 01 00 00-00 00 00 00 000000120: 00 00 00 00-00 00 00 00-20 00 00 E0-00 00 00 00 ?00000130: C3以下是软件内部各个项目的详细信息,供大家研究时参考:minipe.exe (hex) ( dec).EXE size (bytes) 250 592Minimum load size (bytes) 300 768Overlaynumber 0 0Initial CS:IP 0000:0000InitialSS:SP 0000:014C 332 Minimum allocation (para) F 15Maximum allocation (para) 4550 17744Header size (para) 4 4Relocation table offset 0 0Relocationentries 0 0Portable Executable starts at cSignature 00004550 (PE)Machine 014C (Intel 386)Sections 0001Time Date Stamp 00000000 Wed Dec 31 19:00:00 1969SymbolTable 00000000Number of Symbols 00000000Optional headersize 00E0Characteristics 818EExecutable ImageLine numbers strippedLocal symbols strippedBytes of machine word are reversed32 bit word machineBytes of machine word are reversedMagic 010BLinker Version 0.00Size of Code 000050C0 Size of Initialized Data 00000000Size of Uninitialized Data 00000000Address of Entry Point 00001130Base of Code 00001000 Base of Data 0000000C Image Base 00400000 SectionAlignment 00001000FileAlignment 00000130 Operating System Version 1.00Image Version 0.00Subsystem Version 4.00 reserved 00000000 Image Size 00006000Header Size 00000130 Checksum 0000CE 3DSubsystem 0002 (Windows)DLL Characteristics 0000 Size Of Stack Reserve 00010000Size Of Stack Commit 00002000Size Of Heap Reserve 00010000Size Of Heap Commit 00001000Loader Flags 00000000 Number of Directories 00000000DirectoryName VirtAddr VirtSize -------------------------------------- -------- --------Section Table-------------01 CODE Virtual Address 00001000Virtual Size 00005000Raw Data Offset 00000130Raw Data Size 00000001Relocation Offset 00000000 Relocation Count 0000Line Number Offset 00000000 Line Number Count 0000 Characteristics E0000020 CodeExecutableReadableWriteableDisassembly00401000 C3 ret。

DIYpe制作教程

DIYpe制作教程

DIY(一):一、增减外置程序(注:以修改老毛桃0325版为例,下同)外置程序在老毛桃WinPE光盘的“外置程序”目录中,对应的配置文件是该目录下的WinPE.INI.删除程序只须删除该软件在外置程序目录对应的子目录,再删除WinPE.INI中相应的LINK创建快捷方式的语句行即可。

添加程序正好相反,将绿色软件放到外置程序目录中,在WinPE.INI中加入相应的LINK语句行创建快捷方式即可(参照其它LINK语句,复制一行,只须更改一下快捷方式的位置、名称/目标程序的目录名、可执行文件名)。

实际上很多并不是为WinPE准备的软件也是可以在WinPE中运行的,用一个笨办法来判断一个普通的绿软是否可以直接在WinPE中运行,启动WinPE环境,找到该软件所在目录,复制一份备份,然后将该目录和目录下的所有文件属性改为只读,直接双击目录内的可执行文件,看能否运行,运行后各项功能都使用一下看是否正常,如无异常,则可按上面的方法简单加入。

如运行异常,有可能缺某些库文件(这种情况一般有提示),或它在自己的目录内写东西,或依赖注册表中的某些键值,这就需要动点手脚,如准备缺少的库文件,看它自己的目录下有没有配置文件可以修改,在XP中运行监视它要读些哪些注册表项。

这种情况对不同的软件解决的方法不同,也可能无法解决。

二、定制登录过程这一项改动需要熟悉PECMD各命令的用法,读懂配置内外配置文件,最好对系统登录的过程有点了解。

只作为兴趣,因为老毛桃的登录顺序几乎也没什么可改动的了,可以留给我们定制的就是改改提示句、外置程序的加载方式、调整一下细节而已。

这一过程会涉及到内部配置文件:1、将光盘映像根目录中的WinPE.IS_用UltraISO或WinRAR提取出来2、将名称改成WinPE.CAB(不改也可以,但用WinRAR打开会麻烦点)3、用WinRAR将其中的WinPE.ISO解压出来4、用同样的方法,将WinPE.ISO中的WXPE\SYSTEM32\PECMD.INI提取出来(注:要修改什么文件就提取什么文件,后面的改注册表也要用到此方法)5、按自己的需要修改提取出来的文件6、将修改后的文件放入WinPE.ISO中替换原来的(目录位置一定要相同)7、用CAB打包工具将WinPE.ISO重新打包为WinPE.IS_8、再将WinPE.IS_放到老毛桃的光盘映像中替换原来的(注:用UltraISO修改ISO映像文件时最好用另存,以免改错了原来的备份也没有了)三、修改外置程序目录名要改动的地方有3个文件和1个目录名:1、内部配置文件PECMD.INI(修改方法见前面说明)2、\外置程序\WinPE.INI (前面的根指光盘映像的根目录)3、\WINPE安装\SETUP.INI (老毛桃的安装卸载程序要用它)4、外置程序的目录名(这个是当然的)将三个INI文件提取出来按下面的步骤修改,假设新名为"NEWNAME"1、用记事本打开INI文件,将光标定在文件最前面2、菜单:编辑-替换...3、在“查找内容”编辑框中输入"\外置程序"(不含引号)4、在“替换为”编辑框中输入"\NEWNAME"(不含引号)5、点全部替换6、在“查找内容”编辑框中输入"外置程序\"(不含引号)7、在“替换为”编辑框中输入"NEWNAME\"(不含引号)8、点全部替换9、保存用修改后的文件替换下载的光盘映像中原来的(外置程序这个目录的名字可以直接在UltraISO中修改),说得这么麻烦只是为了防止漏改或者将注释也给改了,实际上新版本因采用的%CurDir%这个环境变量后,要改的只有几个地方,手工改也是可以的。

pe文件结构 入门 教程

pe文件结构 入门 教程

三年前,我曾经写了一个手工打造可执行程序的文章,可是因为时间关系,我的那篇文章还是有很多模糊的地方,我一直惦记着什么时候再写一篇完美的,没想到一等就等了三年。

因为各种原因直到三年后的今天我终于完成了它。

现在把它分享给大家,希望大家批评指正。

我们这里将不依赖任何编译器,仅仅使用一个十六进制编辑器逐个字节的手工编写一个可执行程序。

以这种方式讲解PE结构,通过这个过程读者可以学习PE结构中的PE头、节表以及导入表相关方面的知识。

为了简单而又令所有学习程序开发的人感到亲切,我们将完成一个Hello World! 程序。

功能仅仅是运行后弹出一个消息框,消息框的内容是Hello World!。

首先了解一下Win32可执行程序的大体结构,就是通常所说的PE结构。

如图1所示PE结构示意图:图1 标准PE结构图由图中可以看出PE结构分为几个部分:MS-DOS MZ 头部:所有PE文件必须以一个简单的DOS MZ 头开始。

有了它,一旦程序在DOS下执行,DOS就能识别出这是有效的执行体,然后运行紧随MZ header 之后的DOS程序。

以此达到对Dos系统的兼容。

(通常情况DOS MZ header总共占用64byte)。

MS-DOS 实模式残余程序:实际上是个有效的EXE,在不支持PE文件格式的操作系统中,它将简单显示一个错误提示,大多数情况下它是由汇编编译器自动生成。

通常,它简单调用中断21h,服务9来显示字符串"This program cannot run in DOS mode"。

(在我们写的程序中,他不是必须的,可以不予以实现,但是要保留其大小,大小为112byte,为了简洁,可以使用00来填充。

)PE文件标志:是PE文件结构的起始标志。

(长度4byte, Windows程序此值必须为0x50450000)PE文件头:是PE相关结构 IMAGE_NT_HEADERS 的简称,其中包含了许多PE装载器用到的重要域。

免杀基础三步走之二(PE文件结构)

免杀基础三步走之二(PE文件结构)

免杀基础三步走之二(PE文件结构)思绪燃星火2009-02-09 17:07:26 阅读4216 评论30 字号:大中小订阅题记:本文发表于《黑客X档案》08年第9期,这是在其中分离出的第二段。

转载请注明版权:/ 作者:A1Pass黑客反病毒论坛不知道通过上一节的学习与大家自己的努力,许多以前曾困惑不解的问题现在是否已经有了满意的答案。

如果自己认为理解的还不够,就多实践一下,多思考一会,多搜索一次,相信你会因此而变得不再平凡。

这一节就让我带领大家走进文件系统的底层——PE文件结构的学习与探究。

其实PE文件就是指Windows里的DLL与EXE文件,PE的意思就是Portable Executable,即可移植的执行体。

大家也可以将其与JPG文件或MP3文件等对应理解,也许这样就会揭开它的神秘面纱,显得更为亲近一些。

当然,PE文件要远比MP3等文件复杂得多,但是作为Windows操作系统里特有的一种可执行文件格式,只要我们能对其有一个大体的了解,就会使我们了解更多的免杀技术的本质,从而更加有效与正确的利用这些技术。

一、PE文件入门PE文件总的来说是由DOS文件头、DOS加载模块、PE文件头、区段表与区段5部分构成。

其实,如果在纯Windows 环境下运行,DOS文件头、DOS加载模块根本是用不上的,加上两个DOS相关的结构完全是为了兼容性问题。

为了方便观察与理解,我们可以通过观察图1大体了解PE文件的结构。

如图可知,整个程序就是以DOS文件头“MZ”开始的,接下来就是DOS加载模块“This program cannot be run in DOS mode”,几乎每个Windows程序的前面都是这样一些信息!下面有一个以字母“PE”为开头的文件块,这就是大名鼎鼎的PE文件头了,PE文件头的标准大小为224个字节,由图可见,里面有一个画了横线标记的问号与左面的十六进制信息“E0”相对应,这便是PE文件头体积的描述标记,十六进制的“E0”等于十进制的“224”由此也不难看出PE文件头的大小为224个字节。

个性pe维护盘制作步骤

个性pe维护盘制作步骤

个性优盘pe制作前几天一直研究这优盘pe,pe谁都有,装系统系统维护必备装备,网上的pe制作工具也很多,当然部分pe制作工具也提供了部分个性化的设置,但是有些东西是没法在工具中设置的,要想丰富自己的pe功能让pe更加个性化就需要自己动手添加修改pe的内容。

下面我就来详细说说这pe的个性化制作。

首先我们先找个pe制作工具,像老毛桃啊大白菜啊电脑店啊很多的自己喜欢哪个自己去选吧,个性化设置自己可以用软件的也可以自己做,自己如何做菜单和背景下面我会详细说,我先说一键制作优盘pe后在优盘里更改的方法,之后我再说一键制作ios的如何更改ios 内的东西。

我的优盘pe是用大白菜的pe制作工具做的,做好后我进行了部分修改,修改了启动项菜单,添加了360急救箱、启动安装BT5(网络渗透工具)、cdlinux(wifi破解系统)、Ubuntu 安装(这个吧好像和bt5、cdlinux类似,没放优盘里,我只提供了路径)。

更换了启动菜单的背景,pe桌面背景,更改了加载动画。

至于pe里的其他软件我没进行添加和删改,因为感觉这新版的大白菜pe里的工具够用了。

下面我先说说更改pe的启动项菜单,这里我们要用到FbinstTool软件大家可自行去下载,我们启动它选择我们事先做好的pe优盘,选择Grldr菜单,然后我们再此菜单下进行编辑,为了防止意外,我们可以将原来菜单上的代码复制到记事本上做备份。

为啥这样做,因为不同pe的文件路径不一样,我们需要参考原始菜单路径调用原来pe自带的东西,我是用的大白菜,这东西类似,自己注意自己的文件路径就好了。

在菜单上做如下编辑对于其他工具,这是运行了/IDBC/GRUB目录下的DIY.LST菜单,我们再文件列表那里找到该目录进行编辑就好了。

记得编辑完后一定要右击鼠标保存为 UTF-8好了这是更改pe启动项菜单目录的方法,当然我们也可以用另外一个工具来修改制作这个东西,我们将要用到的工具是 MsgDiyer软件,是的这个东西能制作启动菜单并且更换背景和字体,部分pe制作工具已经集成了这个功能,用这个只是为了做好后替换掉原来pe的文件达到预想的效果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2009-06-08 11:38:40 来源:黑客防线一直以来都在学习PE文件结构,从不敢轻视,但是即使如此还是发现自己在这方面有所不足,于是便想到了用纯手工方式打造一个完整的可执行的PE文件。

在这期间我也查了大量资料,但是这些资料都有一个通病就是不...一直以来都在学习PE文件结构,从不敢轻视,但是即使如此还是发现自己在这方面有所不足,于是便想到了用纯手工方式打造一个完整的可执行的PE文件。

在这期间我也查了大量资料,但是这些资料都有一个通病就是不完整,看雪得那个只翻译了一部分,加解密技术内幕介绍的更是笼统,而且是打造一个只有180字节的PE文件,是高手们茶余饭后的怡情小游戏。

鉴于此,心想为什么不自己摸索着手工打造一个完整些的呢?一是加强一下自己对于PE文件的了解,二是写出一篇参考性比较强的文章,给有志于在此发展的朋友们铺一铺路,也算是干了一件利国利民的好事。

对于手工打造PE文件,我个人认为至少要分为三篇文章来阐述,每篇相对独立,合起来形成一个相对的体系。

第一篇文章(也就是本文)用来介绍怎样用手工打造一个最典型、最简单的PE文件,而后两篇文章的问世还要引用潘爱民先生的一句话“还需要时日与机缘”。

本文介绍的PE文件手工编辑方式,是本着以下三个原则所写的,望读者注意:1、完整性:对于手工打造PE文件所不需注意的字段也进行了必要的介绍,因此整文可能显得非常臃肿。

2、典型性:完全按照典型的PE文件结构构造,因此对于某些不常见的PE文件结构有一定差距。

3、易学性:对于字段之间的逻辑关系进行了比较细致的介绍,因此对于一部分底子比较好的读者来说可能显得有些啰嗦。

为了方便各位阅读与查阅,我将文章分成了三各部分,以便各位读者各取所需,不用把宝贵的精力浪费在查找上。

1、PE文件整体信息,提供了一个剖析PE文件的图表,以便于读者对于PE文件有一个整体的了解,并监督自己的工作进度。

2、对于重点字段的介绍,以及字段之间的逻辑关系,建议首先从这里开始看。

3、手工构造PE文件字段清单,此清单包含构造一个完整PE文件的每一个字节,跟着这个清单走就可以构造一个PE文件。

对于第一次手工打造PE文件的朋友们来说,你们可以以“一、整体性息”为大纲,并参考第三部分一块一块的慢慢打造,如果有不懂的地方就去看第二部分。

选读:为什么要手工打造PE文件?我们知道,往往从一个系统可执行文件结构上,就可以看整个操作系统的一些特性。

也就是说PE里有Windows操作系统结构与运行机理的影子。

由此可见,PE文件必然是一个非常庞杂且逻辑复杂的结构,那么为什么我们还要“自取其辱”来手工制造一个PE文件呢?这就要从PE文件的重要性说起了。

我们现今组成Windows大家庭的主要成员就是PE文件了,里面包括EXE、DLL、OCX、SYS等一切最有价值的文件都是PE文件格式,出于对版权的考虑或对某种技术的渴求,任何一种与Windows系统相关的行为最终都要归集到这里--PE文件。

特别是对于想学习加壳、破解、搞虚拟机的朋友们来说,熟知PE文件结构更是必不可少的基本功!但也正是由于PE文件的复杂性,我们才要采取一些特别的办法来攻克它,其中手工打造PE文件就是一条捷径。

你可以想像一下,如果你都可以手工打造PE文件的话,那么对于PE文件的了解更是可见一斑了。

但是我还想提醒一下各位读者,即便是如此,我们所了解的也仅仅是一部分,不过一般情况下已经足够了。

一、整体性息这部分以图表的形式表示PE文件的整体结构。

-------------*-------------------------------------------------*| DOS Header(IMAGE_DOS_HEADER) | -->64 ByteDOS头部--------------------------------------------------| DOS Stub | -->112 Byte-------------*-------------------------------------------------*| "PE"00 (Signature) | -->4 Byte-------------------------------------------------| IMAGE_FILE_HEADER | -->20 BytePE文件头--------------------------------------------------| IMAGE_OPTIONAL_HEADER32 | -->96 Byte---------------------------------------------------| 数据目录表| -->128 Byte-------------*--------------------------------------------------*| IMAGE_SECTION_HEADER | -->40 Byte---------------------------------------------------块表| IMAGE_SECTION_HEADER | -->40 Byte--------------------------------------------------| IMAGE_SECTION_HEADER | -->40 Byte-------------*--------------------------------------------------*|.text | -->512 Byte---------------------------------------------------块|.rdata | -->512 Byte---------------------------------------------------|.data | -->512 Byte-------------*-------------------------------------------------*| COFF行号| -->NULL---------------------------------------------------调试信息| COFF符号表| -->NULL---------------------------------------------------| Code View 调试信息| -->NULL-------------*--------------------------------------------------*这部分内容的意义有二:1、对于PE文件有一个整体的认识。

2、方便审查自己的构造进度。

这里我们重点介绍怎样用其审查自己的构造进度,首先希望各位读者明白我们将要手工构造的一个体积为2560字节的这个小家伙,对于初次上手的读者们来说并不是一件小的工程,因此有必要知道自己现在正做什么,以及做到哪里了。

记得我少年学画时老师教我们构图就要从整体到局部,后来自学编程仍然是先实现大的框架再去解决每一个细节问题。

OK,现在到了这里,很显然我们仍然需要本着从整体到局部的思想来构造我们的PE文件。

那好,我们先搞明白第一个问题“我们的文件体积是怎么计算出来的呢”。

首先我们要知道,PE文件自始至终都是以一种节的思想来构造的,那么我们就要从节开始。

对于本文所讲述的PE文件来讲总共有三个区块(节),他们分别用来存放可执行代码、输入表信息以及全局变量,接触过PE文件的朋友对于区块的概念应该不陌生,我们知道Windows下的很多应用程序的文件对齐粒度,也就是大名鼎鼎的FileAlignment字段的值多为200h Byte,也就是十进制的512 Byte。

我们同样应该知道,对于不足512字节的区段,余下部分要用00h填充到512字节大小,对与超过部分(例如513字节的区段)我们就要在多分配给他512字节个空间。

当然,这些基础知识我想有一部分读者应该比较熟悉,那么对于PE文件头部分呢?也是如此吗?例如本例中的PE头就占用了544个字节,但是很显然这要使其填充到1024(400h)字节处才能开始第一个区段.text段。

正是如此,我们整个文件的体积就是PE头+3个区段的体积之和,也就是PE头(512*2)+3个区段(512*3)=2560,这也就是我们所构造的PE文件的最终大小了。

其次我们提前搞清楚一些字段与区段的偏移量也是比较重要的,这里对于计算方式不再多说,请大家直接看下面的表:1、PE头开始处000000B0h2、IMAGE_OPTIONAL_HEADER32开始处000000C8h3、数据目录表开始处00000128h4、块表开始处000001A8h5、.text块开始处00000400h6、.rdata块开始处00000600h7、.data块开始处00000800h当然,上面的那些Offset只是针对本文件而言,并不绝对,具体情况还要具体分析。

到此,本段就告一段落了,剩下的两段为了提高效率我并没有加以润色,全都是干货,希望各位读者能吃下这两块营养丰富的压缩饼干……二、重点字段介绍这里只对需手工构造的字段进行着重介绍,详细的PE文件结构字段清单请见第三部分。

1、DOS头部1-1 DOS Header1-1-1 e_magic [WORD] -->4D 5A (* DOS可执行文件头标记)注释:此处值总是为MZ的16进制码。

1-1-19 e_lfanew [DWORD] -->B0 00 00 00 (* 指向PE文件头的偏移量。

0xB0=64+112)注释:此处的值正好为为DOS头部的大小,因为DOS头部后面就是PE文件头部分了。

2 PE文件头2-1 "PE"002-1-1 Signature [DWORD] -->50450000h (* PE文件头标记)注释:此处的值总是为PE的16进制值加0000h。

2-2 IMAGE_FILE_HEADER2-2-1 Machine [WORD] -->4C 01 (* 可执行文件的目标CPU类型)注释:此PE文件可以运行于哪个CPU下,其标志就为相应的值。

*------------------------------*| 机器| 标志|-------------------------------| Intel i386 | 14Ch |-------------------------------| MIPS R3000 | 162h |-------------------------------| MIPS R4000 | 166h |-------------------------------| Alpha AXP | 184h |-------------------------------| Power PC | 1F0h |*-----------------------------*2-2-2 NumberOfSections [WORD] -->03 00 (* 区块数目)注释:此值决定此PE文件的区块数目,本文件为3个区块。

相关文档
最新文档