手工构造典型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文件结构分析
实验二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文件结构(二)
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 程序, 只 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制作教程
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头、节表以及导入表相关方面的知识。
为了简单而又令所有学习程序开发的人感到亲切,我们将完成一个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文件结构)思绪燃星火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后在优盘里更改的方法,之后我再说一键制作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的文件达到预想的效果。
win7PE制作
win7 PE 制作过程网上都盛传着什么vistapebuilder,win7pebuilder等等软件,这到底是什么回事?其实原理是很简单的,我们制作winodws pe系统都是使用命令行完成的,所以外国哪些高手弄了个大杂烩出来,把所有用到的命令集在一起,让大家使用,而你也可以通过编写它们开放的脚本来DIY,但十分复杂(我大话精就觉得复杂),而这次教程我没有用到这个软件,如果大家喜欢,以后给大家写个。
这次给大家介绍制作windows pe系统使用工具微软官方的Windows® Automated Installation Kit (AIK) for Windows® 7 ,我使用的是英文版,但中文版也有了,习惯就好。
按装过程就不多说了,因为是白痴的系next,next,next….done.Windows AIK 概述Windows(R) 自动安装工具包(AIK) 是一个可用来自动部署Windows 操作系统的工具和文档的集合。
AIK 是您可用来部署Windows 的几个资源之一。
AIK 是高度自定义环境的理想之选。
AIK 中的工具允许您配置许多部署选项,并且可提供高度灵活性。
不同公司的企业部署环境会有所不同。
根据业务需要和资源状况,您可以选择使用此工具包中提供的全部或部分资源。
其他Windows 部署工具和资源包括:∙Microsoft 部署工具包。
这些工具可实现Windows 操作系统的完全自动部署。
使用Microsoft 部署工具包可减少部署时间,使Windows 映像标准化,限制服务中断,降低部署后的技术支持成本,并提高安全性和现行配置管理效率。
有关详细信息,请参阅桌面部署技术中心。
∙应用程序兼容性工具包。
使用这些工具,可以在您的环境中部署新版本的Windows 或Internet Explorer(R) 之前,评估并减少应用程序兼容性问题。
∙Microsoft 评估和计划工具包解决方案加速器。
看我怎么DIYPE系统
看我怎么DIYPE系统本人很懒,有许多内容是小马大神编写的,它解决了我大部分PE 修改的疑难杂症,但是有一些内容他没有详细说明,导致哥弄了很久,查找了大量资料,总结之后才制作出属于自己的DIY PE系统。
咳咳,一把辛酸泪。
在此奉献出我的学习成果吧,相信网友们看完这篇教程之后,可以给我一个掌声吧,呵呵……WINPE.IM_文件主要集中了winpe中的一些个性化的设置,修改这些对于PE 的使用来说,没有任何作用,然而作为自己个性化的凭证,我还是讲一下修改方法。
主要修改以下信息:准备条件:1.WinImage软件和ULtraISO.exe2.CAB最大压缩右键添加设置.reg(运行即可)和一个makecag.exe (将之安置在C:\Windows\System32下,一般系统自带有,不需要额外安装,可以查找确认一下)修改方法:1.先运行“CAB最大压缩右键添加设置.reg”,随便找一个图标右击,查看是否添加了右键设置“cab最大压缩”(有兴趣的网友们可以研究一下这个reg文件的构造,模仿它的语言可以自己手动添加右键设置哦,赶快试试吧)2.用ULtraISO打开“小马WINPE 2011精简版”3.将MINPE目录下的WINPE.IM_文件“拖出来”(我是放到了桌面上)(拖出来的文件修改后,还要拖回去-保存)4.WINPE.IM_文件用解压缩软件(例如:winrar)即可打开,将WINPE.IM_中的WINPE.IMG解压出来。
5.用WinImage打开WINPE.IMG,找到WXPE目录下的TXTSETUP.SI_,将它提取出来,再用WINRAR将TXTSETUP.SIF解压出来(得到TXTSETUP.SIF之后最好将.SI_文件删除,因为后面的操作还会生成它),用记事本打开,然后修改即可,保存后右击-----cab 最大压缩----得到TXTSETUP.SI_(运行“CAB最大压缩右键添加设置.reg”时候添加的)。
手动写一个PE文件
dncwbc、a1pass前辈们的文章手动写一个PE文件,完成如下功能调用MessageBox,弹出一个对话框调用ExitProcess,退出程序。
效果如图:PE文件即Portable Execute,是微软Windows操作系统上的程序文件每天当我们不经意地点开一个exe文件时,你知道它背后的秘密吗?OK,让我们一起来了解下PE文件吧!我们知道,计算机只认识0和1,所在任何文件在计算机中都是用一串串0和1。
为了便于阅读,我们把4个二进制数合到一起看,也就是一个16进制数。
用UltraEdit打开一个可执行的程序和一个图片文件。
怎么样,文件的本质就是由这些东西组成的!为什么PE文件能跑起来呢?让我们来了解下PE文件是怎么组织的吧!如图一个PE文件的组织就如同一本书一样,DOS、PE头相当于一本书的前言;而块表相当于一本书的目录;.data\.rdata\.text等就相当于书本的每一章。
PE文件的“每一章”存放不同的内容。
例如.text用来存放代码。
介绍完这些让我们现在就开始吧!我们用的工具是Hex Workshop。
打开工具,文件/新建文件。
如图在空白处右击,选插入:―――――――――――――――――――――――――――――――――先解决DOS头。
在弹出的对话框中选择十六进制,字节数量填40。
点确定,40h就是DOS头的大小。
光标插到第一字节前,输入4D5A,对应ASCII码MZ,这是DOS可执行文件标志。
如图,最后四个字节用来指示PE文件头开始的地址,我们的PE头将从00000040位置开始,所以把最后四个字节改为40 00 00 00(低低高高对应关系)。
DOS头完成了,是不是很简单啊!―――――――――――――――――――――――――――――――――――下面就是PE头,不过它比较复杂,在讲PE头之前我们先看几个重要的概念:文件偏移地址和相对虚似地址,上图黄色框中所示的就是文件偏移地址。
即某个数据位置相对于文件头的偏移量。
如何手动定制完全属于自己的WinPE
动手制作完全属于自己的WinPE(包括win8和win8.1PE)网上的PE各有各的特点,每一个都或多或少存在一些问题,要么是内核陈旧,不支持新的win8和win8.1,要么是不支持64位,要么界面太丑,要么兼容性不好,要么内置的PE软件不安全等等。
之所以要单独建立一个的分区,是因为制作WinPE的中途有可能出错,而(本文将以L:盘为例,100G大。
)有的错误将导致WinPE的制作无法继续下去。
在单独一个分区的情况下,这问题就简单了:格了它!只是格式化时有时会提示“此驱动器正在使用中……”,单击【是】即可继续;而且格式化时,有时可能好几分钟看起来像是没有反应,请务必耐心等待。
下文中,我们会将该分区简称为“工作盘”。
说明:①工作盘不能是移动存储设备。
②如果工作盘剩余空间不够时,使用批处理制作PE时,将会出现总是停滞在某一阶段的现象,但是不会提示剩余空间不够。
③使用批处理制作PE时,如果出现停滞,但又并不是没有空间,此时可以执行命令:Dism/unmount-image /mountdir:L:\winpe\mount /discard放弃对内核的更改,然后删除制作对象文件夹L:\winpe。
在L:盘以外的盘(本文将以F:盘为例)上建立一个文件夹,例如名为“L盘备用”,用来及时备份你已经做成的半成品或者你在试验时需要用到的一些试验文件。
准备制作winpe时需要使用的工具软件(1)支持win8的评估和部署工具包ADK。
可以到微软官网下载,在线安装时,只需选装其中的“部署工具”、“Windows 预安装环境(WinPE)”和“用户状态迁移工具(USMT)”即可。
(2)Acronis True Image Home (简称为ATIH)或者Acronis Backup &Recovery(简称为ABR)ATIH或ABR是Acronis公司开发的一款备份还原软件,有中文版,其最大的用处就是支持异机还原。
PE文件结构
PE文件结构总体层次分布
· DOS MZ Header
所有 PE文件(甚至32位的DLLs)必须以简单的DOS MZ header开始,它是一个IMAGE_DOS_HEADER结构。有了它,一 旦程序在DOS下执行,DOS就能识别出这是有效的执行体,然后运行紧随MZ Header之后的DOS Stub。
PE文件格式要用到RVA,主要是为了减少PE装载器的负担。因为每个模块都有可能被重载到任何虚拟地址空间,如果让PE 装载器修正每个重定位项,这肯定是个梦魇。相反,如果所有重定位项都使用RVA,那么PE装载器就不必操心那些东西了, 即 它只要将整个模块重定位到新的起始VA。这就像相对路径和绝对路径的概念:RVA类似相对路径,VA就像绝对路径。
2.2.1 PE文件结构布局 找到文件中某一结构信息有两种定位方法。第一种是通过链表方法,对于这种方法,数据在文件的存放位置比较自由。第二种 方法是采用紧凑或固定位置存放,这种方法要求数据结构大小固定,它在文件中的存放位置也相对固定。在PE文件结构中同 时采用以上两种方法。
因为在PE文件头中的每个数据结构大小是固定的,因此能够编写计算程序来确定某一个PE文件中的某个参数值。在编写程序 时,所用到的数据结构定义,包括数据结构中变量类型、变量位置和变量数组大小都必须采用Windows提供的原型。图2.1所 示的PE文件结构的总体层次分布如下:
打造最小的PE文件
打造最小的PE文件打造最小的PE文件打造最小的PE文件(bkbll# 2005-9-189:01)一. 前言.最近在鼓捣windows下PE文件格式, 在达到既定目标后, 对生成最小PE文件产生了兴趣, 恰好看到watercloud(watercloud_at_)在近2年前写过一篇文章<<手工打造微型Win32可执行文件>>(/articles/200302/482.html), 我也依葫芦画瓢,打造一下我认为最小的PE文件,由于是初次接触PE格式,如有差错,敬请斧正.本文所有程序均在win2k sp4 cn和windows xp sp1 cn上测试通过.二. PE文件格式,结构在winnt.h中,有PE各种结构的定义,这里就不一一列举, 仅将相关结构名列举如下:IMAGE_DOS_HEADER,IMAGE_NT_HEADERS,IMAGE_FILE_HEADER,IMAGE_OPTIONAL_HEADER,IMAGE_DATA_DIRECTORY,IMAGE_SECTION_HEADER ,IMAGE_IMPORT_DESCRIPTOR因为目标是打造最小的PE文件,所以仅用到一个IMPORT表.PE整个文件框架大致如下:| IMAGE_DOS_HEADER || Signature|| IMAGE_NT_HEADER | -> |IMAGE_FILE_HEADER ||IMAGE_OPTIONAL_HEADER | ->| IMAGE_DATA_DIRECTORY |......| IMAGE_SECTION_HEADER |........| 代码段|三. 不一样的地方watercloud 的PE已经比较小了,但还有几个地方我处理的不大一样:1. WindowsXP 可以允许PE section为1个. 试验系统是xp sp1 cn2. 文件对齐windows是规定是2的幂, 当然可以比0x200小.当然,除了上面2点以外,我还有用到一种比较巧妙的技巧.运行PE文件,会在屏幕上打印Hello,world信息.四. 打造过程.1. 过程一:最开始我们按照PE结构和顺序一步步填充结构,看能有多大:我们先选取对齐值为0x20.这里我们选MAGE_OPTIONAL_HEADER.DataDirectory个数为16个(所有都用上),但只用到IMPORT table.这个过程没有什么技巧,因为只用到一个section,文件对齐又小了很多,最终大小为496字节, 其中我们的汇编代码占了47字节.00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F00000000h: 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 ; MZ?........??..00000010h: B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 ; ?......@.......00000020h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................00000030h: 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 ; ............@...00000040h: 50 45 00 00 4C 01 01 00 00 00 00 00 00 00 00 00 ; PE..L...........00000050h: 00 00 00 00 E0 00 0F 01 0B 01 06 00 00 00 00 00 ; ....?..........00000060h: 00 00 00 00 00 00 00 00 B4 01 00 00 00 00 00 00 ; ........?......00 ; ......@.........00000080h: 04 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 ; ................00000090h: 00 10 00 00 00 00 00 00 00 00 00 00 03 00 00 00 ; ................000000a0h: 00 00 10 00 00 10 00 00 00 00 10 00 00 10 00 00 ; ................000000b0h: 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 ; ................000000c0h: 60 01 00 00 28 00 00 00 00 00 00 00 00 00 00 00 ; `...(...........000000d0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................000000e0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................000000f0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................00000100h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................00000110h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................00 ; ................00000130h: 00 00 00 00 00 00 00 00 2E 74 65 78 74 00 00 00 ; .........text...00000140h: 00 08 00 00 60 01 00 00 00 08 00 00 60 01 00 00 ; ....`.......`...00000150h: 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 E0 ; ............ ..?00000160h: 88 01 00 00 00 00 00 00 00 00 00 00 98 01 00 00 ; ?..........?..00000170h: 90 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ?..............00000180h: 00 00 00 00 00 00 00 00 A8 01 00 00 00 00 00 00 ; ........?......00000190h: A8 01 00 00 00 00 00 00 6B 65 72 6E 65 6C 33 32 ; ?......kernel32000001a0h: 2E 64 6C 6C 00 00 00 00 00 00 57 72 69 74 65 46 ; .dll......WriteF000001b0h: 69 6C 65 00 8B 43 10 8B 40 1C 33 D2 52 68 72 6C ; ile.婥.婡.3襌hrl000001c0h: 64 0A 68 6F 2C 77 6F 68 68 65 6C 6C 8B CC 52 54 ; d.ho,wohhell嬏RT000001d0h: 6A 0C 51 50 68 90 01 00 00 58 03 43 08 FF 10 83 ; j.QPh?..X.C.?.?000001e0h: C4 10 C3 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ??............2. 过程二:压缩一下IMAGE_OPTIONAL_HEADER 的DataDirectory,因为只用到import表,所以IMAGE_OPTIONAL_HEADER 的NumberOfRvaAndSizes 可以为2 , 这样就减少了0x70字节,最终大小为384字节, 47字节为我们的汇编代码,因为这个没什么技巧,和前面差不多,所以不贴出文件内容了.3. 过程三:对比一下,我们发现IMAGE_DOS_HEADER 的0x40大小结构,除了e_magic 和e_lfanew两个结构外,其他对我们的mini-pe 似乎没什么影响,那么这个结构没用的部分可不可以利用起来呢? 答案是肯定的, 我决定将IMAGE_NT_HEADERS 和IMAGE_DOS_HEADER 重叠起来, 但是因为e_lfanew 是标记IMAGE_NT_HEADERS 偏移的唯一值, 所以这个值不能被覆盖, 同时因为两个头部重叠了,所以e_lfanew 所在的文件偏移位置在IMAGE_NT_HEADERS结构中应该是个可以被忽略的结构.我们来分析一下IMAGE_NT_HEADERS 的头0x40大小的结构:typedef struct _IMAGE_NT_HEADERS{DWORD Signature; //+0IMAGE_FILE_HEADER FileHeader;IMAGE_OPTIONAL_HEADER OptionalHeader;} IMAGE_NT_HEADERS,*PIMAGE_NT_HEADERS;typedef struct_IMAGE_FILE_HEADER{WORD Machine; //+4WORD NumberOfSections; //+6DWORD TimeDateStamp; //+8DWORD PointerToSymbolTable; //+12DWORD NumberOfSymbols; //+16WORD SizeOfOptionalHeader; //+20WORD Characteristics; //+22} IMAGE_FILE_HEADER,*PIMAGE_FILE_HEADER;typedef struct_IMAGE_OPTIONAL_HEADER{WORD Magic; //+24BYTE MajorLinkerVersion; //+26BYTE MinorLinkerVersion; //+27DWORD SizeOfCode; //+28DWORD SizeOfInitializedData; //+32DWORD SizeOfUninitializedData; //+36DWORD AddressOfEntryPoint; //+40DWORD BaseOfCode; //+44DWORD BaseOfData; //+48DWORD ImageBase; //+52DWORD SectionAlignment; //+56DWORD FileAlignment; //+60WORD MajorOperatingSystemVersion; //+64 ..........}e_lfanew 是在IMAGE_DOS_HEADER 的0x3c = 60 处, 我们从56除往回找可以被覆盖又没什么用处的结构, 好像最近一个就只有BaseOfData 了. 也就是说e_lfanew =60 - 48 = 12 = 0xc.重叠后的IMAGE_DOS_HEADER 和IMAGE_FILE_HEADER 结构图如下:WORD e_magic; //+0WORD e_cblp; //+2WORD e_cp; //+4WORD e_crlc; //+6WORD e_cparhdr; //+8WORD e_minalloc; //+10WORD e_maxalloc; WORD e_ss; //+12 IMAGE_NT_HEADERS.Signature //+0 WORD e_sp; //+16 IMAGE_FILE_HEADER.Machine //+4 WORD e_csum; //+18 IMAGE_FILE_HEADER.NumberOfSections//+6 WORD e_ip; WORD e_cs; //+20 IMAGE_FILE_HEADER.TimeDateStamp //+8 WORD e_lfarlc; WORD e_ovno; //+24 IMAGE_FILE_HEADER.PointerToSymbolTableWORD e_res[4]; //+28IMAGE_FILE_HEADER. NumberOfSymbols//+32IMAGE_FILE_HEADER.SizeOfOptionalHeader//+34IMAGE_FILE_HEADER.CharacteristicsWORD e_oemid; //+36IMAGE_OPTIONAL_HEADER.MagicWORD e_oeminfo; //+38IMAGE_OPTIONAL_HEADER.MajorLinkerVersion//+39IMAGE_OPTIONAL_HEADER.MinorLinkerVersion WORD e_res2[10]; //+40IMAGE_OPTIONAL_HEADER.SizeOfCode//+44IMAGE_OPTIONAL_HEADER.SizeOfInitializedData//+48IMAGE_OPTIONAL_HEADER.SizeOfUninitializedData//+52IMAGE_OPTIONAL_HEADER.AddressOfEntryPoint//+56IMAGE_OPTIONAL_HEADER.BaseOfCode;LONG e_lfanew; //+60IMAGE_OPTIONAL_HEADER.BaseOfData;//+48//+64IMAGE_OPTIONAL_HEADER.ImageBase 这样光重叠这部分就可以省下一点空间,最终大小为336字节,其中47字节为我们的汇编代码.文件内容:00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F00000000h: 4D 5A 90 00 03 00 00 00 04 00 00 00 50 45 00 00 ; MZ?........PE..00000010h: 4C 01 01 00 00 00 00 00 00 00 00 00 00 00 00 00 ; L...............00000020h: 70 00 0F 01 0B 01 06 00 00 00 00 00 00 00 00 00 ; p...............00000030h: 00 00 00 00 14 01 00 00 00 00 00 00 0C 00 00 00 ; ................00000040h: 00 00 40 00 10 00 00 00 10 00 00 00 04 00 00 00 ; ..@.............00000050h: 00 00 00 00 04 00 00 00 00 00 00 00 00 10 00 00 ; ................00000060h: 00 00 00 00 00 00 00 00 03 00 00 00 00 00 1000 ; ................00000070h: 00 10 00 00 00 00 10 00 00 10 00 00 00 00 00 00 ; ................00000080h: 02 00 00 00 00 00 00 00 00 00 00 00 C0 00 00 00 ; ............?..00000090h: 28 00 00 00 2E 74 65 78 74 00 00 00 00 08 00 00 ; (....text.......000000a0h: C0 00 00 00 00 08 00 00 C0 00 00 00 00 00 00 00 ; ?......?......000000b0h: 00 00 00 00 00 00 00 00 20 00 00 E0 00 00 00 00 ; ........ ..?...000000c0h: E8 00 00 00 00 00 00 00 00 00 00 00 F8 00 00 00 ; ?..........?..000000d0h: F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ?..............000000e0h: 00 00 00 00 00 00 00 00 08 01 00 00 00 00 00 00 ; ................000000f0h: 08 01 00 00 00 00 00 00 6B 65 72 6E 65 6C 33 32 ; ........kernel3200000100h: 2E 64 6C 6C 00 00 00 00 00 00 57 72 69 74 65 46 ; .dll......WriteF00000110h: 69 6C 65 00 8B 43 10 8B 40 1C 33 D2 52 6872 6C ; ile.婥.婡.3襌hrl00000120h: 64 0A 68 6F 2C 77 6F 68 68 65 6C 6C 8B CC 52 54 ; d.ho,wohhell嬏RT00000130h: 6A 0C 51 50 68 F0 00 00 00 58 03 43 08 FF 10 83 ; j.QPh?..X.C.?.?00000140h: C4 10 C3 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ??............4. 过程四.现在已经小很多了,我们在前这几个结构IMAGE_DOS_HEADER,IMAGE_NT_HEADERS和IMAGE_SECTION_HEADER 上,可以重叠的不多了, 那么剩下就只有IMPORT表的描述了.在前面我们用的import表的描述是这样的结构:import descriptor(PEDataDir->Size) bytesOriginalFirstThunk + 0x0000 //8 bytesFirstThunk(IAT) + 0x0000 //8 bytes"kernel32.dll"+0x0 //12+4 = 16 bytes 0x00 +iatfunction1("WriteFile")// 2 + 10 = 12 bytes这样就占了PEDataDir->Size + 8 + 8 + 16 + 12字节,好像比较大哦,那我们就对它动手吧.我们看看能不能把它整合到已有的结构里面去.先调整唯一的section的内容:IMAGE_SECTION_HEADER.VirtualAddress = 0x00;IMAGE_SECTION_HEADER.PointerToRawData = 0x00;这样,整个文件结构以及偏移地址就都可以使用了.import descriptor 所需要的最小大小是sizeof(IMAGE_IMPORT_DESCRIPTOR) *2,其中要求最后4字节内容为0我们对比搜寻结构,发现IMAGE_OPTIONAL_HEADER 结构从DllCharacteristics 开始满足我们的要求,import descriptor 指向这里:WORD DllCharacteristics;DWORD SizeOfStackReserve;DWORD SizeOfStackCommit;DWORD SizeOfHeapReserve;DWORD SizeOfHeapCommit;DWORD LoaderFlags;DWORD NumberOfRvaAndSizes;IMAGE_DATA_DIRECTORY DataDirectory[0];因为刚好第一个DataDirectory内容都是0,满足我们的要求.剩下的就需要找一个8字节大小的空间,要求第一个4字节改变不会影响程序运行(这里用来保存第一个IAT的地址),第二个4字节内容为0. 这里用来存放IMAGE_IMPORT_DESCRIPTOR 的OriginalFirstThunk 和FirstThunk ,根据需求来看,这两个地址显然可以相等.很幸运的是IMAGE_IMPORT_DESCRIPTOR 自己的结构就满足这样的要求:typedef struct _IMAGE_IMPORT_DESCRIPTOR{union{DWORD Characteristics;DWORD OriginalFirstThunk;};DWORD TimeDateStamp;DWORD ForwarderChain;DWORD Name;DWORD FirstThunk;} IMAGE_IMPORT_DESCRIPTOR;当ForwarderChain为0的时候,TimeDateStamp偏移就可以用来存放我们需要的IAT地址.OK,现在还剩下两个地方没有解决:dll名字以及导入函数的名字.和上面一样,我们还是到已有的结构里面去找可以填充的空间:Dll名字存放要求很简单,后面有一个'\0'结尾,然后填充内容不影响程序运行.IMAGE_SECTION_HEADER好像可以满足我们的要求:DWORD PointerToRelocations;DWORD PointerToLinenumbers;WORD NumberOfRelocations;WORD NumberOfLinenumbers;DWORD Characteristics;一共有12字节存放我们的dll名字,同时Characteristics 还有后1为可以供存放,所以一共有13字节,保存"Kernel32.dll"刚刚好.IMAGE_FILE_HEADER 结构也有12字节空间: DWORD TimeDateStamp; //+8 可以随便填DWORD PointerToSymbolTable; //+12DWORD NumberOfSymbols; //+16我们就在这里容纳我们的函数名就可以了.这样整个IMAGE_IMPORT_DESCRIPTOR 结构和import表其他内容就被我们拆散整合到已有的结构里面去了.接着我们再优化一下shellcode, 使用msvcrt.dll的printf 来输出信息.这样,经过精心裁减后,整个PE文件大小为224字节,其中汇编代码占了28字节.最终结果:00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F00000000h: 4D 5A 90 00 03 00 00 00 04 00 00 00 50 45 00 00 ; MZ?........PE..00000010h: 4C 01 01 00 00 00 70 72 69 6E 74 66 00 00 00 00 ; L.....printf....00000020h: 70 00 0F 01 0B 01 06 00 00 00 00 00 00 00 00 00 ; p...............00000030h: 00 00 00 00 C0 00 00 00 00 00 00 00 0C 0000 00 ; ....?..........00000040h: 00 00 40 00 10 00 00 00 10 00 00 00 04 00 00 00 ; ..@.............00000050h: 00 00 00 00 04 00 00 00 00 00 00 00 00 10 00 00 ; ................00000060h: 00 00 00 00 00 00 00 00 03 00 6E 00 00 00 14 00 ; ..........n.....00000070h: 00 00 00 00 00 00 AC 00 00 00 6E 00 00 00 00 00 ; ......?..n.....00000080h: 02 00 00 00 00 00 00 00 00 00 00 00 6A 00 00 00 ; ............j...00000090h: 14 00 00 00 2E 74 65 78 74 00 00 00 00 08 00 00 ; .....text.......000000a0h: 00 00 00 00 00 08 00 00 00 00 00 00 6D 73 76 63 ; ............msvc000000b0h: 72 74 2E 64 6C 6C 00 00 20 00 10 E0 00 00 00 00 ; rt.dll.. ..?...000000c0h: 50 68 72 6C 64 0A 68 6F 2C 77 6F 68 68 65 6C 6C ; Phrld.ho,wohhell000000d0h: 54 B0 6E 03 43 08 FF 10 83 C4 14 C3 00 00 00 00 ; T皀.C.?.兡.?... 注意,这个PE文件是不能直接被windbg(6.3.0017.0)调试器直接启动的,要想调试代码可以在汇编代码前加上int 3(0xcc)来调试.5.过程五:最后,来考虑一下我们文件的对齐IMAGE_OPTIONAL_HEADER.SectionAlignment和IMAGE_OPTIONAL_HEADER.FileAlignment, 既然要求是2的幂,那么我们完全可以用2的0次方即1来做我们的alignment.最终生成的EXE又瘦身了,大小仅为216字节,其中包括28字节的汇编代码00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F00000000h: 4D 5A 90 00 03 00 00 00 04 00 00 00 50 45 00 00 ; MZ?........PE..00000010h: 4C 01 01 00 00 00 70 72 69 6E 74 66 00 00 00 00 ; L.....printf....00000020h: 70 00 0F 01 0B 01 06 00 00 00 00 00 00 00 00 00 ; p...............00000030h: 00 00 00 00 BC 00 00 00 00 00 00 00 0C 00 00 00 ; ....?..........00000040h: 00 00 40 00 01 00 00 00 01 00 00 00 04 00 0000 ; ..@.............00000050h: 00 00 00 00 04 00 00 00 00 00 00 00 00 10 00 00 ; ................00000060h: 00 00 00 00 00 00 00 00 03 00 6E 00 00 00 14 00 ; ..........n.....00000070h: 00 00 00 00 00 00 AC 00 00 00 6E 00 00 00 00 00 ; ......?..n.....00000080h: 02 00 00 00 00 00 00 00 00 00 00 00 6A 00 00 00 ; ............j...00000090h: 14 00 00 00 2E 74 65 78 74 00 00 00 00 08 00 00 ; .....text.......000000a0h: 00 00 00 00 00 08 00 00 00 00 00 00 6D 73 76 63 ; ............msvc000000b0h: 72 74 2E 64 6C 6C 00 00 20 00 10 E0 50 68 72 6C ; rt.dll.. ..郟hrl000000c0h: 64 0A 68 6F 2C 77 6F 68 68 65 6C 6C 54 B0 6E 03 ; d.ho,wohhellT皀.000000d0h: 43 08 FF 10 83 C4 14C3 ; C.?.兡.?五. 后记.理论上来说,后面的汇编代码部分可以用任意自己的代码来填充,只要获得了kernel32.dll的GetProcAddress函数的地址,那书写自己控制的代码并不是问题,而代码长度部分可以由IMAGE_SECTION_HEADER的SizeOfRawData来控制. 我没有试过,不过相信用188字节的PE头结构写出的PE文件一定很cool. PE头还可以减小吗?你想,你能.最后祝大家中秋快乐!六.参考.1.MSDN.2.winnt.h3.watercloud<<手工打造微型Win32可执行文件>>/articles/200302/482.html posted on 2007-05-14 00:46 叶子阅读(1307) 评论(0)编辑收藏引用所属分类: 技术研究。
自己构建PE文件
自己构建PE文件现在我将演示一个简单且具有一般性的标准PE文件(畸形的PE将来做壳开发的时候再做研究,现在我们只关心标准PE)的构造过程。
为简单起见,我们只关心必不可缺的结构和成员(eg。
),其他成员一律定义为0,具体含义请自己参考微软官方提供的PECOFF 规范(英文)。
个人认为PE文件结构的结构太复杂成员太多,这样才比较容易接受。
首先还是老生常谈的PE的结构,如下图所示:1.DOS 头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;我们只关心第一个和最后一个这2个变量e_magic(WORD)必须等于0x5A4D。
教你如何手工打造一个完美的WinPE3.0步骤
教你如何手工打造一个完美的WinPE3.0步骤教你如何手工打造一个完美的WinPE3.0步骤WinPE,全称Windows Preinstallation Environment即Windows预安装环境,它不是一个常规用途的操作系统,无法作为日常工作使用,而是常作为安装、故障排除和恢复的一种工具。
下面高手就来教教大家如何自己动手来制作一个完美的WinPE3.0。
一、具体制作方法:1、把windows7光盘(或光盘镜像)里的sourcesboot.wim文件复制到d:winpesources目录2、在附件提供imgaex目录里右键点击inf文件,选安装。
(Imagex 6.0 AIK 封装工具)3、运行cmd,进入imgaex目录。
4、imagex /mountrw d:winpesourcesboot.wim 2 d:winpenew (将d:winpesourcesboot.wim镜像映射到d:winpenew目录)5、删除d:winpenew根目录下的setup.exe文件。
删除sources文件夹,很重要,可以精简winpe哟。
6、imagex /unmount /commit d:winpenew (合并对d:winpenew目录中映像文件的修改,并将其卸载)7、imagex /compress maximum /export “d:winpesourcesboot.wim” 2 “d:winpepe3boot.wim”,把boot.wim分离并重新压缩。
7、d:winpepe3boot.wim即为修改后的镜像。
这个时候运行这个映像winpe是默认的“命令提示符”窗口。
二、制作PE光盘镜像:1. 新建d:winpepe,新建d:winpepesources2. 复制(windows7光盘为X)X:boot目录(包括文件)到d:winpepe复制X:efi目录(包括文件)到d:winpepe复制X:bootmgr文件到d:winpepe复制修改后的boot.wim文件到d:winpepesources(X为windows7光盘符)3. 用UltraISO提取windows7光盘引导文件,保存为windows7.bif4. 用UltraISO将d:winpepe下的目录和文件添加到光盘镜像,加载windows7.bif,保存镜像为PE 3.0.iso三、图像shell(下面内容来自M$)Winpeshl.ini 可控制是否将自定义外壳程序加载到Windows PE 而不是默认的“命令提示符”窗口。
PE文件图标手工修改及原理分析
PE文件图标手工修改及原理分析摘要:摘要可执行文件即exe文件是我们日常使用电脑时最常使用的一种文件类型,不同的exe文件有各式各样的图标,但是我们从网上下载的文件的图标基本都是固定的。
本文首先通过对PE文件格式、图标文件格式以及PE文件中的图标资源的格式进行分析,然后手动实现了对PE文件图标的修改。
关键词:关键字PE文件图标手动修改引言在日常计算机使用中大家最常使用的文件就是exe文件,在大家使用exe文件时我们第一眼注意到的就是文件的图标。
但是有多少人曾经考虑过将exe图标改成自己更喜欢的、有个性的图标呢?Internet上确实存在一些现成的PE文件图标修改工具,然而拿来主义毕竟没法给我们带来更多的成就感,本文的主要目的就是通过对PE文件格式[1]、图标文件格式以及PE文件中的图标资源的格式进行分析,然后手工实现对PE文件图标的修改。
在本文进行手动修改PE文件图标时主要使用到三个工具:PEView、Ultraedit和IconCool Editor,下面将依次进行简单介绍。
1.1 PEViewPEView是一款很好的PE文件分析器,可以用来查看PE文件中各个结构的偏移位置以及具体内容。
在本文所做的工作中,PEView主要用于查看PE文件资源节的地址、相关结构体地址以及图标资源地址。
1.2 UltraeditUltraEdit是一套功能强大的文本编辑器,可以编辑文本、十六进制、ASCII码。
在本文工作中该工具主要用来对PE文件和图标文件的内容进行查看并修改。
1.3 IconCool EditorIconCool Editor是一个Icon编辑的工具软件,其使用容易,可以改变色彩由单色到32位真彩色。
在本文的工作中主要使用该工具手工制作自己喜欢的,且指定大小、颜色位数的icon图标。
2. 图标修改相关原理.ico文件为图标文件,是多张不同格式图片的集合。
该文件的格式包含两个部分,ICO头和图标数据。
PE制作教程(三)
WIN8 WIN7 PE制作教程1. 序言 (2)2. 目录 (2)3. 背景知识 (2)3.1 什么是windwos PE (2)3.2 Windows PE 启动过程 (3)3.3 Windows操作系统启动过程 (4)3.4 如何制作Win8PE,Win7PE (4)4. 全手工制作Win8PE,Win7PE (5)4.1 必备的文件和工具 (5)4.2 1 准备WinPE本身需要的文件 (6)4.3 2 获取所需文件权限 (6)4.4 3 注册表修改 (7)4.5 4.打包测试 (7)4.5.1 4.1.1 原版的BOOT.WIM启动效果 (7)4.5.2 4.1.2WimTool直接解开BOOT.WIM,再打包的启动效果 (8)4.5.3 4.1.3 修改的BOOT.WIM启动效果 (9)4.5.4 4.2 必要的精简 (10)4.6 5 添加explorer (20)4.6.1 5.1 修改注册表 (20)4.6.2 5.2 准备文件 (21)4.7 6 explorer的初步完善 (23)4.7.1 6.1?explorer 的个性化设置 (23)4.7.2 6.2 win7主题的启用 (24)4.8 7 通过winpe自带的几个小程序实现一些常用功能 (25)4.8.1 7.1 驱动的加载程序 (25)4.8.2 7.2 winpe工具—Wpeutil.exe (26)4.8.3 7.3 winpe的初始化设置—Wpeinit.exe (26)4.8.4 7.4 explorer的自动载入—Winpeshl.exe (27)4.9 8 使用windows的其他功能和设置 (28)4.10 9 一些需要注意的一些地方和其他程序的加入 (29)4.11 10 用PECMD取代winpeshl (30)4.12 11 PECMD.INI中的常用命令解释 (31)1. 序言网上的PE各有各的特点,每一个都或多或少存在一些问题,要么是内核陈旧,不支持新的win8和win8.1,要么是不支持64位,要么界面太丑,要么兼容性不好,要么内置的PE软件不安全等等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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个区块。