分享
 
 
 

PE.EXE

王朝百科·作者佚名  2010-01-10
窄屏简体版  字體: |||超大  

PE 的意思就是 Portable Executable(可移植的执行体)。它是 Win32环境自身所带的执行体文件格式。它的一些特性继承自 Unix的 Coff (common object file format)文件格式。"portable executable"(可移植的执行体)意味着此文件格式是跨win32平台的 : 即使Windows运行在非Intel的CPU上,任何win32平台的PE装载器都能识别和使用该文件格式。当然,移植到不同的CPU上PE执行体必然得有一些改变。所有 win32执行体 (除了VxD和16位的Dll)都使用PE文件格式,包括NT的内核模式驱动程序(kernel mode drivers)。因而研究PE文件格式给了我们洞悉Windows结构的良机。

==================

PE病毒是指所有感染Windows下PE文件格式文件的病毒.

PE病毒大多数采用Win32汇编编写.

PE病毒对于一个热衷于病毒技术的人来说,是必须掌握的.

只有在PE病毒中,我们才能真正感受到高超的病毒技术.

编写Win32病毒的几个关键

Api函数的获取

不能直接引用动态链接库

需要自己寻找api函数的地址,然后直接调用该地址

一点背景:在PE Loader装入我们的程序启动后堆栈顶的地址是是程序的返回地址,肯定在Kernel中! 因此我们可以得到这个地址,然后向低地址缩减验证一直到找到模块的起始地址,验证条件为PE头不能大于4096bytes,PE header的ImageBase值应该和当前指针相等.

病毒没有.data段,变量和数据全部放在.code段

编写Win32病毒的几个关键

偏移地址的重定位

Call delta

delta: pop ebp

sub ebp,offset delta

那么变量var1的真正偏移地址为:var1+ebp

对PE文件格式的了解

编写Win32病毒的几个关键

病毒如何感染其他文件

在文件中添加一个新节

该新节中添加病毒代码和病毒执行后的返回Host程序的代吗

修改文件头中代码开始执行位置(AddressOfEntryPoint)指向新添加的节,以便程序运行后先执行病毒代码.

PE病毒感染其他文件的方法还有很多,譬如PE病毒还可以将自己分散插入到每个节的空隙中等等,这里不在一一叙述.

PE文件格式一览

Section n

Section ...

Section 2

Section 1

Section table

PE header

DOS stub

DOS MZ header

PE header

Pe header 由三部分组成

字串 "PE"(Signature)

映像文件头(FileHeader)

可选映像头(OptionalHeader)

字串 "PE"

Signature 一dword类型,值为50h, 45h, 00h, 00h(PE). 本域为PE标记,我们可以此识别给定文件是否为有效PE文件.

这个字串在文件中的位置(e_lfanew),可以在DOS程序头中找到它的指针,它占用四个字节,位于文件开始偏移3CH字节中.

映像文件头

该结构域包含了关于PE文件物理分布的信息, 比如节数目,文件执行机器等.

它实际上是结构IMAGE_FILE_HEADER的简称.

映像文件头结构

IMAGE_FILE_HEADER STRUCT

___ Machine WORD

___ NumberOfSections WORD

___ TimeDateStamp dd

___ PointerToSymbolTable dd

___ NumberOfSymbols dd

___ SizeOfOptionalHeader WORD

___ Characteristics WORD

IMAGE_FILE_HEADER ENDS

映像文件头的基本信息

关于文件信息的标记,比如文件是exe还是dll

2

Characteristics *

7

可选头的大小

2

SizeOfOptionalHeader

6

符号数目

4

NumberOfSymbols

5

COFF符号表的偏移

4

PointerToSymbleTable

4

生成该文件的时间

4

TimeDataStamp

3

文件中节的个数

2

NumberOfSection **

2

机器类型,x86为14ch

2

Machine *

1

描述

大小(字节)

名字

顺序

可选映像头

optional header 结构是 IMAGE_NT_HEADERS 中的最后成员.包含了PE文件的逻辑分布信息.该结构共有31个域,一些是很关键,另一些不太常用.这里只介绍那些真正有用的域.

这儿有个关于PE文件格式的常用术语: RVA

RVA 代表相对虚拟地址.它是相对虚拟空间里的一个地址 .

举例说明,如果PE文件装入虚拟地址(VA)空间的400000h处,且进程从虚址401000h开始执行,我们可以说进程执行起始地址在RVA 1000h.每个RVA都是相对于模块的起始VA的.

可选映像头

文件中节对齐的粒度.

FileAlignment

内存中节对齐的粒度.

SectionAlignment

PE文件的优先装载地址.比如,如果该值是400000h,PE装载器将尝试把文件装到虚拟地址空间的400000h处.若该地址区域已被其他模块占用,那PE装载器会选用其他空闲地址.

ImageBase

PE装载器准备运行的PE文件的第一个指令的RVA.若要改变整个执行的流程,可以将该值指定到新的RVA,这样新RVA处的指令首先被执行.

AddressOfEntryPoint *

描述

名字

可选映像头

NT用来识别PE文件属于哪个子系统.

Subsystem

一IMAGE_DATA_DIRECTORY 结构数组.每个结构给出一个重要数据结构的RVA,比如引入地址表等.

DataDirectory

所有头+节表的大小,也就等于文件尺寸减去文件中所有节的尺寸.可以以此值作为PE文件第一节的文件偏移量.

SizeOfHeaders

内存中整个PE映像体的尺寸.

SizeOfImage

win32子系统版本.若PE文件是专门为Win32设计的,该子系统版本必定是4.0否则对话框不会有3维立体感.

MajorSubsystemVersion

MinorSubsystemVersion

描述

名字

DataDirectory数据目录

一个IMAGE_DATA_DIRECTORY数组,里面放的是这个可执行文件的一些重要部分的RVA和尺寸,目的是使可执行文件的装入更快,数组的项数由上一个域给出.IMAGE_DATA_DIRECTORY包含有两个域,如下:

IMAGE_DATA_DIRECTORY

VitualAddress DD

Size DD

IMAGE_DATA_DIRECTORY ENDS

节表

节表其实就是紧挨着 PE header 的一结构数组.该数组成员的数目由 file header (IMAGE_FILE_HEADER) 结构中 NumberOfSections 域的域值来决定.节表结构又命名为 IMAGE_SECTION_HEADER.

结构中放的是一个节的信息,如名字,地址,长度,属性等.

IMAGE_SECTION_HEADER

本节原始数据在文件中的位置

4

PointerToRawData *

5

本节的原始尺寸

4

SizeOfRawData *

4

这个值+映像基地址=本节在内存中的真正地址.OBJ中无意义.

4

Virtual *

3

OBJ文件用作表示本节物理地址EXE文件中表示节的真实尺寸

4

PhysicalAddress或VirtualSize

2

节名

8

Name *

1

描述

大小(字节)

名字

顺序

IMAGE_SECTION_HEADER

节属性

4

Characteristics *

10

本节在行号表中的行号数目

2

NumberOfLinenumbers

9

本节要重定位的数目

2

NumberOfRelocations

8

行号偏移

4

PointerToLinenumbers

7

OBJ中表示该节重定位信息的偏移EXE文件中无意义

4

PointerToRelocations

6

描述

大小(字节)

名字

顺序

"节(Section)"跟在节表之后,一般PE文件都有几个"节".比较常见的有:

代码节

已初始化的数据节

未初始化的数据节

资源节

引入函数节

引出函数节

代码节

代码节一般名为.text或CODE,该节含有程序的可执行代码.

每个PE文件都有代码节

在代码节中,还有一些特别的数据,是作为调用映入函数之用.如:

Call MessageBoxA的调用,反汇编后该指令被换为call 0040101A,而地址0040101A仍在.text中,它放有一个跳转指令jmp dword ptr[0040304c],即这条跳转指令的目的地址处于.idata节中的0040304C处,其中放的才是MessageBoxA的真正地址,如下图:

已初始化的数据节

这个节一般取名为.data或DATA

已初始化的数据节中放的是在编译时刻就已确定的数据.如Hello World 中的字符串"Hello World!".

未初始化的数据节

这个节的名称一般叫.bbs.

这个节里放有未初始化的全局变量和静态变量.

资源节

资源节一般名为.rsrc

这个节放有如图标,对话框等程序要用到的资源.

资源节是树形结构的,它有一个主目录,主目录下又有子目录,子目录下可以是子目录或数据.

都是一个IMAGE_RESOURCE_DIRECTORY结构.结构如下:

IMAGE_RESOURCE_DIRECTORY 结构

以ID标识的资源数

2

NumberOfldEntries

6

以名字标识的资源数

2

NumberOfNamedEntries

5

次版本号

2

MinorVersion

4

主版本号

2

MajorVersion

3

资源生成时间

4

TimeDateStamp

2

通常为0

4

Characteritics

1

描述

大小(字节)

名字

顺序

引入函数节

一个引入函数是被某模块调用的但又不在调用者模块中的函数

这个节一般名为.idata,也叫引入表.

它包含从其它(系统或第三方写的)DLL中引入的函数,例如user32.dll,gdi32.dll等.

它的开始是一个IMAGE_IMPORT_DESCRIPTOR数组.这个数组的长度不定,但他的最后一项是全0,可以以此判断数组的结束.

引出函数节

什么是引出函数节

引出函数节是用来向系统提供导出函数的名称,序号和入口地址等信息,以便Windows装载器通过这些信息来完成动态链接的过程.

了解引出函数节对于学习病毒来说,是极为重要的.

Api函数地址的获取与引出函数节息息相关.

引出函数节

通过Api函数名查找其地址

(1)定位到PE文件头

(2)从PE文件头中的课选文件头中取出数剧目录表的第一个数据目录,得到导出表的地址.

(3)从导出表的NumberOfNames字段得到以命名函数的总数,并以这个数字做微循环的次数来构造一个循环.

(4)从AddressOfNames字段指向的函数名称地址表的第一项开始,在循环中将每一项定义的函数名与要查找的函数名比较,如果没有任何一个函数名符合,说明文件中没有指定名称的函数.

(5)如果某一项定义的函数名与要查找的函数名符合,那么记住这个函数名在字符串地址表中的索引值,然后在AddressOfNameOrdinals指向的数组中以同样的索引值去除数组项的值,假如该值为m.

(6)以m值作为索引值,在AddressOfFunctions字段指向的函数入口地址表中获取的RVA就是函数的入口地址,当函数被装入内存后,这个RVA值加上模块实际装入的基址(ImageBase),就得到了函数真正的入口地址

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有