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

📄 pe文件结构剖析.htm

📁 C++北航内部教学
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0047)http://www.ddvip.net/program/masm/index3/15.htm -->
<HTML><HEAD><TITLE>PE文件结构剖析</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312"><LINK 
href="PE文件结构剖析.files/css.css" type=text/css rel=stylesheet>
<STYLE type=text/css>.style1 {
	COLOR: #0000ff
}
</STYLE>

<SCRIPT language=JavaScript>
function GetContentWnd(){ return parent; }
function OnSave(){	
				var oWnd = GetContentWnd();
				window.external.addFavorite( oWnd.location.href, oWnd.document.title );
			}
</SCRIPT>

<META content="MSHTML 6.00.2800.1400" name=GENERATOR></HEAD>
<BODY leftMargin=0 topMargin=5 marginheight="5">
<TABLE cellSpacing=0 cellPadding=0 width=750 align=center border=0>
  <TBODY>
  <TR>
    <TD colSpan=8>
      <TABLE cellSpacing=0 cellPadding=0 width=750 align=center border=0>
        <TBODY>
        <TR>
          <TD vAlign=top align=right height=30><A class=a01 
            href="http://www.ddvip.net/">主站首页 </A><SPAN class=point1>●</SPAN> <A 
            href="http://vip.ddvip.net/"><FONT color=#ff0000>视频下载 
            </FONT></A><SPAN class=point1>●</SPAN> <A class=a01 
            href="http://book.ddvip.net/">书籍下载 </A><SPAN class=point1>●</SPAN> 
            <A class=a01 href="http://soft.ddvip.net/">软件下载 </A><SPAN 
            class=point1>●</SPAN> <A class=a01 href="http://bbs.ddvip.net/">论坛交流 
            </A><SPAN class=point1>●</SPAN> <A class=a01 
            href="http://yl.ddvip.net/">综合娱乐 </A><SPAN class=point1>●</SPAN> <A 
            class=a01 href="http://www.ddvip.net/search.asp">站内搜索 </A><SPAN 
            class=point1>●</SPAN> <A class=a01 
            href="http://www.ddvip.net/map.asp">网站地图</A></TD></TR></TBODY></TABLE></TD></TR>
  <TR align=middle bgColor=#0066ff>
    <TD colSpan=8 height=80>
      <OBJECT 
      codeBase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0 
      height=80 width=750 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000><PARAM NAME="movie" VALUE="../../images/ad.swf"><PARAM NAME="quality" VALUE="high">
                        <embed src="../../images/ad.swf" quality="high" 
      pluginspage="http://www.macromedia.com/go/getflashplayer" 
      type="application/x-shockwave-flash" width="750" height="80"></embed>    
      </OBJECT></TD></TR>
  <TR>
    <TD align=left width=85 height=30><IMG height=30 
      src="PE文件结构剖析.files/teachonline.gif" width=85></TD>
    <TD align=left width=85><A href="javascript:OnSave();"><IMG height=30 
      src="PE文件结构剖析.files/add.gif" width=85 border=0></A></TD>
    <TD vAlign=top align=right width=8><IMG height=8 
      src="PE文件结构剖析.files/bg3-1.gif" width=8></TD>
    <TD vAlign=bottom align=left width=8 bgColor=#cbe6fe height=30><IMG 
      height=8 src="PE文件结构剖析.files/bg4-1.gif" width=8></TD>
    <TD class="style1 menu" width=448 bgColor=#cbe6fe height=30>
      <MARQUEE>豆豆技术网----中国最大的计算机教程网,伴你学习,助你成长的良师益友!</MARQUEE></TD>
    <TD vAlign=bottom align=middle width=8 bgColor=#cbe6fe><IMG height=8 
      src="PE文件结构剖析.files/bg4-2.gif" width=8></TD>
    <TD vAlign=top align=left width=8><IMG height=8 
      src="PE文件结构剖析.files/bg3-2.gif" width=8></TD>
    <TD width=100><A href="http://www.ddvip.net/program/masm/index3.asp"><IMG 
      height=30 src="PE文件结构剖析.files/pre.gif" width=100 border=0></A></TD></TR>
  <TR>
    <TD colSpan=8>
      <TABLE cellSpacing=0 cellPadding=0 width=750 border=0>
        <TBODY>
        <TR>
          <TD vAlign=center align=middle height=50><STRONG 
            class=f16>PE文件结构剖析</STRONG></TD></TR>
        <TR>
          <TD>
            <TABLE cellSpacing=0 cellPadding=0 width=740 align=right border=0>
              <TBODY>
              <TR>
                <TD width=100 height=20>&nbsp;</TD>
                <TD class=top vAlign=bottom align=middle width=620 
                  height=30>作者: 怜香 更新人:legume 来源:AoGo汇编小站 更新时间:2004-05-18 投稿信箱: 
                  tg*ddvip.com </TD>
                <TD vAlign=center align=right width=20 height=30><IMG 
                  height=30 src="PE文件结构剖析.files/bg1.gif" width=20></TD></TR>
              <TR>
                <TD width=720 colSpan=2></TD>
                <TD width=20 background=PE文件结构剖析.files/bg2.htm></TD></TR>
              <TR>
                <TD align=left width=720 colSpan=2>
                  <P align=left> </P>
                  <P>   <FONT 
                  color=red>本部分内容:/文件解说/PE剖析图/W32dasm反汇编参考/PE剖析中所用结构参考</FONT><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;大家都很清楚,了解可执行文件的结构有多么的重要,DOS下如此,Windows下也同样如此。如果你想加密程序,编写病毒等,了解PE文件结构必是不可缺少的。大家也可能见到很多这方面的资料,但都是从理论上解说一下,很少见到拿一个具体文件开刀的。这里,我就用前面“系列4”中的文件4.EXE为例来剖析一下PE文件格式,因时间关系,不可能一下子就写的很完善,如可行,以后再慢慢补来。<BR><BR>===============================================================&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp;&nbsp;对于本文件,红色外框将文件分成4个部分,各部分的内容是:<BR>&nbsp;&nbsp;&nbsp;&nbsp;Ⅰ 
                  - 文件头;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Ⅱ - 
                  代码段;.text&nbsp;&nbsp;section<BR>&nbsp;&nbsp;&nbsp;&nbsp;Ⅲ - 
                  引入表;.rdata section<BR>&nbsp;&nbsp;&nbsp;&nbsp;Ⅳ - 
                  数据段;.data&nbsp;&nbsp;section<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;可以看出,每部分都有大量的垃圾数据,用绿色的叉号进行标注。<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<FONT 
                  color=red>我们先从整体看一下文件的结构:(要结合PE剖析图来看)</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;----------------------------------------------------------<BR>&nbsp;&nbsp;&nbsp;&nbsp;1、IMAGE_DOS_HEADER<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  虽然你这是Windows下的程序,但保不准别人会拿它到DOS下执行,当然肯定不是想象的结果啦。该文件头和DOS下可执行文件的文件头基本上是一样的,所以你也可以认为它是一个标准的DOS下的EXE文件,只不过程序执行的结果是显示一个错误信息:This 
                  program cannot be run in DOS 
                  mode.,意思是这是Windows下的程序,到Windows下用吧!<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  该结构的最后一个元素e_lfanew指示PE文件头的位置,是个重要的数据。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  对本例,该元素位于文件偏移量是3C的位置,其值是000000B0。<BR>&nbsp;&nbsp;&nbsp;&nbsp;2、dos下执行时的程序部分<BR>&nbsp;&nbsp;&nbsp;&nbsp;3、dos执行时显示的错误信息<BR>&nbsp;&nbsp;&nbsp;&nbsp;4、垃圾数据<BR>&nbsp;&nbsp;&nbsp;&nbsp;-----------------------------------------------------------<BR>&nbsp;&nbsp;&nbsp;&nbsp;就是PE文件头啦,它是一个IMAGE_NT_HEADERS 
                  STRUCT结构<BR>&nbsp;&nbsp;&nbsp;&nbsp;5、PE文件标记,db 
                  'PE',0,0<BR>&nbsp;&nbsp;&nbsp;&nbsp;6、是一个IMAGE_FILE_HEADER结构<BR>&nbsp;&nbsp;&nbsp;&nbsp;7、是一个IMAGE_OPTIONAL_HEADER结构<BR>&nbsp;&nbsp;&nbsp;&nbsp;8、是一个IMAGE_DATA_DIRECTORY结构数组,共16项<BR>&nbsp;&nbsp;&nbsp;&nbsp;9、是一个IMAGE_SECTION_HEADER结构数据,项数由结构6中 
                  NumberOfSections 确定。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  本例中位于偏移量B6处,其值是0003<BR>&nbsp;&nbsp;&nbsp;&nbsp;-------------------------------------------------------------<BR>&nbsp;&nbsp;&nbsp;&nbsp;10、程序的代码部分,也就是.text 
                  section的内容<BR>&nbsp;&nbsp;&nbsp;&nbsp;-------------------------------------------------------------<BR>&nbsp;&nbsp;&nbsp;&nbsp;下面是.rdata 
                  section的内容,注意这里的指针值都是“虚拟地址”,即在内存执行时的地址。<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;11、IDA 
                  (Import Address 
                  table)用来存放函数的地址值。加载器执行文件时会重写该部分内容,程序中调用dll中的函数就是通过这里转到函数的真正位置的。<BR>&nbsp;&nbsp;&nbsp;&nbsp;12、是一个IMAGE_IMPORT_DESCRIPTOR结构数组,项数怎么定呢?<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这么说吧,假如你的程序中要调用N个动态链接库中的函数,那么项数就是N+1,总后一项结构中的数据全0,表示结束。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本例中的程序仅调用Kernell32.dll中的函数,所以此处有两个这样的结构。<BR>&nbsp;&nbsp;&nbsp;&nbsp;13、是一个IMAGE_THUNK_DATA结构数组,该结构实际就是一个DWORD值,每个DWORD值指示一个IMAGE_IMPORT_BY_NAME结构,反应程序要调用的函数名。最后一个DWORD值为0,表示结束。<BR>&nbsp;&nbsp;&nbsp;&nbsp;14、数据,由12、13中的内容指定。<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>==============================================================<BR><FONT 
                  color=red>下面是用UltraEdit打开4.exe后的抓图(处理)</FONT><BR><BR>若下面没图,点这里,可能还要刷新。<BR><BR>==============================================================<BR>下面是用W32dasm反汇编4.exe后的详细内容,供参考:<BR>Disassembly 
                  of File: 4.exe<BR>Code Offset = 00000400, Code Size = 
                  00000200&nbsp;&nbsp;&nbsp;&nbsp; <FONT 
                  color=green>;在文件中的偏移量是400H,大小200H(调整后的)</FONT><BR>Data Offset 
                  = 00000800, Data Size = 00000200&nbsp;&nbsp;&nbsp;&nbsp; <FONT 
                  color=green>;在文件中的偏移量是800H,大小200H(调整后的)</FONT><BR><BR>Number 
                  of Objects = 0003 (dec), Imagebase = 00400000h&nbsp;&nbsp; 
                  <FONT 
                  color=green>;section的个数是3,基地址是400000H</FONT><BR><BR>&nbsp;&nbsp; 
                  <FONT color=red>Section&nbsp;&nbsp; 
                  相对虚拟地址&nbsp;&nbsp;&nbsp;&nbsp;在文件中的偏移量&nbsp;&nbsp;调整后的大小&nbsp;&nbsp;&nbsp;&nbsp; 
                  段属性标记</FONT><BR>&nbsp;&nbsp; Object01: 
                  .text&nbsp;&nbsp;&nbsp;&nbsp;RVA: 00001000 Offset: 00000400 
                  Size: 00000200 Flags: 60000020<BR>&nbsp;&nbsp; Object02: 
                  .rdata&nbsp;&nbsp; RVA: 00002000 Offset: 00000600 Size: 
                  00000200 Flags: 40000040<BR>&nbsp;&nbsp; Object03: 
                  .data&nbsp;&nbsp;&nbsp;&nbsp;RVA: 00003000 Offset: 00000800 
                  Size: 00000200 Flags: C0000040<BR><BR>+++++++++++++++++++ 
                  IMPORTED FUNCTIONS ++++++++++++++++++<BR>Number of Imported 

⌨️ 快捷键说明

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