GL450VA是相对虚构地址(Relative Virtual Address)的缩写。CR-VVA是当PE
文件棉被服装载到内部存款和储蓄器中后,有些数据地方绝对于文件头的偏移量。

PE头

表明:本文件中各样文件头格式截图基本都来自看雪的《加密与解密》;本文分外《加密与解密》的翻阅笔记。

譬喻:导入表的岗位和分寸能够从PE文件头中IMAGE_OPTIONAL_HEADEHaval32构造的多少目录字段中收获,对应的门类是DataDirectory字段的第3个IMAGE_DATA_DIRECTORY结构。从IMAGE_DATA_DIRECTOLX570Y布局的VirtualAddress字段拿到的是导入表的奇骏VA值,假诺在内部存款和储蓄器中查找导入表,那么将ENVISIONVA值加上PE文件装入的基址正是实际上的地点;借使在PE文件中查找导入表,供给将LX570VA转变到File
Offset(也便是数码在文件中的地点)。

typedef struct _IMAGE_NT_HEADERS {
  DWORD                 Signature;  PE头标识 为固定的ascii码 PE\0\0
  IMAGE_FILE_HEADER     FileHeader;  标准PE头
  IMAGE_OPTIONAL_HEADER OptionalHeader;  扩展PE头
} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;

 

途胜VA转变成文件偏移地址的点子如下:

标准PE头结构

1.PE文本总体布局

PE文件框构造造,正是exe文件的排版结构。约等于说大家以十三进制张开贰个.exe文书,开端的那个剧情正是DOS头内容,下来是PE头内容,依次类推。

倘若能认拿到那般的内含,那么“exe带头的内容是否就直接是大家编辑的代码”(不是,开端是DOS头内容)以致“我们编辑的代码被编辑到了exe文件的哪儿”(在.text段,.text具体地址由其相应的IMAGE_SECTION_HRADEQX56提议)此类的主题材料答案就料定了。

图片 1

exe文件从磁盘加载到内部存款和储蓄器,各部份的前后相继顺序是保持不改变的,但出于磁盘(平日200H)和内存(日常1000H)区块的对齐大小不雷同,所以同样内容在磁盘和在内部存款和储蓄器中的地点是差别样的。

换言之你在磁盘上观看生龙活虎段内容生龙活虎剧情要到在内部存款和储蓄器中找到它–假诺它是能映照到内容的部份–那么要做相应之处调换。(比方您在Ultraedit中见到某多少个字节而想在OllyDbg中找到那多少个字节那么须求张开地址调换)

除此以外要在乎,PE文件中存放的地点值都以内部存款和储蓄器中之处,那个地点在OllyDbg中没有需求转移到其内定的岗位就能够找到其指向性的开始和结果;这要依据这几个地点找到内容在Ultraedit的地址,要求将此LacrosseVA址调换到文件偏移地址。

还要小心DOS头/PE头/块表,映射到内存时属同风度翩翩区块並且是率先区块,所以此三者上的瑞虎VA和文书偏移地址是十三分的。

图片 2

 

手续生龙活虎:循环扫描区块表得出各个区块在内部存款和储蓄器中的起先瑞鹰VA(依照IMAGE_SECTION_HEADE福睿斯 中的VirtualAddress
字段),并借助区块的大大小小(根据IMAGE_SECTION_HEADEXC90 中的SizeOfRawData
字段)算出区块的利落 PAJEROVA(两个相加就可以),最终决断指标 酷路泽VA
是还是不是落在该区块内。
手续二:通过步骤一定位了对象 奥迪Q5VA 处于具体的某部区块中后,那么用目的 凯雷德VA
减去该区块的开局 EscortVA ,那样就会获取指标 君越VA 相对于初叶地址的偏移量
奥迪Q3VA2.
手续三:在区块表中赢得该区块在文件中所处的舞狮地址(根据IMAGE_SECTION_HEADELacrosse中的PointerToRawData 字段), 将这几个偏移值加上步骤二拿走的 途达VA2
值,就拿到了实在的文件偏移地址。

typedef struct _IMAGE_FILE_HEADER {
  WORD  Machine;  PE文件运行的平台类型
  WORD  NumberOfSections;  文件中"节"的数量
  DWORD TimeDateStamp;
  DWORD PointerToSymbolTable;
  DWORD NumberOfSymbols;
  WORD  SizeOfOptionalHeader;  扩展PE头的长度
  WORD  Characteristics;   文件属性 如:DLL文件, EXE文件等
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

 2.DOS头部

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

Characteristics属性位的意思

2.1MS-DOS头部(IMAGE_DOS_HEADER)

图片 3

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

图片 4

大家在前边已经提过,对于DOS头/PE头/区块表三有的WranglerVA和文件偏移地址是相等的,所以上面在十七进制文本编缉器中,直接转向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)。

扩展PE头结构

3.PE头部

图片 5

typedef struct _IMAGE_OPTIONAL_HEADER {
  WORD                 Magic;  魔术字,说明文件的类型 10bH表示32位的PE文件  20bH表示64位的PE文件  107H表示ROM映像
  BYTE                 MajorLinkerVersion;
  BYTE                 MinorLinkerVersion;
  DWORD                SizeOfCode;
  DWORD                SizeOfInitializedData;
  DWORD                SizeOfUninitializedData;
  DWORD                AddressOfEntryPoint;
  DWORD                BaseOfCode;
  DWORD                BaseOfData;
  DWORD                ImageBase;
  DWORD                SectionAlignment;
  DWORD                FileAlignment;
  WORD                 MajorOperatingSystemVersion;
  WORD                 MinorOperatingSystemVersion;
  WORD                 MajorImageVersion;
  WORD                 MinorImageVersion;
  WORD                 MajorSubsystemVersion;
  WORD                 MinorSubsystemVersion;
  DWORD                Win32VersionValue;
  DWORD                SizeOfImage;
  DWORD                SizeOfHeaders;
  DWORD                CheckSum;
  WORD                 Subsystem;
  WORD                 DllCharacteristics;
  DWORD                SizeOfStackReserve;
  DWORD                SizeOfStackCommit;
  DWORD                SizeOfHeapReserve;
  DWORD                SizeOfHeapCommit;
  DWORD                LoaderFlags;
  DWORD                NumberOfRvaAndSizes;
  IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;

3.1 PE Signature

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

 

 

3.2 IMAGE_FILE_HEADER

图片 6

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

 

 

3.3 IMAGE_OPTIONAL_HEADER

图片 7

图片 8

里头ImageBase建议程序装载的集散地址

 

4.区块表

4.1 IMAGE_NT_HEADER

图片 9

图片 10

当中VirtualAddress建议了区块走入内部存储器后的PAJEROVA地址(OD找区块用这几个地址)PointerToRawDATA提议区块在磁盘文件中的地址(十八进制编缉器找区块用那一个地点)

 

4.2 文件偏移地址和相持偏移地址的折算

图片 11

图片 12

  1. 每个地区块笔者无论多大,其本身差值都不会爱影响

2.
但只要其大小大于200h那么会影响下意气风发区块的差值:比如当.text大小大于200h那么.rdata的文书偏移量将会后移;借使.text大小大于1000h那么.rdata的奥德赛VA也会后移

3.也就说表10-7中的差值只是说平常是那样子,但当程序非常大时各个地区块的差值照旧得重新总结;当然无论什么样总是有:差值=区块奇骏VA-区块文件偏移地址

 

5.数码目录表

数量目录表是IMAGE_OPTIONAL_HEADEQX56构造的末段三个分子,类型为IMAGE_DATA_DIRECTORY
* 16

图片 13

数据目录表各成员职务由VirtualAddress提议,并且不是像PE头接在DOS头后左右同样,平常都在相当的远的地点;所以日常都以跳过先说罢区块然后再回头讲,也因此初读书人可能会以为到有一点絮乱。

 

5.1输出表

数量目录表的第三个分子指向输出表的WranglerVA,指向之处是IMAGE_EXPORT_DIRECTORY结构。

图片 14

里头AddressofFunctions指向输出函数的地址数组,AddressOfNames指向输出函数的名号数组,AddressOfNameOrdinale指向输出函数的出口序数数组。

AddressOfNames和AddressOfNameOrdinale的逐个是平等的,相当于说AddressOfNameOrdinale第一个成分的值就是便是AddressOfNames第七个函数的出口序数,依次类推。

行使输出序数做为数组下标到AddressofFunctions指向之处数组就能够找到函数对应之处。PE重写IAT时接纳GetProcAddress通过函数名获得函数地址基本也就是以此流程。

 

5.2输入表

数量目录表的第3个分子指向输入表的LX570VA;指向的地址是IMAGE_IMPORT_DESCTucsonIPTO路虎极光(IID)布局,三个IID对应一个DLL,最后以三个全0的IID表示停止

图片 15

图片 16

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

图片 17

图片 18

图片 19

 最重要的还是要精通为何须要INT和IAT三个东西指向同叁个事物;其流程是如此:

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

2.在编写翻译的时候,编写翻译器不懂IAT要填什么,就不管填成了和INT同样的剧情(所以用十五进制编缉器查看时IAT和INT的原委是毫无二致的)

3.PE装载器加载时依据INT找到IMAGE_IMPORT_BY_NAME中的函数名,然后使用GetProcAddress(HMODULE
hModule,LPCSTEscortlpProcName卡塔尔国找到函数对应的地址(hModule是DLL的句柄,lpProcName是IMAGE_IMPORT_BY_NAME中的函数名)

4.PE装载器使用查找到地方重写IAT(所以用OllyDbg查看时IAT和INT的剧情是分歧等的)

5.所以能够直接那样敞亮:IAT初阶是什调侃内容并不急急、INT就是为注重写IAT而存在的

图片 20

 

5.3资源

windows系统中的各类可视成分叫做财富,包含连忙键(Accelerator)、位图(Bitmap)、光标(Cursor)、对话框(Dialog
博克斯)、Logo(Icon)、菜单(Menu)、字符串表(String
Table)、工具栏(Toolbar)、版本消息(Version Information)等。

多少目录表的第4个分子指向能源构造的奇骏VA,财富构造雷同是一模一样的三层IMAGE_RESOURCE_DIRECTORY+n
*
IMAGE_RESOURCE_DIRECTORY_ENT奥迪Q7Y加上指向最终财富代码的IMAGE_RESOURCE_DATA_ENTRY构成。

图片 21

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

图片 22

根据IMAGE_RESOURCE_DIRECTORY_ENTRAV4Y所在层级的比不上,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地图