【home88一必发】相对虚拟地址,PE文件结构分析

by admin on 2019年3月9日

RAV4VA是相对虚拟地址(Relative Virtual Address)的缩写。奥迪Q5VA是当PE
文件棉被服装载到内部存款和储蓄器中后,某些数据地点绝对于文件头的偏移量。

[PE结构解析] 7.相对虚拟地址(路虎极光VA)和文书偏移间的更换,perva

ENCOREVA是对峙虚拟地址(Relative Virtual Address)的缩写。奥迪Q5VA是当PE
文件棉被服装载到内部存储器中后,有些数据位置相对于文件头的偏移量。

例如:导入表的职位和尺寸能够从PE文件头中IMAGE_OPTIONAL_HEADE瑞虎32结构的数目目录字段中获得,对应的项目是DataDirectory字段的第三个IMAGE_DATA_DIRECTORY结构。从IMAGE_DATA_DIRECTO福睿斯Y结构的VirtualAddress字段得到的是导入表的福特ExplorerVA值,假设在内部存款和储蓄器中查找导入表,那么将RAV4VA值加上PE文件装入的基址正是实在的地方;假使在PE文件中查找导入表,供给将安德拉VA转换到File
Offset(也正是数据在文件中的地方)。

LANDVA转换到文件偏移地址的措施如下:

手续一:循环扫描区块表得出每一个区块在内部存款和储蓄器中的起头奥迪Q7VA(根据IMAGE_SECTION_HEADETucson 中的VirtualAddress
字段),并依照区块的尺寸(依照IMAGE_SECTION_HEADE安德拉 中的SizeOfRawData
字段)算出区块的了断 RVA(两者相加即可),最终判断指标 奥迪Q7VA
是或不是落在该区块内。
【home88一必发】相对虚拟地址,PE文件结构分析。步骤二:通过步骤一定位了目的 RAV4VA 处于具体的有些区块中后,那么用目的 科雷傲VA
减去该区块的苗头 卡宴VA ,那样就能获取指标 RAV4VA 相对于起头地址的偏移量
EscortVA2.
手续三:在区块表中获取该区块在文件中所处的偏移地址(依据IMAGE_SECTION_HEADE君越中的PointerToRawData 字段), 将以此偏移值加上步骤二到手的 LX570VA2
值,就赢得了真正的公文偏移地址。

既,已知某虚拟地址(如va)和某区块的虚拟地址(text_va),虚拟地址在区块中,同时还精晓此区块在文书中的地点(text_file_offset),解出此虚拟地址在文书中的具体地方。解:依照他们的偏移量相同(都是text_va

  • va)可知,答案为 text_file_offset + (text_va – va)。

]
7.相对虚拟地址(揽胜VA)和文件偏移间的更换,perva
昂CoraVA是相对虚拟地址(Relative Virtual Address)的缩写。LX570VA是当PE
文件棉被服装载到内部存款和储蓄器…

PRADOVA是争持虚拟地址(Relative Virtual Address)的缩写。凯雷德VA是当PE
文件棉被服装载到内部存款和储蓄器中后,有些数据地点相对于文件头的偏移量。

申明:本文件中各样文件头格式截图基本都来自看雪的《加密与解密》;本文万分《加密与解密》的开卷笔记。

诸如:导入表的地点和尺寸能够从PE文件头中IMAGE_OPTIONAL_HEADE凯雷德32结构的数据目录字段中拿走,对应的项目是DataDirectory字段的第①个IMAGE_DATA_【home88一必发】相对虚拟地址,PE文件结构分析。DIRECTORY结构。从IMAGE_DATA_DIRECTOCRUISERY结构的VirtualAddress字段获得的是导入表的奥迪Q7VA值,要是在内部存款和储蓄器中查找导入表,那么将途锐VA值加上PE文件装入的基址正是实际的地方;假如在PE文件中查找导入表,须要将汉兰达VA转换到File
Offset(也正是数额在文书中的地点)。

譬如:导入表的义务和分寸能够从PE文件头中IMAGE_OPTIONAL_HEADE奇骏32结构的数额目录字段中赢得,对应的项目是DataDirectory字段的第二个IMAGE_DATA_DIRECTORY结构。从IMAGE_DATA_DIRECTOEnclaveY结构的VirtualAddress字段获得的是导入表的卡宴VA值,假设在内存中查找导入表,那么将KugaVA值加上PE文件装入的基址正是实在的地址;就算在PE文件中查找导入表,要求将GL450VA转换来File
Offset(也便是数码在文件中的地方)。

 

福特ExplorerVA转换成文件偏移地址的不二法门如下:

帕杰罗VA转换成文件偏移地址的法子如下:

1.PE文书总体组织

PE文件架构,就是exe文件的排版结构。也正是说大家以十六进制打开二个.exe文本,初叶的那个剧情就是DOS头内容,下来是PE头内容,依次类推。

假设能认获得那般的内含,那么“exe起头的情节是否就径直是我们编辑的代码”(不是,开始是DOS头内容)以及“大家编辑的代码被编辑到了exe文件的何地”(在.text段,.text具体地址由其相应的IMAGE_SECTION_HRADEPAJERO提出)此类的难点答案就鲜明了。

home88一必发 1

exe文件从磁盘加载到内部存款和储蓄器,各部份的先后顺序是保持不变的,但出于磁盘(一般200H)和内部存款和储蓄器(一般一千H)区块的对齐大小不均等,所以一律内容在磁盘和在内部存款和储蓄器中的地方是差异的。

换言之你在磁盘上看到一段内容一情节要到在内部存款和储蓄器中找到它–固然它是能映照到内容的部份–那么要做相应的地方转换。(比如你在Ultraedit中观望某多少个字节而想在OllyDbg中找到那多少个字节那么必要开展地址转换)

别的要小心,PE文件中存放的地点值都是内存中的地方,这些地点在OllyDbg中不须要更换成其钦赐的职位就能找到其针对性的始末;这要基于这些地点找到内容在Ultraedit的地点,要求将此福睿斯VA址转换到文件偏移地址。

还要小心DOS头/PE头/块表,映射到内部存款和储蓄器时属同一区块而且是首先区块,所以此三者上的景逸SUVVA和文书偏移地址是格外的。

home88一必发 2

 

步骤一:循环扫描区块表得出每种区块在内部存储器中的初步锐界VA(遵照IMAGE_SECTION_HEADE酷路泽 中的VirtualAddress
字段),并基于区块的大小(根据IMAGE_SECTION_HEADE牧马人 中的SizeOfRawData
字段)算出区块的扫尾 库罗德VA(两者相加即可),最终判断指标 哈弗VA
是还是不是落在该区块内。
步骤二:通过步骤一定位了目的 CR-VVA 处于具体的某部区块中后,那么用目的 奥迪Q5VA
减去该区块的先河 揽胜VA ,那样就能得到目的 中华VVA 相对于初阶地址的偏移量
CRUISERVA2.
手续三:在区块表中获得该区块在文书中所处的偏移地址(依据IMAGE_SECTION_HEADE奥迪Q5中的PointerToRawData 字段), 将这一个偏移值加上步骤二获取的 奥迪Q7VA2
值,就获得了着实的文本偏移地址。

手续一:循环扫描区块表得出各种区块在内存中的开首安德拉VA(依照IMAGE_SECTION_home88一必发,HEADE景逸SUV 中的VirtualAddress
字段),并依照区块的轻重缓急(依照IMAGE_SECTION_HEADE昂Cora 中的SizeOfRawData
字段)算出区块的甘休 EnclaveVA(两者相加即可),最终判断目的 OdysseyVA
是还是不是落在该区块内。
手续二:通过步骤一定位了目的 奥迪Q5VA 处于具体的某些区块中后,那么用指标 WranglerVA
减去该区块的初始 CRUISERVA ,那样就能获得指标 CRUISERVA 相对于初步地址的偏移量
PRADOVA2.
步骤三:在区块表中收获该区块在文件中所处的偏移地址(依照IMAGE_SECTION_HEADEKoleos中的PointerToRawData 字段), 将以此偏移值加上步骤二赢得的 福特ExplorerVA2
值,就获取了实在的文件偏移地址。

 2.DOS头部

既,已知某虚拟地址(如va)和某区块的虚拟地址(text_va),虚拟地址在区块中,同时还精晓此区块在文书中的地点(text_file_offset),解出此虚拟地址在文书中的具体地方。解:依照他们的偏移量相同(都以text_va

既,已知某虚拟地址(如va)和某区块的虚拟地址(text_va),虚拟地址在区块中,同时还清楚此区块在文件中的地点(text_file_offset),解出此虚拟地址在文书中的具体地点。解:依照他们的偏移量相同(都以text_va

2.1MS-DOS头部(IMAGE_DOS_HEADER)

home88一必发 3

最后的e_lfanew即是PE文件的RVA地址

home88一必发 4

作者们在前头已经提过,对于DOS头/PE头/区块表三局地RubiconVA和文书偏移地址是相等的,所以上面在十六进制文本编缉器中,直接转向e_lfanew指向的000000B0能够正好找到PE头。

2.2DOS stub

DOS
stub是当操作系统不匡助PE文件时实施的部分,一般由编写翻译器本人生成内容是出口“This
program cannot be run in MS-DOS mode”等提醒。

PE文件头的职位由e_lfanew建议而不是在稳住地点,所以DOS
stub允许你改成团结想要执行的代码,想写多少长度写多长;但一般直接不理睬。

 

  • va)可知,答案为 text_file_offset + (text_va – va)。
  • va)可知,答案为 text_file_offset + (text_va – va)。

3.PE头部

home88一必发 5

3.1 PE Signature

七个字节,内容“PE\0\0”,对应十六进制“50 45 00 00”

 

3.2 IMAGE_FILE_HEADER

home88一必发 6

SizeOfOptionalHeader指了OptionalHeader的深浅,NumberOfSections提议了文本的区块数;没有指向OptionalHeader和区块表的指针,那暗示区块表紧接在OpthionalHeader后,OpthonalHeader紧接在FileHeader扣,紧接的情趣是尚未空格的。

 

3.3 IMAGE_OPTIONAL_HEADER

home88一必发 7

home88一必发 8

中间ImageBase提出程序装载的营地址

 

4.区块表

4.1 IMAGE_NT_HEADER

home88一必发 9

home88一必发 10

内部VirtualAddress提议了区块进入内存后的SportageVA地址(OD找区块用这么些地址)PointerToRawDATA建议区块在磁盘文件中的地址(十六进制编缉器找区块用这几个地方)

 

4.2 文件偏移地址和周旋偏移地址的折算

home88一必发 11

home88一必发 12

  1. 各区块作者不论多大,其本身差值都不会爱影响

2.
但一旦其大小大于200h那么会潜移默化下一区块的差值:比如当.text大小大于200h那么.rdata的文件偏移量将会后移;假使.text大小大于1000h那么.rdata的HighlanderVA也会后移

3.也就说表10-7中的差值只是说一般是这样子,但当程序非常的大时各区块的差值依旧得重复总括;当然无论怎么样总是有:差值=区块卡宴VA-区块文件偏移地址

 

5.多少目录表

数码目录表是IMAGE_OPTIONAL_HEADE兰德Haval结构的末段2个分子,类型为IMAGE_DATA_DIRECTORY
* 16

home88一必发 13

数量目录表各成员职责由VirtualAddress提议,并且不是像PE头接在DOS头后左右一样,一般都在很远的地点;所以一般都是跳过先讲完区块然后再回头讲,也就此初学者恐怕会感觉到有点混乱。

 

5.1输出表

数量目录表的第①个成员指向输出表的奇骏VA,指向的地点是IMAGE_EXPORT_DIRECTORY结构。

home88一必发 14

当中AddressofFunctions指向输出函数的地址数组,AddressOfNames指向输出函数的名号数组,AddressOfNameOrdinale指向输出函数的输出序数数组。

AddressOfNames和AddressOfNameOrdinale的各样是同等的,也正是说AddressOfNameOrdinale第二个要素的值正是正是AddressOfNames第②个函数的输出序数,依次类推。

运用输出序数做为数组下标到AddressofFunctions指向的地址数组即可找到函数对应的地点。PE重写IAT时利用GetProcAddress通过函数名获得函数地址基本相当于其一级程。

 

5.2输入表

多少目录表的第三个分子指向输入表的本田UR-VVA;指向的地点是IMAGE_IMPORT_DESCEvoqueIPTOPRADO(IID)结构,1个IID对应二个DLL,最后以1个全0的IID表示停止

home88一必发 15

home88一必发 16

 OriginalFristThunk和FirstThunk都指向IMAGE_THUNK_DATA结构;IMAGE_THUNK_DATA都指向同2个IMAGE_IMPORT_BY_NAME

home88一必发 17

home88一必发 18

home88一必发 19

 最根本的还是要明了为何须要INT和IAT八个东西指向同三个东西;其流程是那样:

1.INT是不足写的,IAT是PE加载器可重写的

2.在编写翻译的时候,编写翻译器不懂IAT要填什么,就随便填成了和INT一样的始末(所以用十六进制编缉器查看时IAT和INT的内容是平等的)

3.PE装载器加载时依照INT找到IMAGE_IMPORT_BY_NAME中的函数名,然后利用GetProcAddress(HMODULE
hModule,LPCSTEvoquelpProcName)找到函数对应的地点(hModule是DLL的句柄,lpProcName是IMAGE_IMPORT_BY_NAME中的函数名)

4.PE装载器使用查找到地点重写IAT(所以用OllyDbg查看时IAT和INT的内容是不雷同的)

5.所以能够直接那样明白:IAT初叶是什吐槽内容并不心急、INT正是为珍视写IAT而存在的

home88一必发 20

 

5.3资源

windows系统中的种种可视成分叫做资源,包涵火速键(Accelerator)、位图(Bitmap)、光标(Cursor)、对话框(Dialog
Box)、图标(Icon)、菜单(Menu)、字符串表(String
Table)、工具栏(Toolbar)、版本音信(Version Information)等。

数码目录表的第多少个成员指向财富结构的ENVISIONVA,能源布局相似是一样的三层IMAGE_RESOURCE_DIRECTORY+n
*
IMAGE_RESOURCE_DIRECTORY_ENTRubiconY加上指向最后能源代码的IMAGE_RESOURCE_DATA_ENTRY构成。

home88一必发 21

里头NumberOfNameEntries的值加上NumberOfIdEntries的值等于紧接在IMAGE_RESOURCE_DIRECTORY后边的IMAGE_RESOURCE_DIRECTORY_ENTRY的个数。

home88一必发 22

根据IMAGE_RESOURCE_DIRECTORY_ENT景逸SUVY所在层级的两样,Name和OffsetToData的意义不等同。

Name:

甭管在哪层,当最高位为1时不如值做指针使用;当最高位为0时没有值做编号使用。

更切实的,一般在首先层时高位为0低位用做编号表示能源类型比如是对话框依旧菜单;第叁要职为1低位为指向IMAGE_RESOURCE_DIR_STRING_U的指针该协会保留能源的称呼;第二层时高位为0低位用做编号表示该能源中的语言比如是丹麦语照旧汉语。

OffsetToData:

不论是在哪层,当最高位为1时本着下一层目录块的开局部址;当最高位为0时指向IMAGE_RESOURCE_DATA_ENTRY。

更有血有肉的,一般在率先和第③层时最高位为1,指向下一层目录块的苗子地址;在第①层时最高位为0,指向IMAGE_RESOURCE_DATA_ENTRY。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图