⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lion-petut-c03.htm

📁 在DOS下编程因为实模式的限制
💻 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教程3: File 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">3: File Header </font><font
color="#FFFFCC">(文件头)</font></h1>

<p><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">file header</font><font size="2">(文件头)部分。</font></p>

<p><font size="2">至此,我们已经学到了哪些东东,先简要回顾一下</font><font
size="2" face="MS Sans Serif">:</font></p>

<ul>
    <li><font size="2" face="MS Sans Serif">DOS MZ header </font><font
        size="2">又命名为</font><font color="#CCFFCC"
        size="2"><b> </b></font><font color="#CCFFCC" size="2"
        face="MS Sans Serif"><b>IMAGE_DOS_HEADER</b></font><font
        size="2" face="MS Sans Serif">.</font><font size="2">。其中只有两个域比较重要</font><font
        size="2" face="MS Sans Serif">: </font><font
        color="#FFFFCC" size="2" face="MS Sans Serif"><b>e_magic</b></font><font
        size="2" face="MS Sans Serif"> </font><font size="2">包含字符串</font><font
        size="2" face="MS Sans Serif">&quot;MZ&quot;</font><font
        size="2">,</font><font color="#FFFFCC" size="2"
        face="MS Sans Serif"><b>e_lfanew</b></font><font size="2"
        face="MS Sans Serif"> </font><font size="2">包含</font><font
        size="2" face="MS Sans Serif">PE header</font><font
        size="2">在文件中的偏移量。</font></li>
    <li><font size="2">比较</font><font color="#FFFFCC"
        size="2" face="MS Sans Serif"><b>e_magic</b></font><font
        size="2" face="MS Sans Serif"> </font><font size="2">是否为</font><font
        color="#CCFFCC" size="2" face="MS Sans Serif"><b>IMAGE_DOS_SIGNATURE</b></font><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">DOS header</font><font
        size="2">。</font></li>
    <li><font size="2">为了定位</font><font size="2"
        face="MS Sans Serif">PE header</font><font size="2">,移动文件指针到</font><font
        color="#FFFFCC" size="2" face="MS Sans Serif"><b>e_lfanew</b></font><font
        size="2">所指向的偏移。</font></li>
    <li><font size="2" face="MS Sans Serif">PE header</font><font
        size="2">的第一个双字包含字符串</font><font
        size="2" face="MS Sans Serif">&quot;PE\0\0&quot;</font><font
        size="2">。该双字与</font><font color="#CCFFCC"
        size="2" face="MS Sans Serif"><b>IMAGE_NT_SIGNATURE</b></font><font
        size="2">比对,符合则认为</font><font size="2"
        face="MS Sans Serif">PE header</font><font size="2">有效。</font></li>
</ul>

<p><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 color="#CCFFCC" size="2"
face="MS Sans Serif"><b>IMAGE_NT_HEADERS</b></font><font size="2">。再来回忆一下这个结构。</font></p>

<blockquote>
    <p><font color="#999900" size="2" face="MS Sans Serif"><b>IMAGE_NT_HEADERS
    STRUCT <br>
    &nbsp;&nbsp;&nbsp; Signature dd ? <br>
    &nbsp;&nbsp;&nbsp; FileHeader IMAGE_FILE_HEADER <> <br>
    &nbsp;&nbsp;&nbsp; OptionalHeader IMAGE_OPTIONAL_HEADER32 <> <br>
    IMAGE_NT_HEADERS ENDS </b></font></p>
</blockquote>

<p><font color="#FFFFCC" size="2" face="MS Sans Serif"><b>Signature</b></font><font
size="2" face="MS Sans Serif"> PE</font><font size="2">标记,值为</font><font
size="2" face="MS Sans Serif">50h, 45h, 00h, 00h</font><font
size="2">(</font><font size="2" face="MS Sans Serif">PE\0\0</font><font
size="2">)。 <br>
</font><font color="#FFFFCC" size="2" face="MS Sans Serif"><b>FileHeader</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">文件物理分布的一般信息。<br>
</font><font color="#FFFFCC" size="2" face="MS Sans Serif"><b>OptionalHeader
</b></font><font size="2">该结构域包含了关于</font><font
size="2" face="MS Sans Serif">PE</font><font size="2">文件逻辑分布的信息。</font></p>

<p><font size="2">最有趣的东东在</font><font
color="#FFFFCC" size="2"><b> </b></font><font color="#FFFFCC"
size="2" face="MS Sans Serif"><b>OptionalHeader</b></font><font
size="2"> 里。不过,</font><font color="#FFFFCC" size="2"
face="MS Sans Serif"><b>FileHeader</b></font><font size="2"
face="MS Sans Serif"> </font><font size="2">里的一些域也很重要。本课我们将学习</font><font
color="#FFFFCC" size="2" face="MS Sans Serif"><b>FileHeader</b></font><font
color="#FFFFCC" size="2"><b>,</b></font><font size="2">下一课研究</font><font
color="#FFFFCC" size="2" face="MS Sans Serif"><b>OptionalHeader</b></font><font
size="2">。</font></p>

<p><font color="#009933" size="2" face="MS Sans Serif"><b>IMAGE_FILE_HEADER
STRUCT <br>
&nbsp;&nbsp;&nbsp; Machine WORD ? <br>
&nbsp;&nbsp;&nbsp; NumberOfSections WORD ? <br>
&nbsp;&nbsp;&nbsp; TimeDateStamp dd ? <br>
&nbsp;&nbsp;&nbsp; PointerToSymbolTable dd ? <br>
&nbsp;&nbsp;&nbsp; NumberOfSymbols dd ? <br>
&nbsp;&nbsp;&nbsp; SizeOfOptionalHeader WORD ? <br>
&nbsp;&nbsp;&nbsp; Characteristics WORD ? <br>
IMAGE_FILE_HEADER ENDS </b></font></p>

<table border="1" cellpadding="2">
    <tr>
        <th bgcolor="#006666"><font size="2" face="MS Sans Serif"><b>Field
        name</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>Machine</b></font></td>
        <td align="center" bgcolor="#006666"><font size="2">该文件运行所要求的</font><font
        size="2" face="MS Sans Serif">CPU</font><font size="2">。对于</font><font
        size="2" face="MS Sans Serif">Intel</font><font size="2">平台,该值是</font><font
        color="#CCFFCC" size="2" face="MS Sans Serif"><b>IMAGE_FILE_MACHINE_I386</b></font><font
        size="2" face="MS Sans Serif"> (14Ch)</font><font
        size="2">。我们尝试了</font><font size="2"
        face="MS Sans Serif">LUEVELSMEYER</font><font size="2">的</font><font
        size="2" face="MS Sans Serif">pe.txt</font><font size="2">声明的</font><font
        size="2" face="MS Sans Serif">14Dh</font><font size="2">和</font><font
        size="2" face="MS Sans Serif">14Eh</font><font size="2">,但</font><font
        size="2" face="MS Sans Serif">Windows</font><font
        size="2">不能正确执行。看起来,除了禁止程序执行之外,本域对我们来说用处不大。</font></td>
    </tr>
    <tr>
        <td align="center" bgcolor="#006666"><font size="2"
        face="MS Sans Serif"><b>NumberOfSections </b></font></td>
        <td align="center" bgcolor="#006666"><font size="2">文件的节数目。如果我们要在文件中增加或删除一个节,就需要修改这个值。</font></td>
    </tr>
    <tr>
        <td align="center" bgcolor="#006666"><font size="2"
        face="MS Sans Serif"><b>TimeDateStamp</b></font></td>
        <td align="center" bgcolor="#006666"><font size="2">文件创建日期和时间。我们不感兴趣。</font></td>
    </tr>
    <tr>
        <td align="center" bgcolor="#006666"><font size="2"
        face="MS Sans Serif"><b>PointerToSymbolTable</b></font></td>
        <td align="center" bgcolor="#006666"><font size="2">用于调试。</font></td>
    </tr>
    <tr>
        <td align="center" bgcolor="#006666"><font size="2"
        face="MS Sans Serif"><b>NumberOfSymbols</b></font></td>
        <td align="center" bgcolor="#006666"><font size="2">用于调试。</font></td>
    </tr>
    <tr>
        <td align="center" bgcolor="#006666"><font size="2"
        face="MS Sans Serif"><b>SizeOfOptionalHeader</b></font></td>
        <td align="center" bgcolor="#006666"><font size="2">指示紧随本结构之后的
        </font><font color="#FFFFCC" size="2"
        face="MS Sans Serif"><b>OptionalHeader</b></font><font
        size="2" face="MS Sans Serif"> </font><font size="2">结构大小,必须为有效值。</font></td>
    </tr>
    <tr>
        <td align="center" bgcolor="#006666"><font size="2"
        face="MS Sans Serif"><b>Characteristics</b></font></td>
        <td align="center" bgcolor="#006666"><font size="2">关于文件信息的标记,比如文件是</font><font
        size="2" face="MS Sans Serif">exe</font><font size="2">还是</font><font
        size="2" face="MS Sans Serif">dll</font><font size="2">。</font></td>
    </tr>
</table>

<p><font size="2">简言之,只有三个域对我们有一些用</font><font
size="2" face="MS Sans Serif">:</font><font color="#FFFFCC"
size="2" face="MS Sans Serif"><b> Machine</b></font><font
size="2" face="MS Sans Serif">, </font><font color="#FFFFCC"
size="2" face="MS Sans Serif"><b>NumberOfSections</b></font><font
size="2" face="MS Sans Serif"> </font><font size="2">和</font><font
size="2" face="MS Sans Serif"> </font><font color="#FFFFCC"
size="2" face="MS Sans Serif"><b>Characteristics</b></font><font
size="2">。通常不会改变</font><font size="2"
face="MS Sans Serif"> </font><font color="#FFFFCC" size="2"
face="MS Sans Serif"><b>Machine</b></font><font size="2"
face="MS Sans Serif"> </font><font size="2">和</font><font
color="#FFFFCC" size="2" face="MS Sans Serif"><b>Characteristics</b></font><font
size="2" face="MS Sans Serif"> </font><font size="2">的值,但如果要遍历节表就得使用</font><font
size="2" face="MS Sans Serif"> </font><font color="#FFFFCC"
size="2" face="MS Sans Serif"><b>NumberOfSections</b></font><font
color="#FFFFCC" size="2"><b>。</b></font><font size="2"
face="MS Sans Serif"><br>
</font><font size="2">为了更好阐述 </font><font
color="#FFFFCC" size="2" face="MS Sans Serif"><b>NumberOfSections
</b></font><font size="2">的用处,这里简要介绍一下节表。</font></p>

<p><font size="2">节表是一个结构数组,每个结构包含一个节的信息。因此若有</font><font
size="2" face="MS Sans Serif">3</font><font size="2">个节,数组就有</font><font
size="2" face="MS Sans Serif">3</font><font size="2">个成员。
我们需要</font><font color="#FFFFCC" size="2"
face="MS Sans Serif"><b>NumberOfSections</b></font><font size="2">值来了解该数组中到底有几个成员。</font><font
size="2" face="MS Sans Serif"> </font><font size="2">也许您会想检测结构中的全</font><font
size="2" face="MS Sans Serif">0</font><font size="2">成员起到同样效果。</font><font
size="2" face="MS Sans Serif">Windows</font><font size="2">确实采用了这种方法。为了证明这一点,可以增加</font><font
size="2" face="MS Sans Serif">NumberOfSections</font><font
size="2">的值,</font><font size="2" face="MS Sans Serif">Windows</font><font
size="2">仍然可以正常执行文件。据我们的观察,</font><font
size="2" face="MS Sans Serif">Windows</font><font size="2">读取</font><font
color="#FFFFCC" size="2" face="MS Sans Serif"><b>NumberOfSections</b></font><font
size="2">的值然后检查节表里的每个结构,如果找到一个全</font><font
size="2" face="MS Sans Serif">0</font><font size="2">结构就结束搜索,否则一直处理完</font><font
color="#FFFFCC" size="2" face="MS Sans Serif"><b>NumberOfSections</b></font><font
size="2">指定数目的结构。</font><font size="2"
face="MS Sans Serif"> </font><font size="2">为什么我们不能忽略</font><font
size="2" face="MS Sans Serif">NumberOfSections</font><font
size="2">的值</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">0</font><font size="2">结构结束。</font><font
size="2" face="MS Sans Serif">Thus there may be a situation where
the last array member is contiguous to the first section, without
empty space at all. Another reason has to do with bound imports.
The new-style binding puts the information immediately following
the section table's last structure array member. </font><font
size="2">因此您仍然需要</font><font size="2"
face="MS Sans Serif">NumberOfSections</font><font size="2">。</font></p>

<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 + -