📄 pe文件结构剖析.htm
字号:
<!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> </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> 大家都很清楚,了解可执行文件的结构有多么的重要,DOS下如此,Windows下也同样如此。如果你想加密程序,编写病毒等,了解PE文件结构必是不可缺少的。大家也可能见到很多这方面的资料,但都是从理论上解说一下,很少见到拿一个具体文件开刀的。这里,我就用前面“系列4”中的文件4.EXE为例来剖析一下PE文件格式,因时间关系,不可能一下子就写的很完善,如可行,以后再慢慢补来。<BR><BR>===============================================================
<BR> 对于本文件,红色外框将文件分成4个部分,各部分的内容是:<BR> Ⅰ
- 文件头;<BR> Ⅱ -
代码段;.text section<BR> Ⅲ -
引入表;.rdata section<BR> Ⅳ -
数据段;.data section<BR> <BR> 可以看出,每部分都有大量的垃圾数据,用绿色的叉号进行标注。<BR> <BR> <FONT
color=red>我们先从整体看一下文件的结构:(要结合PE剖析图来看)</FONT><BR> ----------------------------------------------------------<BR> 1、IMAGE_DOS_HEADER<BR>
虽然你这是Windows下的程序,但保不准别人会拿它到DOS下执行,当然肯定不是想象的结果啦。该文件头和DOS下可执行文件的文件头基本上是一样的,所以你也可以认为它是一个标准的DOS下的EXE文件,只不过程序执行的结果是显示一个错误信息:This
program cannot be run in DOS
mode.,意思是这是Windows下的程序,到Windows下用吧!<BR>
该结构的最后一个元素e_lfanew指示PE文件头的位置,是个重要的数据。<BR>
对本例,该元素位于文件偏移量是3C的位置,其值是000000B0。<BR> 2、dos下执行时的程序部分<BR> 3、dos执行时显示的错误信息<BR> 4、垃圾数据<BR> -----------------------------------------------------------<BR> 就是PE文件头啦,它是一个IMAGE_NT_HEADERS
STRUCT结构<BR> 5、PE文件标记,db
'PE',0,0<BR> 6、是一个IMAGE_FILE_HEADER结构<BR> 7、是一个IMAGE_OPTIONAL_HEADER结构<BR> 8、是一个IMAGE_DATA_DIRECTORY结构数组,共16项<BR> 9、是一个IMAGE_SECTION_HEADER结构数据,项数由结构6中
NumberOfSections 确定。<BR>
本例中位于偏移量B6处,其值是0003<BR> -------------------------------------------------------------<BR> 10、程序的代码部分,也就是.text
section的内容<BR> -------------------------------------------------------------<BR> 下面是.rdata
section的内容,注意这里的指针值都是“虚拟地址”,即在内存执行时的地址。<BR> <BR> 11、IDA
(Import Address
table)用来存放函数的地址值。加载器执行文件时会重写该部分内容,程序中调用dll中的函数就是通过这里转到函数的真正位置的。<BR> 12、是一个IMAGE_IMPORT_DESCRIPTOR结构数组,项数怎么定呢?<BR> 这么说吧,假如你的程序中要调用N个动态链接库中的函数,那么项数就是N+1,总后一项结构中的数据全0,表示结束。<BR> 本例中的程序仅调用Kernell32.dll中的函数,所以此处有两个这样的结构。<BR> 13、是一个IMAGE_THUNK_DATA结构数组,该结构实际就是一个DWORD值,每个DWORD值指示一个IMAGE_IMPORT_BY_NAME结构,反应程序要调用的函数名。最后一个DWORD值为0,表示结束。<BR> 14、数据,由12、13中的内容指定。<BR> <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 <FONT
color=green>;在文件中的偏移量是400H,大小200H(调整后的)</FONT><BR>Data Offset
= 00000800, Data Size = 00000200 <FONT
color=green>;在文件中的偏移量是800H,大小200H(调整后的)</FONT><BR><BR>Number
of Objects = 0003 (dec), Imagebase = 00400000h
<FONT
color=green>;section的个数是3,基地址是400000H</FONT><BR><BR>
<FONT color=red>Section
相对虚拟地址 在文件中的偏移量 调整后的大小
段属性标记</FONT><BR> Object01:
.text RVA: 00001000 Offset: 00000400
Size: 00000200 Flags: 60000020<BR> Object02:
.rdata RVA: 00002000 Offset: 00000600 Size:
00000200 Flags: 40000040<BR> Object03:
.data 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 + -