?? lion-petut-c04.htm
字號:
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=gb_2312-80">
<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
<title>Iczelion的PE教程4: Optional Header</title>
</head>
<body bgcolor="#003366" text="#FFFFFF" link="#FFFFCC"
vlink="#FFCCCC" alink="#CCFFCC">
<h1 align="center"><font color="#FFFFCC"
face="Arial, Helvetica, sans-serif">PE</font><font
color="#FFFFCC">教程</font><font color="#FFFFCC"
face="Arial, Helvetica, sans-serif">4: Optional Header</font></h1>
<p><font size="2">我們已經學習了關于</font><font
size="2" face="MS Sans Serif"> DOS header </font><font size="2">和
</font><font size="2" face="MS Sans Serif">PE header </font><font
size="2">中部分成員的知識。這里是</font><font
size="2" face="MS Sans Serif"> PE header </font><font size="2">中最后、最大或許也是最重要的成員,</font><font
size="2" face="MS Sans Serif">optional header</font><font
size="2">。</font></p>
<p><font size="2">回顧一下,</font><font size="2"
face="MS Sans Serif">optional header </font><font size="2">結構是</font><font
size="2" face="MS Sans Serif"> </font><font color="#CCFFCC"
size="2" face="MS Sans Serif"><b>IMAGE_NT_HEADERS</b></font><font
size="2" face="MS Sans Serif"> </font><font size="2">中的最后成員。包含了</font><font
size="2" face="MS Sans Serif">PE</font><font size="2">文件的邏輯分布信息。該結構共有</font><font
size="2" face="MS Sans Serif">31</font><font size="2">個域,一些是很關鍵,另一些不太常用。這里只介紹那些真正有用的域。</font></p>
<p><font size="2">這兒有個關于</font><font size="2"
face="MS Sans Serif">PE</font><font size="2">文件格式的常用術語</font><font
size="2" face="MS Sans Serif">: RVA <br>
RVA </font><font size="2">代表相對虛擬地址。</font><font
size="2" face="MS Sans Serif"> 知道什么是虛擬地址嗎?相對那些簡單的概念而言,RVA有些晦澀。簡言之,RVA是虛擬空間中到參考點的一段距離。我打賭您肯定熟悉文件偏移量:
RVA就是類似文件偏移量的東西。當然它是相對虛擬空間里的一個地址,而不是文件頭部。舉例說明,如果PE文件裝入虛擬地址(VA)空間的400000h處,且進程從虛址401000h開始執行,我們可以說進程執行起始地址在RVA
1000h。每個RVA都是相對于模塊的起始VA的。<br>
為什么PE文件格式要用到RVA呢? 這是為了減少PE裝載器的負擔。因為每個模塊多有可能被重載到任何虛擬地址空間,如果讓PE裝載器修正每個重定位項,這肯定是個夢魘。相反,如果所有重定位項都使用RVA,那么PE裝載器就不必操心那些東西了:
它只要將整個模塊重定位到新的起始VA。這就象相對路徑和絕對路徑的概念: RVA類似相對路徑,VA就象絕對路徑。</font></p>
<table border="1" cellpadding="2">
<tr>
<th bgcolor="#006666"><font size="2" face="MS Sans Serif"><b>Field</b></font></th>
<th bgcolor="#006666"><font size="2" face="MS Sans Serif">Meanings</font></th>
</tr>
<tr>
<td align="center" bgcolor="#006666"><font size="2"
face="MS Sans Serif"><b>AddressOfEntryPoint</b></font></td>
<td align="center" bgcolor="#006666"><font size="2"
face="MS Sans Serif">PE裝載器準備運行的PE文件的第一個指令的RVA。若您要改變整個執行的流程,可以將該值指定到新的RVA,這樣新RVA處的指令首先被執行。</font></td>
</tr>
<tr>
<td align="center" bgcolor="#006666"><font size="2"
face="MS Sans Serif"><b>ImageBase</b></font></td>
<td align="center" bgcolor="#006666"><font size="2"
face="MS Sans Serif">PE文件的優先裝載地址。比如,如果該值是400000h,PE裝載器將嘗試把文件裝到虛擬地址空間的400000h處。字眼"優先"表示若該地址區域已被其他模塊占用,那PE裝載器會選用其他空閑地址。</font></td>
</tr>
<tr>
<td align="center" bgcolor="#006666"><font size="2"
face="MS Sans Serif"><b>SectionAlignment</b></font></td>
<td align="center" bgcolor="#006666"><font size="2"
face="MS Sans Serif">內存中節對齊的粒度。例如,如果該值是4096 (1000h),那么每節的起始地址必須是4096的倍數。若第一節從401000h開始且大小是10個字節,則下一節必定從402000h開始,即使401000h和402000h之間還有很多空間沒被使用。</font></td>
</tr>
<tr>
<td align="center" bgcolor="#006666"><font size="2"
face="MS Sans Serif"><b>FileAlignment</b></font></td>
<td align="center" bgcolor="#006666">
<p><font size="2"
face="MS Sans Serif">文件中節對齊的粒度。例如,如果該值是(200h),,那么每節的起始地址必須是512的倍數。若第一節從文件偏移量200h開始且大小是10個字節,則下一節必定位于偏移量400h:
即使偏移量512和1024之間還有很多空間沒被使用/定義。</font></p>
</td>
</tr>
<tr>
<td align="center" bgcolor="#006666"><font size="2"
face="MS Sans Serif"><b>MajorSubsystemVersion<br>
MinorSubsystemVersion </b></font></td>
<td align="center" bgcolor="#006666"><font size="2"
face="MS Sans Serif"> win32子系統版本。若PE文件是專門為Win32設計的,該子系統版本必定是4.0否則對話框不會有3維立體感。</font></td>
</tr>
<tr>
<td align="center" bgcolor="#006666"><font size="2"
face="MS Sans Serif"><b>SizeOfImage</b></font></td>
<td align="center" bgcolor="#006666"><font size="2"
face="MS Sans Serif">內存中整個PE映像體的尺寸。它是所有頭和節經過節對齊處理后的大小。 </font></td>
</tr>
<tr>
<td align="center" bgcolor="#006666"><font size="2"
face="MS Sans Serif"><b>SizeOfHeaders</b></font></td>
<td align="center" bgcolor="#006666"><font size="2"
face="MS Sans Serif">所有頭+節表的大小,也就等于文件尺寸減去文件中所有節的尺寸。可以以此值作為PE文件第一節的文件偏移量。</font></td>
</tr>
<tr>
<td align="center" bgcolor="#006666"><font size="2"
face="MS Sans Serif"><b>Subsystem</b></font></td>
<td align="center" bgcolor="#006666"><font size="2"
face="MS Sans Serif">NT用來識別PE文件屬于哪個子系統。 對于大多數Win32程序,只有兩類值: Windows GUI
和 Windows CUI (控制臺)。</font></td>
</tr>
<tr>
<td align="center" bgcolor="#006666"><font size="2"
face="MS Sans Serif"><b>DataDirectory</b></font></td>
<td align="center" bgcolor="#006666"><font size="2" face="MS Sans Serif">一</font><font
color="#CCFFCC" size="2" face="MS Sans Serif"><b>IMAGE_DATA_DIRECTORY
</b></font><font size="2" face="MS Sans Serif">結構數組。每個結構給出一個重要數據結構的RVA,比如引入地址表等。</font></td>
</tr>
</table>
<hr>
<p align="center"><font size="2"><b>翻譯:</b></font><font
size="2" face="MS Sans Serif"><b>iamgufeng [</b></font><a
href="http://win32asm.cjb.net/"><font size="2"
face="MS Sans Serif"><b>Iczelion's Win32 Assembly Homepage</b></font></a><font
size="2" face="MS Sans Serif"><b>]</b><strong>[</strong></font><a
href="http://asm.yeah.net"><font size="2" face="MS Sans Serif"><strong>LuoYunBin's
Win32 ASM Page</strong></font></a><font size="2"
face="MS Sans Serif"><strong>]</strong></font></p>
<p> </p>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -