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

📄 chap8-1-7.htm.primary

📁 加密与解密,软件加密保护技术与解决方案,看雪文档!
💻 PRIMARY
📖 第 1 页 / 共 3 页
字号:
<html>
<head>
<title>Crack Tutorial</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link rel="stylesheet" href="style/css.css" type="text/css">
<link rel="stylesheet" href="../STYLE/Css.css" type="text/css">
</head>

<body bgcolor="white" text="#000000" link="#004080" vlink="#004080" background="../image/Back.gif">
<p><a href="../catalog.htm">目录</a>>>第8章</p>
<p align="center" class="shadow1Copy"><b class="p3">第8章 压缩与脱壳</b></p>
<table width="80%" border="0" cellspacing="0" cellpadding="3" align="center" bgcolor="#bcbcbc" bordercolor="#111111" class="shadow1">
  <tr> 
    <td class="shadow1" width="20%"> 
      <div align="center"><a href="Chap8-1.htm"><font color="#FFFFFF">第一节 PE文件格式</font></a></div>
    </td>
    <td class="shadow1" width="20%"> 
      <div align="center"><a href="Chap8-2.htm"><font color="#FFFFFF">第二节 认识脱壳</font></a></div>
    </td>
    <td class="shadow1" width="20%"> 
      <div align="center"><a href="Chap8-3-1.htm"><font color="#FFFFFF">第三节 自动脱壳</font></a></div>
    </td>
    <td class="shadow1" width="20%"> 
      <div align="center"><a href="Chap8-4.htm"><font color="#FFFFFF">第四节 手动脱壳</font></a></div>
    </td>
    <td class="shadow1" width="20%"> 
      <div align="center"><a href="Chap8-5.htm"><font color="#FFFFFF">第五节 脱壳高级篇</font></a></div>
    </td>
  </tr>
</table>
<p align="center"><span class="p9"><b>第一节 PE文件格式</b></span></p>
<table width="80%" border="1" align="center" bgcolor="#efefef" cellpadding="5" cellspacing="0" bordercolor="#111111">
  <tr> 
    <td>1、<a href="Chap8-1-1.htm">PE文件格式一览 </a></td>
    <td>2、<a href="Chap8-1-2.htm">检验PE文件的有效性 </a> </td>
    <td><span class="p9"><span class="p9">3、<span class="p9"><a href="Chap8-1-3.htm">File 
      Header(文件头)</a></span></span></span></td>
    <td>4、<a href="Chap8-1-4.htm">Optional Header</a></td>
  </tr>
  <tr> 
    <td>5、<a href="Chap8-1-5.htm">Section Table</a></td>
    <td>6、<a href="Chap8-1-6.htm">Import Table</a></td>
    <td>7、<a href="Chap8-1-7.htm">Export Table</a></td>
    <td>&nbsp;</td>
  </tr>
</table>
<h1 align=center><font color="#000000">PE教程7: Export Table(引出表)</font></h1>
<p><font face="MS Sans Serif" size="2" color="#000000">上一课我们已经学习了动态联接中关于引入表那部分知识,现在继续另外一部分,那就是引出表。</font></p>
<p><font size="2" color="#000000">下载 </font><font color="#000000"><a 
href="technology/pe-tut07.zip" 
style="TEXT-DECORATION: none"><font size=2><b>范例</b></font></a><font 
size=2>。</font></font></p>
<h3><font color="#000000">理论<font face="Arial, Helvetica, sans-serif">:</font></font></h3>
<p><font face="MS Sans Serif" size="2" color="#000000">当PE装载器执行一个程序,它将相关DLLs都装入该进程的地址空间。然后根据主程序的引入函数信息,查找相关DLLs中的真实函数地址来修正主程序。PE装载器搜寻的是DLLs中的引出函数。</font></p>
<p><font face="MS Sans Serif" size="2" color="#000000">DLL/EXE要引出一个函数给其他DLL/EXE使用,有两种实现方法: 
  通过函数名引出或者仅仅通过序数引出。比如某个DLL要引出名为"GetSysConfig"的函数,如果它以函数名引出,那么其他DLLs/EXEs若要调用这个函数,必须通过函数名,就是GetSysConfig。另外一个办法就是通过序数引出。什么是序数呢? 
  序数是唯一指定DLL中某个函数的16位数字,在所指向的DLL里是独一无二的。例如在上例中,DLL可以选择通过序数引出,假设是16,那么其他DLLs/EXEs若要调用这个函数必须以该值作为GetProcAddress调用参数。这就是所谓的仅仅靠序数引出。</font></p>
<p><font face="MS Sans Serif" size="2" color="#000000">我们不提倡仅仅通过序数引出函数这种方法,这会带来DLL维护上的问题。一旦DLL升级/修改,程序员无法改变函数的序数,否则调用该DLL的其他程序都将无法工作。</font></p>
<p><font face="MS Sans Serif" size="2" color="#000000">现在我们开始学习引出结构。象引出表一样,可以通过数据目录找到引出表的位置。这儿,引出表是数据目录的第一个成员,又可称为IMAGE_EXPORT_DIRECTORY。该结构中共有11 
  个成员,常用的列于下表。</font></p>
<table border=1 cellpadding=2>
  <tbody> 
  <tr> 
    <th bgcolor=#006666><font face="MS Sans Serif" size="2" color="#FFFFFF"><b>Field 
      Name</b></font></th>
    <th bgcolor=#006666><font face="MS Sans Serif" size="2" color="#FFFFFF">Meaning</font></th>
  </tr>
  <tr> 
    <td align=middle bgcolor=#006666><font face="MS Sans Serif" size="2" color="#FFFFFF"><b>nName</b></font></td>
    <td align=middle bgcolor=#006666><font face="MS Sans Serif" size="2" color="#FFFFFF">模块的真实名称。本域是必须的,因为文件名可能会改变。这种情况下,PE装载器将使用这个内部名字。</font></td>
  </tr>
  <tr> 
    <td align=middle bgcolor=#006666><font face="MS Sans Serif" size="2" color="#FFFFFF"><b>nBase</b></font></td>
    <td align=middle bgcolor=#006666><font face="MS Sans Serif" size="2" color="#FFFFFF">基数,加上序数就是函数地址数组的索引值了。</font></td>
  </tr>
  <tr> 
    <td align=middle bgcolor=#006666><font face="MS Sans Serif" size="2" color="#FFFFFF"><b>NumberOfFunctions</b></font></td>
    <td align=middle bgcolor=#006666><font face="MS Sans Serif" size="2" color="#FFFFFF">模块引出的函数/符号总数。</font></td>
  </tr>
  <tr> 
    <td align=middle bgcolor=#006666><font face="MS Sans Serif" size="2" color="#FFFFFF"><b>NumberOfNames</b></font></td>
    <td align=middle bgcolor=#006666><font face="MS Sans Serif" size="2" color="#FFFFFF">通过名字引出的函数/符号数目。该值<b>不是</b>模块引出的函数/符号总数</font><font color="#FFFFFF">,这是由上面的<font face="MS Sans Serif" 
      size=2><b>NumberOfFunctions</b></font></font><font face="MS Sans Serif" size="2" color="#FFFFFF">给出。本域可以为0,表示模块可能仅仅通过序数引出。如果模块根本不引出任何函数/符号,那么数据目录中引出表的RVA为0。</font></td>
  </tr>
  <tr> 
    <td align=middle bgcolor=#006666><font face="MS Sans Serif" size="2" color="#FFFFFF"><b>AddressOfFunctions</b></font></td>
    <td align=middle bgcolor=#006666><font face="MS Sans Serif" size="2" color="#FFFFFF">模块中有一个指向所有函数/符号的RVAs数组,本域就是指向该RVAs数组的RVA。简言之,模块中所有函数的RVAs都保存在一个数组里,本域就指向这个数组的首地址。</font></td>
  </tr>
  <tr> 
    <td align=middle bgcolor=#006666><font face="MS Sans Serif" size="2" color="#FFFFFF"><b>AddressOfNames</b></font></td>
    <td align=middle bgcolor=#006666><font face="MS Sans Serif" size="2" color="#FFFFFF">类似上个域,模块中有一个指向所有函数名的RVAs数组,本域就是指向该RVAs数组的RVA。</font></td>
  </tr>
  <tr> 
    <td align=middle bgcolor=#006666><font face="MS Sans Serif" size="2" color="#FFFFFF"><b>AddressOfNameOrdinals</b></font></td>
    <td align=middle bgcolor=#006666><font face="MS Sans Serif" size="2" color="#FFFFFF">RVA,指向包含上述 
      AddressOfNames数组中相关函数之序数的16位数组。</font></td>
  </tr>
  </tbody> 
</table>
<p><font face="MS Sans Serif" size="2" color="#000000">上面也许无法让您完全理解引出表,下面的简述将助您一臂之力。</font></p>
<p><font face="MS Sans Serif" size="2" color="#000000">引出表的设计是为了方便PE装载器工作。首先,模块必须保存所有引出函数的地址以供PE装载器查询。模块将这些信息保存在<b>AddressOfFunctions</b>域指向的数组中,而数组元素数目存放在<b>NumberOfFunctions</b>域中。 
  因此,如果模块引出40个函数,则<b>AddressOfFunctions</b>指向的数组必定有40个元素,而<b>NumberOfFunctions</b>值为40。现在如果有一些函数是通过名字引出的,那么模块必定也在文件中保留了这些信息。这些 
  名字的RVAs存放在一数组中以供PE装载器查询。该数组由<b>AddressOfNames</b>指向,<b>NumberOfNames</b>包含名字数目。考虑一下PE装载器的工作机制,它知道函数名,并想以此获取这些函数的地址。至今为止,模块已有两个模块: 
  名字数组和地址数组,但两者之间还没有联系的纽带。因此我们还需要一些联系函数名及其地址的东东。PE参考指出使用到地址数组的索引作为联接,因此PE装载器在名字数组中找到匹配名字的同时,它也获取了<b> 
  指向地址表中对应元素的索引</b>。 而这些索引保存在由<b>AddressOfNameOrdinals</b>域指向的另一个数组(最后一个)中。由于该数组是起了联系名字和地址的作用,所以其元素数目必定和名字数组相同,比如,每个名字有且仅有一个相关地址,反过来则不一定: 
  每个地址可以有好几个名字来对应。因此我们给同一个地址取"别名"。为了起到连接作用,名字数组和索引数组必须并行地成对使用,譬如,索引数组的第一个元素必定含有第一个名字的索引,以此类推。 
  </font></p>
<table border=0 cellpadding=2>
  <tbody> 
  <tr> 
    <th bgcolor=#006666><font face="MS Sans Serif" size="2" color="#FFFFFF">AddressOfNames</font></th>
    <th><font color="#FFFFFF"> </font></th>
    <th bgcolor=#006666><font face="MS Sans Serif" size="2" color="#FFFFFF">AddressOfNameOrdinals</font></th>
  </tr>
  <tr> 
    <td align=middle><font face="MS Sans Serif" size=2>|</font> </td>
    <td align=middle> </td>
    <td align=middle><font face="MS Sans Serif" size=2>|</font> </td>
  </tr>
  <tr> 
    <td align=middle> 
      <table border=1 cellpadding=2>
        <tbody> 
        <tr> 
          <td align=middle bgcolor=#660066><font face="MS Sans Serif" size="2" color="#FFFFFF">RVA 
            of Name 1</font></td>
        </tr>
        <tr> 
          <td align=middle bgcolor=#660066><font face="MS Sans Serif" size="2" color="#FFFFFF">RVA 
            of Name 2</font></td>
        </tr>
        <tr> 
          <td align=middle bgcolor=#660066><font face="MS Sans Serif" size="2" color="#FFFFFF">RVA 
            of Name 3</font></td>
        </tr>
        <tr> 
          <td align=middle bgcolor=#660066><font face="MS Sans Serif" size="2" color="#FFFFFF">RVA 
            of Name 4</font></td>
        </tr>
        <tr> 
          <td align=middle bgcolor=#660066><font face="MS Sans Serif" size="2" color="#FFFFFF">...</font> 
          </td>
        </tr>
        <tr> 
          <td align=middle bgcolor=#660066><font face="MS Sans Serif" size="2" color="#FFFFFF">RVA 
            of Name N</font></td>
        </tr>
        </tbody> 
      </table>
    </td>
    <td align=middle> 
      <table border=0 cellpadding=2>
        <tbody> 
        <tr> 
          <td align=middle><font face="MS Sans Serif" 
          size=2>&lt;--&gt;</font></td>
        </tr>
        <tr> 
          <td align=middle><font face="MS Sans Serif" 
          size=2>&lt;--&gt;</font></td>
        </tr>
        <tr> 
          <td align=middle><font face="MS Sans Serif" 
          size=2>&lt;--&gt;</font></td>
        </tr>
        <tr> 
          <td align=middle><font face="MS Sans Serif" 
          size=2>&lt;--&gt;</font></td>
        </tr>
        <tr> 
          <td align=middle><font face="MS Sans Serif" size=2>...</font> </td>
        </tr>
        <tr> 
          <td align=middle><font face="MS Sans Serif" 
          size=2>&lt;--&gt;</font></td>
        </tr>
        </tbody> 
      </table>
    </td>
    <td align=middle> 
      <table border=1 cellpadding=2>
        <tbody> 
        <tr> 
          <td align=middle bgcolor=#003300><font face="MS Sans Serif" size="2" color="#FFFFFF">Index 
            of Name 1</font></td>
        </tr>
        <tr> 
          <td align=middle bgcolor=#003300><font face="MS Sans Serif" size="2" color="#FFFFFF">Index 
            of Name 2</font></td>
        </tr>
        <tr> 
          <td align=middle bgcolor=#003300><font face="MS Sans Serif" size="2" color="#FFFFFF">Index 
            of Name 3</font></td>
        </tr>
        <tr> 
          <td align=middle bgcolor=#003300><font face="MS Sans Serif" size="2" color="#FFFFFF">Index 
            of Name 4</font></td>
        </tr>
        <tr> 
          <td align=middle bgcolor=#003300><font face="MS Sans Serif" size="2" color="#FFFFFF">...</font> 
          </td>
        </tr>
        <tr> 
          <td align=middle bgcolor=#003300><font face="MS Sans Serif" size="2" color="#FFFFFF">Index 
            of Name N</font></td>
        </tr>
        </tbody> 
      </table>
    </td>
  </tr>
  </tbody> 
</table>
<p><font face="MS Sans Serif" size="2" color="#000000">下面举一两个例子说明问题。如果我们有了引出函数名并想以此获取地址,可以这么做:</font></p>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -